如何在第一次单击后在弹出菜单中显示整个多行文本

时间:2015-01-16 17:35:36

标签: java swing

我在弹出菜单和多行文字方面遇到了一些麻烦。第一次显示弹出菜单时,只显示第一行。这是第一次点击后的样子

Popup menu after first click

并在第二次点击后

enter image description here

如何在第一次点击后显示整个文字?

我尝试验证,无效,重新验证和重新绘制各种组件。我甚至尝试pack the ancestor window(当时弹出菜单的内容是动态的,我认为这导致了问题)。如果我使用多行JLabel(使用html内容),它的行为方式相同。

编辑:更多研究

文本组件的首选大小可能是错误的。在首次显示弹出菜单之前,首选高度为21.显示后显示为51.因此它会根据错误的首选大小显示。 有预先计算首选尺寸的方法吗?

我将问题归结为以下最小的例子:

public class PopupMenuFail extends JFrame {

    public PopupMenuFail() {
        final JTextPane text = new JTextPane();
        text.setText("Some text long enough to be split into several lines.");
        text.setMaximumSize(new Dimension(150, 1000)); // limit the width

        final JPopupMenu popupMenu = new JPopupMenu();
        popupMenu.add(text);

        final JButton button = new JButton();
        button.setAction(new AbstractAction("Click me") {
            @Override
            public void actionPerformed(ActionEvent e) {
                popupMenu.show(button, 0, button.getHeight());
            }
        });
        add(button);
    }

    private static void createAndShowGUI() {
        JFrame frame = new PopupMenuFail();
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        frame.pack();
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        javax.swing.SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                createAndShowGUI();
            }
        });
    }
}

我正在运行64位Linux,

# java -version
java version "1.7.0_72"
Java(TM) SE Runtime Environment (build 1.7.0_72-b14)
Java HotSpot(TM) 64-Bit Server VM (build 24.72-b04, mixed mode)

1 个答案:

答案 0 :(得分:0)

您可以使用popupMenu.setPopupSize(500, 500)为JPopupMenu设置默认的最小尺寸,这样就行了。

但是,如果您要创建菜单,则应检查JMenuJMenuItem

http://docs.oracle.com/javase/7/docs/api/javax/swing/JMenu.html http://docs.oracle.com/javase/7/docs/api/javax/swing/JMenuItem.html