У меня есть JEditorPane
, который отображается внутри всплывающего окна, запускаемого через кнопку. Панель содержит длинный текст, поэтому он вложен в JScrollPane
, и всплывающий ограничивается до максимального размера 300 х 100:Управление предпочтительным размером JEditorPane с длинным текстом
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
String text = "Potentially looooooong text. " +
"Lorem ipsum dolor sit amet, consectetuer" +
"adipiscing elit, sed diam nonummy nibh euismod " +
"tincidunt ut laoreet dolore magna aliquam" +
"adipiscing elit, sed diam nonummy nibh euismod" +
"erat volutpat. Ut wisi enim ad minim veniam, " +
"quis nostrud exerci tation.";
final JEditorPane editorPane = new JEditorPane("text/html", text);
editorPane.setEditable(false);
final JButton button = new JButton("Trigger Popup");
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
JPopupMenu popup = new JPopupMenu();
popup.setLayout(new BorderLayout());
popup.add(new JScrollPane(editorPane));
Dimension d = popup.getPreferredSize();
int w = Math.min(300, d.width);
int h = Math.min(100, d.height);
popup.setPopupSize(w, h);
Dimension s = button.getSize();
popup.show(button, s.width/2, s.height/2);
}
});
JFrame f = new JFrame("Layout Demo");
f.setSize(200, 200);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setLocationRelativeTo(null);
f.getContentPane().add(button);
f.setVisible(true);
}
});
}
Когда экземпляр JEditorPane
показан в первый раз (то есть, когда кнопка щелкнул один раз) это как-то, кажется, сообщить предпочтительную высоту, которая слишком мало (1):
После последующих нажатий кнопок, макет просто, как можно было бы ожидать, что она (2):
Как я могу применять/ввести надлежащий предпочтительный размер, так что бы всегда инициализировать как (2)?
@finnw:. Отличное объяснение и обходные - Спасибо большое! – netzwerg
Отличное решение, +1! Хотя это было немного времени, у меня есть еще один хороший вопрос для вас. Я пробовал такой же подход с JTextPane, это не что иное, как подкласс JEditorPane, Я пытаюсь углубиться (BasicTextUI), чтобы понять, где разница. Но, может быть, вы уже это знаете? :-) – AgostinoX