Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/383.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java-选择菜单中的所有项目_Java_Swing - Fatal编程技术网

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

Java-选择菜单中的所有项目,java,swing,Java,Swing,我正在使用javax.swing库,我试图解决这个问题: 我有一个菜单栏,我在其中创建了JMenu,这个菜单有JCheckBoxMenuItem项。像这样: //creating objects: jMenuBar = new javax.swing.JMenuBar(); jMenuAlgorithms = new javax.swing.JMenu(); jCheckBoxSPEA = new javax.swing.JCheckBoxMenuItem(); jCheckBoxNSGAII

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

我有一个
菜单栏
,我在其中创建了
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
item,我想选择分隔符上方的所有项目。如果他选择了
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循环,因为菜单项不是
数组
Iterable

好的,只是为了测试,我做了一些非常愚蠢的事情(下面的代码)-我通过菜单中的所有项目,如果项目是复选框,我复制它,将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);
           } 
        }
    }

}            
private void jCheckBoxMenuEnableAllMouseClicked(java.awt.event.MouseEvent evt){
if(jCheckBoxMenuEnableAll.isSelected()){
对于(int i=0;i
  • 我想这就是你要找的。
    • 另见: 返回包含此菜单子菜单的菜单元素数组 组成部分。如果弹出菜单为空,则返回空数组。这种方法 需要符合MenuElement接口。请注意,由于 JSeparators不符合MenuElement接口,此数组 将仅包含JMenuItems

import java.awt.*;
导入java.util.array;
导入java.util.stream.stream;
导入javax.swing.*;
公共类MenuSubElementsTest{
公共JComponent makeUI(){
JMenu jMenuAlgorithms=新JMenu(“菜单算法”);
JMenuItem jCheckBoxMenuEnableAll=新的JMenuItem(“全部启用”);
jCheckBoxMenuEnableAll.addActionListener(e->{
对于(MenuElement me:jMenuAlgorithms.getPopupMenu().getSubElements()){
System.out.println(“debug1:+me.getClass().getName());
if(JCheckBoxMenuItem的me实例){
((JCheckBoxMenuItem)me).setSelected(true);
}
}
//或者:getJCheckBoxMenuItem(jMenuAlgorithms).forEach(r->r.setSelected(true));
});
JMenuItem jCheckBoxMenuDisableAll=新的JMenuItem(“全部禁用”);
jCheckBoxMenuDisableAll.addActionListener(e->{
getJCheckBoxMenuItem(jMenuAlgorithms).forEach(r->r.setSelected(false));
});
add(新的JCheckBoxMenuItem(“SPEA”,true));
add(新的JCheckBoxMenuItem(“NSGAII”,true));
jMenuAlgorithms.addSeparator();
add(jCheckBoxMenuEnableAll);
add(jCheckBoxMenuDisableAll);
JMenuBar JMenuBar=新的JMenuBar();
add(jMenuBar算法);
JPanel p=newjpanel(newborderlayout());
p、 添加(jMenuBar,BorderLayout.NORTH);
返回p;
}
私有静态流getJCheckBoxMenuItem(MenuElement p){
Class clz=JCheckBoxMenuItem.Class;
返回流(p).filter(clz::isInstance).map(clz::cast);
}
//公共静态流(MenuElement p){
//返回Arrays.stream(p.getSubElements())
//.map(MenuSubElementsTest::stream).reduce(stream.of(p),stream::concat);
//   }
公共静态流(MenuElement p){
返回Stream.concat(Stream.of(p),Arrays.Stream(p.getSubElements())
.peek(me->System.out.println(“debug2:+me.getClass().getName()))
.flatMap(MenuSubElementsTest::stream));
}
公共静态void main(字符串…参数){
EventQueue.invokeLater(()->{
JFrame f=新的JFrame();
f、 setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
f、 getContentPane().add(新的menusublementsTest().makeUI());
f、 设置大小(320240);
f、 setLocationRelativeTo(空);
f、 setVisible(真);
});
}
}

要更快获得更好的帮助,请发布或。
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);
    });
  }
}