Rah*_*thy 5 java layout swing jeditorpane
我有一个JEditorPane显示在弹出窗口内,通过按钮触发.窗格包含长文本,因此它嵌套在a中JScrollPane,弹出窗口的最大大小限制为300 x 100:
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);
}
});
}
Run Code Online (Sandbox Code Playgroud)
当JEditorPane第一次显示实例时(即单击按钮一次),它似乎报告了一个太小的首选高度(1):

在后续按钮单击后,布局正是人们所期望的(2):

如何强制/强加一个合适的首选大小,以便它总是像(2)一样初始化?
fin*_*nnw 11
的JEditorPane不能计算它的最终宽度优选和同时高度,它必须知道一个才可以计算另一个.
在第一遍时,JEditorPane基于其宽度将无限制的假设计算其首选高度,因此它返回单行的高度(因为文本不包含换行符.)
在第二遍中,宽度已经设置(受第一遍的约束JPopupMenu),现在它知道最大宽度,它可以计算它需要多高.
因此,最简单的解决方案是在设置文本时将宽度设置为最大值.
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.setSize(300, Integer.MAX_VALUE);
editorPane.setEditable(false);
Run Code Online (Sandbox Code Playgroud)
不要担心它太大,它仍然会缩小以适应内容(如果你将文本更改为,你会看到"Hello, World!".
| 归档时间: |
|
| 查看次数: |
7834 次 |
| 最近记录: |