java - 首次单击后如何在弹出菜单中显示整个多行文本

标签 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)

最佳答案

例如,您可以简单地使用 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

关于java - 首次单击后如何在弹出菜单中显示整个多行文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27989593/

相关文章:

java - JPanel GridBagLayout

java - 隐藏面板时丢失 JDialog 标题 (Java)

java - BufferedImage.getGraphics() 导致内存泄漏,有解决办法吗?

java - 在Maven中测试运行

java - 为什么这个 java 字符串例程不打印答案?

java - 如何将我的 Activity 背景设为白色?

java - 如何从 JTextArea 创建公共(public)字符串?

java - 如何使 Jlist 中的一个条目与另一个 JList 中的条目一起使用?

java - 在 libGDX 中获取表中 Actor 的舞台坐标

java - 从哪儿开始?具有多个前端的 Java 应用程序