5

我有一个JEditorPane显示在弹出窗口中,通过按钮触发。窗格包含长文本,因此它嵌套在 aJScrollPane中,并且弹出窗口的最大尺寸为 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);
        }
    });
}

JEditorPane第一次显示实例时(即单击一次按钮时),它似乎以某种方式报告了一个太小(1)的首选高度:

第一次调用

在随后的按钮点击之后,布局就是人们所期望的(2)

随后的调用

如何强制/施加适当的首选大小,使其始终像 (2) 一样初始化?

4

1 回答 1

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);

不要担心让它太大,它仍然会缩小以适应内容(如果您将文本更改为"Hello, World!".

于 2010-02-08T13:03:44.527 回答