2015-12-30 15 views
1

我的代碼是這樣的:如何獲取JScrollPane內部(可更改)組件的完整大小?

JFrame frame = new JFrame(); 

JPanel panel = new JPanel(); 

JTextPane text = new JTextPane(); 
text.setPreferredSize(new Dimension(200,260)); 
text.setContentType("text/html"); 
text.setEditable(false); 
text.setText("some random thing makes this pane bigger than its perferred size"); 

JScrollPane scroll = new JScrollPane(text); 

panel.add(scroll); 

frame.add(panel); 
frame.setVisible(true); 
frame.pack(); 
frame.validate(); 

我的問題是我不知道如何讓JTextPane(在文本這裏)的實際大小。我已經嘗試了所有getSizes & getVisibleRectsscroll.getViewport().getViewSize() ......但他們都返回[200,260]。有人可以幫我解決這個問題嗎?我非常感謝您提供的任何幫助。

編輯:我發現了問題:進行了驗證框架前被處決我getSizes請求。 我可運行測試代碼:

import java.awt.Dimension; 

import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JScrollPane; 
import javax.swing.JTextPane; 

public class Abcd { 

public static void main(String[] args) { 
    // TODO Auto-generated method stub 
    JFrame frame = new JFrame(); 

    JPanel panel = new JPanel(); 

    JTextPane text = new JTextPane(); 
    text.setPreferredSize(new Dimension(150,126)); 
    text.setContentType("text/html"); 
    text.setEditable(false); 

    //Alicia Vikander's photo. She's cute anw. 
    String tmp = "<a href=\"https://upload.wikimedia.org/wikipedia/commons/thumb/b/b2/Alicia_Vikander.jpg/220px-Alicia_Vikander.jpg\"><img src=\"https://upload.wikimedia.org/wikipedia/commons/thumb/b/b2/Alicia_Vikander.jpg/220px-Alicia_Vikander.jpg\"/></a>"; 
    //text.setText("asdf fssdfsdf sfdsdf sd sdf sfasdf fssdfsdf sfdsdf sd sdf sfasdf fssdfsdf sfdsdf sd sdf sfasdf fssdfsdf sfdsdf sd sdf sfasdf fssdfsdf sfdsdf sd sdf sfasdf fssdfsdf sfdsdf sd sdf sfasdf fssdfsdf sfdsdf sd sdf sfasdf fssdfsdf sfdsdf sd sdf sfasdf fssdfsdf sfdsdf sd sdf sfasdf fssdfsdf sfdsdf sd sdf sfasdf fssdfsdf sfdsdf sd sdf sfasdf fssdfsdf sfdsdf sd sdf sfasdf fssdfsdf sfdsdf sd sdf sf"); 
    text.setText(tmp); 
    JScrollPane scroll = new JScrollPane(text); 
    scroll.setPreferredSize(new Dimension(150,126)); 

    panel.add(scroll); 

    frame.add(panel); 
    frame.setVisible(true); 
    frame.pack(); 
    frame.validate(); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

    for (double i = 0; i < 1000; i = i + 0.0001){ 
     System.out.print(text.getHeight()+"\n");    
     if (text.getHeight()!=123){ //3 pixels for the scrollpane's border i guessed 
      System.out.print("i = "+i+", height = "+text.getHeight()); 
      break; 
     } 
    } 
} 

在我的電腦i大約是50 - 100。因此,我的新的問題是:是否有反正我可以,只要我可以,但仍然確保幀被驗證得到realsize ? 非常感謝。

+0

你測試的規模實際上並沒有改變當我運行它時,「文本」的大小,而不是隻是換行。我把你的測試文本乘以50,然後它改變了大小,'text.getSize()'相應地改變了它的輸出 – phflack

+0

',但它們都返回了[200,260]。 '不要使用'setPreferredSize()'方法。 – camickr

+0

謝謝大家。我終於可以找出爲什麼他們返回'[200,260]'而不是實際大小:'getSizes'請求在幀被驗證之前完成。 我已經編輯了這個問題,把我的可運行示例(原來的那個比較微薄,我的錯誤)。我現在的問題是如何確保當框架已經過驗證時我可以獲得大小。 再次感謝您的幫助。 –

回答

0

我強烈建議你開始使用不同的Layout managers

如果我tweek你的代碼中:

JFrame frame = new JFrame(); 

final JTextPane text = new JTextPane(); 
text.setContentType("text/html"); 
text.setEditable(false); 
text.setText("some random thing makes this pane bigger than its perferred size"); 

final JScrollPane scroll = new JScrollPane(text); 
scroll.addComponentListener(new ComponentAdapter() { 
     @Override 
     public void componentResized(ComponentEvent e) { 
      System.out.println("Size of JScrollPane is: " + scroll.getSize()); 
      System.out.println("Size of JTextPane is: " + text.getSize()); 
     } 
}); 

frame.setLayout(new BorderLayout()); 
frame.add(scroll,BorderLayout.CENTER); 
frame.pack(); 
frame.setVisible(true); 

我們將有滾動元件的尺寸調用其scroll.getSize()和文本組件調用它text.getSize()

+0

我編輯了我的帖子(我的舊帖子太微薄了,我的錯誤)。那是我新的(真正的)問題。希望你能幫我解決它。再次感謝您的幫助 –

+0

@ HaM.1無法真正瞭解您的循環???,此外,您堅持不使用佈局管理器....(請考慮使用它),因爲如果組件重新變化,大小可能會有所不同大小,我會使用一個ComponentListener作爲例子,以瞭解他們有什麼大小... –

+0

我使用'for'循環而不是timertask或其他東西來顯示結果的時間變化。我使用的代碼實際上正在運行,並且大小確實發生了變化,但'for'循環向我展示了當框架仍在驗證時我的下一行被執行。最終的結果應該是'height = 283',但是我只能在索引運行到50或者時才能得到它('123'是沒有文本的原始高度)。我試過使用佈局管理器,但它沒有太大的幫助,所以我沒有把它放入示例代碼中。 –

相關問題