【发布时间】:2016-04-04 17:52:22
【问题描述】:
我的代码是这样的:
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 和getVisibleRects,scroll.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。所以我的新问题是:无论如何我可以尽快获得实际尺寸,但仍确保框架经过验证?
非常感谢。
【问题讨论】:
-
当我运行它时,您的测试实际上并没有改变
text的大小,而只是换行。我将你的测试文本乘以 50,然后它改变了大小,text.getSize()相应地改变了它的输出 -
but they're all returning [200,260].不要使用setPreferredSize()方法。 -
谢谢大家。我终于可以找出为什么它们返回
[200,260]而不是实际大小:getSizes请求是在验证框架之前完成的。我已经编辑了这个问题,放了我的可运行示例(原来的示例有点微薄,我的错误)。我现在的问题是如何确保我可以在框架已经验证时获得尺寸。再次感谢您的帮助。
标签: java size components jscrollpane