【问题标题】:Dynamic resizing of JMenu after adding items at runtime在运行时添加项目后动态调整 JMenu 的大小
【发布时间】:2021-11-11 16:20:43
【问题描述】:

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

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

另请注意 - 选择复选框时,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());
        }
    }
}

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

【问题讨论】:

  • 我以前用过摇摆。当时也有问题。 revalidate() 应该可以解决问题,但我想说这样的用例不是菜单的用途吗?为什么不对动态组件使用对话框?
  • 不幸的是,这些方法都没有帮助,行为保持不变。我不能强制 menuitem 列表增长。我同意这不是您常用的菜单用例,但我的要求是模仿其他程序并保持 ui 尽可能相似。
  • 您有一个可能导致问题的自定义菜单项 UI。
  • @camickr 感谢您的建议。我检查了它并从我的复选框中删除了 doClick 覆盖(我认为这就是你所指的)。尽管如此,即使它的所有组件都是普通的旧摇摆对象,JMenu 的行为也是相同的——我使用添加到 JMenu 的 JButton 来触发滑块的可见性变化。

标签: java swing user-interface


【解决方案1】:

隐藏和重新显示弹出菜单会导致它被调整大小:

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

【讨论】:

  • 像魅力一样工作!谢谢!
【解决方案2】:
猜你喜欢
  • 2012-10-17
  • 2011-02-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多