【发布时间】: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