Мой код выглядит так:Как получить полный размер (изменяемого) компонента внутри 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
& getVisibleRects
, scroll.getViewport().getViewSize()
... но все они возвращаются [200,260]
. Может ли кто-нибудь помочь мне решить эту проблему? Я очень ценю любую помощь, которую вы можете предоставить.
EDIT: Я выяснил проблему: Мои запросы 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 как только я могу, но все-таки убедитесь, что рама проверена ? Большое спасибо.
Ваш тест не был на самом деле меняется размер 'text', когда я его запускал, вместо этого он просто переносился на новую строку. Я умножил ваш тестовый текст на 50, а затем изменил размер, и 'text.getSize()' изменил его вывод соответственно – phflack
', но все они возвращаются [200, 260]. 'Не используйте метод setPreferredSize(). – camickr
Спасибо всем, ребята. Я мог бы наконец выяснить, почему они были возвращены '[200,260]' вместо реального размера: Запросы 'getSizes' были выполнены до того, как кадр был проверен. Я отредактировал вопрос, поставив свой исполняемый пример (оригинальный был немного скуден, моя ошибка). Моя проблема теперь в том, как убедиться, что я могу получить размер, когда кадр уже был проверен. Еще раз спасибо за помощь. –