java - 在运行时添加项目后动态调整 JMenu 的大小

标签 java swing user-interface

如标题所示,以编程方式添加组件时,我很难让 JMenu 调整大小。在我的应用程序中,我需要带有 JCheckBoxes 的 JMenu。每当我勾选其中之一时,JSlider 就会出现在下面。下面是实现这一点的代码。我遇到的问题是,当有很多可见的 slider 时,JMenu 中的项目会聚集在一起 - 请参见下图。

如何强制 JMenu 重绘/调整大小/扩展以保留原始复选框/ slider 高度?

另请注意 - 选择复选框时 JMenu 始终保持可见。仅当我在其外部单击时它才会关闭。但在这样的“重新启动”菜单增长之后,问题就不再存在。

非常感谢!

public class Window extends JFrame implements ActionListener {
    private JPanel panel;
    private JMenuBar menuBar;
    private JMenu menu;
    private JSlider slider1;
    private JCheckBoxMenuItem checkBox1;
    private JCheckBoxMenuItem checkBox2;
    private JCheckBoxMenuItem checkBox3;

    public Window() {
        super("Example");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setMinimumSize(new Dimension(300,300));

        panel = new JPanel();
        panel.setMinimumSize(new Dimension(300,300));

        menuBar = new JMenuBar();
        menu = new JMenu("Options");

        checkBox1 = new JCheckBoxMenuItem("option 1");
        checkBox2 = new JCheckBoxMenuItem("option 2");
        checkBox3 = new JCheckBoxMenuItem("option 3");

        checkBox1.addActionListener(this);
        //prevent JMenu from closing after selecting CheckBox
        checkBox1.setUI(new BasicCheckBoxMenuItemUI() {
            @Override
            protected void doClick(MenuSelectionManager msm) {
                checkBox1.doClick(0);
            }
        });

        slider1 = new JSlider();
        slider1.setVisible(false);

        menu.add(checkBox1);
        menu.add(slider1);
        menu.add(checkBox2);
        menu.add(checkBox3);
        menuBar.add(menu);
        setJMenuBar(menuBar);
        add(panel);
        setVisible(true);
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        if (e.getSource().equals(checkBox1)) {
            slider1.setVisible(checkBox1.isSelected());
        }
    }
}

这是我的主应用程序的屏幕:

Clumped items

最佳答案

隐藏并重新显示弹出菜单将导致其大小调整:

@Override
public void actionPerformed(ActionEvent e) {
    if (e.getSource().equals(checkBox1)) {
        slider1.setVisible(checkBox1.isSelected());
        menu.setPopupMenuVisible(false);
        menu.setPopupMenuVisible(true);
    }
}

关于java - 在运行时添加项目后动态调整 JMenu 的大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69212399/

相关文章:

java - 如何在WebLogic 8中使用线程池?

java - 为什么这两种类型不同?

Java 在 Mac OS X 中最大化或全屏窗口后停止捕获鼠标移动事件

user-interface - 为什么在 Visual Studio Coded UI 测试中编辑 UIMap.designer.cs 文件不好?

java - 如何使用三个点和两个 vector 计算平面方程?

java - 带 <?> 或不带 <?> 的泛型实例

java - 如何在不延迟界面的情况下延迟 gui 的操作?

java - 可扩展组件以隐藏或取消隐藏另一个组件

c# - 是否可以在 Java 项目中使用 .Net GUI?

Java Swing - 如何从另一个 JPanel 访问一个 JPanel 的 JComponent,两者都添加到 JFrame?