Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.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_Netbeans_Swingx - Fatal编程技术网

Java中的对象分组

Java中的对象分组,java,swing,netbeans,swingx,Java,Swing,Netbeans,Swingx,在Java core SE中有没有方法对对象进行分组 就像我有多个jbutton、jlabel和其他对象一样,我希望将它们的可见性设置为false并使用函数启用 我可以将这些Java对象分组为一个单元,这样就不必像这样编写每个组件。setVisibility(true) 例如,我有这样一个例子: private void hideDashboard() { someButton1.setVisible(false); someButton2.setVisible(false);

在Java core SE中有没有方法对对象进行分组

就像我有多个jbutton、jlabel和其他对象一样,我希望将它们的可见性设置为false并使用函数启用

我可以将这些Java对象分组为一个单元,这样就不必像这样编写每个
组件。setVisibility(true)

例如,我有这样一个例子:

private void hideDashboard() {
    someButton1.setVisible(false);
    someButton2.setVisible(false);
    someButton3.setVisible(false);
    someButton4.setVisible(false);
    someLabel.setVisible(false);
}

我没有使用任何外部软件包。对于IDE,我正在使用Netbeans 8.2,一个选项是将它们存储在集合中,因为它们都是JComponent对象

Collection components=newarraylist(Arrays.asList(button1、button2、button3、button4、button5));
components.forEach(component->component.setVisible(false));

我认为在HTML中显示/隐藏元素时可以使用相同的方法。您可以使用父元素(例如div)包装它们,并使用CSS显示/隐藏它们(例如display:none)


与Java一样,如果我没有弄错的话,如果您将子面板添加到父面板并显示/隐藏父面板,则子面板也将简单地显示/隐藏。

还有一些其他选项:

  • 如果您只想使某些组件不可见,可以将它们添加到
    CardLayout
    中,面板包含所有组件和一个空白组件
  • 如果您想对
    容器
    (例如
    JComponent
    )及其所有子
    组件
    应用一个操作,那么您可以制作一个递归例程来实现这一点(实际上,显然不需要递归,但在我看来,这会有一个更明显的代码)
  • 第一个选项的代码:

    import java.awt.BorderLayout;
    import java.awt.CardLayout;
    import javax.swing.JButton;
    import javax.swing.JCheckBox;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.JTextArea;
    
    public class Grouping1 {
    
        public static void main(final String[] args) {
            final JPanel buttons = new JPanel();
            for (int i = 0; i < 3; ++i)
                buttons.add(new JButton("Does nothing " + i));
    
            final JPanel internal = new JPanel(new BorderLayout());
            internal.add(new JTextArea("1234567890.\n0987654321."), BorderLayout.CENTER);
            internal.add(buttons, BorderLayout.LINE_END);
    
            final CardLayout clm = new CardLayout();
            final JPanel clp = new JPanel(clm);
    
            final JCheckBox enable = new JCheckBox("Click me", true);
            enable.addActionListener(e -> clm.show(clp, enable.isSelected()? "FILLED": "BLANK"));
    
            clp.add(internal, "FILLED");
            clp.add(new JPanel(), "BLANK");
    
            clm.show(clp, "FILLED");
    
            final JPanel contents = new JPanel(new BorderLayout());
            contents.add(clp, BorderLayout.CENTER);
            contents.add(enable, BorderLayout.PAGE_START);
    
            final JFrame frame = new JFrame("Components");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.getContentPane().add(contents);
            frame.pack();
            frame.setLocationRelativeTo(null);
            frame.setVisible(true);
        }
    }
    
    导入java.awt.BorderLayout;
    导入java.awt.CardLayout;
    导入javax.swing.JButton;
    导入javax.swing.JCheckBox;
    导入javax.swing.JFrame;
    导入javax.swing.JPanel;
    导入javax.swing.JTextArea;
    公共类分组1{
    公共静态void main(最终字符串[]args){
    最终JPanel按钮=新JPanel();
    对于(int i=0;i<3;++i)
    添加(新的JButton(“不做任何事情”+i));
    final JPanel internal=new JPanel(new BorderLayout());
    添加(新的JTextArea(“1234567890.\n0987654321”)、BorderLayout.CENTER;
    内部。添加(按钮、边框布局、线条结束);
    最终CardLayout clm=新的CardLayout();
    最终JPanel clp=新JPanel(clm);
    最终JCheckBox enable=新的JCheckBox(“单击我”,true);
    enable.addActionListener(e->clm.show(clp,enable.isSelected()?“FILLED”:“BLANK”);
    中电加(内部,“填写”);
    clp.add(新JPanel(),“空白”);
    clm.show(clp,“已填写”);
    最终JPanel内容=新JPanel(新BorderLayout());
    目录。添加(clp、BorderLayout.CENTER);
    contents.add(启用,BorderLayout.PAGE_START);
    最终JFrame=新JFrame(“组件”);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.getContentPane().add(内容);
    frame.pack();
    frame.setLocationRelativeTo(空);
    frame.setVisible(true);
    }
    }
    
    第二个选项的名称和代码:

    import java.awt.BorderLayout;
    import java.awt.Component;
    import java.awt.Container;
    import java.util.function.Consumer;
    import javax.swing.JButton;
    import javax.swing.JCheckBox;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.JTextArea;
    
    public class Grouping2 {
    
        public static void applyRecursively(final Container container,
                                            final Consumer<Component> consumer) {
            for (final Component child: container.getComponents())
                if (child instanceof Container)
                    applyRecursively((Container) child, consumer);
                else
                    consumer.accept(child);
            consumer.accept(container);
        }
    
        public static void main(final String[] args) {
            final JPanel buttons = new JPanel();
            for (int i = 0; i < 3; ++i)
                buttons.add(new JButton("Does nothing " + i));
    
            final JPanel internal = new JPanel(new BorderLayout());
            internal.add(new JTextArea("1234567890.\n0987654321."), BorderLayout.CENTER);
            internal.add(buttons, BorderLayout.LINE_END);
    
            final JCheckBox enable = new JCheckBox("Click me", true);
            enable.addActionListener(e -> applyRecursively(internal, c -> c.setEnabled(enable.isSelected())));
    
            final JPanel contents = new JPanel(new BorderLayout());
            contents.add(internal, BorderLayout.CENTER);
            contents.add(enable, BorderLayout.PAGE_START);
    
            final JFrame frame = new JFrame("Components");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.getContentPane().add(contents);
            frame.pack();
            frame.setLocationRelativeTo(null);
            frame.setVisible(true);
        }
    }
    
    导入java.awt.BorderLayout;
    导入java.awt.Component;
    导入java.awt.Container;
    导入java.util.function.Consumer;
    导入javax.swing.JButton;
    导入javax.swing.JCheckBox;
    导入javax.swing.JFrame;
    导入javax.swing.JPanel;
    导入javax.swing.JTextArea;
    公共类分组2{
    公共静态无效应用(最终容器,
    最终消费者){
    for(最后一个子组件:container.getComponents())
    if(容器的子实例)
    应用安全((容器)子项、消费者);
    其他的
    消费者接受(儿童);
    消费者接受(容器);
    }
    公共静态void main(最终字符串[]args){
    最终JPanel按钮=新JPanel();
    对于(int i=0;i<3;++i)
    添加(新的JButton(“不做任何事情”+i));
    final JPanel internal=new JPanel(new BorderLayout());
    添加(新的JTextArea(“1234567890.\n0987654321”)、BorderLayout.CENTER;
    内部。添加(按钮、边框布局、线条结束);
    最终JCheckBox enable=新的JCheckBox(“单击我”,true);
    enable.addActionListener(e->applyRecursive(内部,c->c.setEnabled(enable.isSelected()));
    最终JPanel内容=新JPanel(新BorderLayout());
    添加(内部、边框布局、中心);
    contents.add(启用,BorderLayout.PAGE_START);
    最终JFrame=新JFrame(“组件”);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.getContentPane().add(内容);
    frame.pack();
    frame.setLocationRelativeTo(空);
    frame.setVisible(true);
    }
    }
    
    在这两种代码中,只需单击“单击我”复选框即可切换组件的状态


    但在我看来,最准确的答案可能是Jason's,它可以让你对你可以自由选择的组件进行分组。拥有自己的
    组件的
    集合
    可以让您对它们应用操作,而不必位于同一GUI区域(如我的第一个代码中),也不必将操作应用于容器的所有子级(如我的第二个代码中)。我想这取决于您的需要。

    您可以将它们放入一个集合(例如
    列出仪表板组件
    ),对每个元素进行迭代并调用
    setVisible(false)
    。您也可以将它们放在各自单独的JPanel上并隐藏/显示该面板。
    数组。asList
    已经返回了一个列表。我们不需要将它包装在
    新的ArrayList(…)
    中,除非我们以后想修改该列表。是的,这就是我假设OP想要做的。想要避免;但是现在我不能给它添加组件了。非常感谢。我只需要找到集合类。是否可以将新组件动态添加到此列表中?如有的话,详情为何