Java - 选择菜单中的所有项目



我正在使用javax.swing库,我尝试解决这个问题:

我有一个MenuBar,我在其中创建了JMenu,此菜单包含JCheckBoxMenuItem项。喜欢这个:

//creating objects:
jMenuBar = new javax.swing.JMenuBar();
jMenuAlgorithms = new javax.swing.JMenu();
jCheckBoxSPEA = new javax.swing.JCheckBoxMenuItem();
jCheckBoxNSGAII = new javax.swing.JCheckBoxMenuItem();
jSeparator1 = new javax.swing.JPopupMenu.Separator();
jCheckBoxMenuEnableAll = new javax.swing.JCheckBoxMenuItem();
jCheckBoxMenuDisableAll = new javax.swing.JCheckBoxMenuItem();
//settings and putting them together:
jCheckBoxSPEA.setSelected(true);
jCheckBoxSPEA.setText("SPEA");
jMenuAlgorithms.add(jCheckBoxSPEA);
jCheckBoxNSGAII.setSelected(true);
jCheckBoxNSGAII.setText("NSGAII");
jMenuAlgorithms.add(jCheckBoxNSGAII);
jMenuAlgorithms.add(jSeparator1);
jCheckBoxMenuEnableAll.setSelected(true);
jCheckBoxMenuEnableAll.setText("Enable all");
jCheckBoxMenuEnableAll.addMouseListener(new java.awt.event.MouseAdapter() {
public void mouseClicked(java.awt.event.MouseEvent evt) {
jCheckBoxMenuEnableAllMouseClicked(evt);
}
});
jMenuAlgorithms.add(jCheckBoxMenuEnableAll);
jCheckBoxMenuDisableAll.setText("Disable all");
jMenuAlgorithms.add(jCheckBoxMenuDisableAll);
jMenuBar.add(jMenuAlgorithms);

如果用户选择jCheckBoxMenuEnableAll项,我想选择分隔符上方的所有项。如果他选择jCheckBoxMenuDisableAll,我想取消选择分隔符上方的所有项目。

如您所见,我已将mouseClicked操作添加到jCheckBoxMenuEnableAll项。现在,我想做这样的事情:

private void jCheckBoxMenuEnableAllMouseClicked(java.awt.event.MouseEvent evt) {  
for(JCheckBoxMenuItem item : jMenuAlgorithms){
item.setSelected(true);
} 
//deselect then jCheckBoxMenuDisableAll, it's not essential for instance
}

但显然,我不能像这样做 for 循环,因为菜单项不是arrayIterable

好吧,只是为了测试,我做了一些非常愚蠢的事情(下面的代码) - 我传递菜单中的所有项目,如果该项目是一个复选框,我制作它的副本,将 ist 值设置为"true"(已选择),然后用它的副本替换原始项目。 很愚蠢,我知道,我绝对不想这样做, 但是,我没有找到其他方法。我只是想看看这是否有效。我以为它应该,但它不起作用。我做错了什么?非常感谢您的时间。

private void jCheckBoxMenuEnableAllMouseClicked(java.awt.event.MouseEvent evt) {                                                    
if(jCheckBoxMenuEnableAll.isSelected()){
for(int i =0; i< jMenuAlgorithms.getItemCount(); i++){ //for all items in the menu, separators included
if(jMenuAlgorithms.getItem(i) instanceof JCheckBoxMenuItem){
JCheckBoxMenuItem item = ((JCheckBoxMenuItem)jMenuAlgorithms.getItem(i));
item.setSelected(true);
jMenuAlgorithms.insert(item, i);
} 
}
}
}            
  • 我认为JPopupMenu#getSubElements()就是你要找的。
    • 参见:JMenu#getSubElements()

      返回包含此菜单的子菜单的 MenuElements 数组 元件。如果弹出菜单为 null,则返回一个空数组。此方法 是必需的,以符合菜单元素接口。请注意,由于 JSeparator 不符合 MenuElement 接口,此数组 将仅包含 JMenuItems。

import java.awt.*;
import java.util.Arrays;
import java.util.stream.Stream;
import javax.swing.*;
public class MenuSubElementsTest {
public JComponent makeUI() {
JMenu jMenuAlgorithms = new JMenu("MenuAlgorithms");
JMenuItem jCheckBoxMenuEnableAll = new JMenuItem("Enable all");
jCheckBoxMenuEnableAll.addActionListener(e -> {
for (MenuElement me: jMenuAlgorithms.getPopupMenu().getSubElements()) {
System.out.println("debug1: " + me.getClass().getName());
if (me instanceof JCheckBoxMenuItem) {
((JCheckBoxMenuItem) me).setSelected(true);
}
}
//or: getJCheckBoxMenuItem(jMenuAlgorithms).forEach(r -> r.setSelected(true));
});
JMenuItem jCheckBoxMenuDisableAll = new JMenuItem("Disable all");
jCheckBoxMenuDisableAll.addActionListener(e -> {
getJCheckBoxMenuItem(jMenuAlgorithms).forEach(r -> r.setSelected(false));
});
jMenuAlgorithms.add(new JCheckBoxMenuItem("SPEA", true));
jMenuAlgorithms.add(new JCheckBoxMenuItem("NSGAII", true));
jMenuAlgorithms.addSeparator();
jMenuAlgorithms.add(jCheckBoxMenuEnableAll);
jMenuAlgorithms.add(jCheckBoxMenuDisableAll);
JMenuBar jMenuBar = new JMenuBar();
jMenuBar.add(jMenuAlgorithms);
JPanel p = new JPanel(new BorderLayout());
p.add(jMenuBar, BorderLayout.NORTH);
return p;
}
private static Stream<JCheckBoxMenuItem> getJCheckBoxMenuItem(MenuElement p) {
Class<JCheckBoxMenuItem> clz = JCheckBoxMenuItem.class;
return stream(p).filter(clz::isInstance).map(clz::cast);
}
//   public static Stream<MenuElement> stream(MenuElement p) {
//     return Arrays.stream(p.getSubElements())
//       .map(MenuSubElementsTest::stream).reduce(Stream.of(p), Stream::concat);
//   }
public static Stream<MenuElement> stream(MenuElement p) {
return Stream.concat(Stream.of(p), Arrays.stream(p.getSubElements())
.peek(me -> System.out.println("debug2: " + me.getClass().getName()))
.flatMap(MenuSubElementsTest::stream));
}
public static void main(String... args) {
EventQueue.invokeLater(() -> {
JFrame f = new JFrame();
f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
f.getContentPane().add(new MenuSubElementsTest().makeUI());
f.setSize(320, 240);
f.setLocationRelativeTo(null);
f.setVisible(true);
});
}
}

最新更新