Java中的对象分组
在Java core SE中有没有方法对对象进行分组 就像我有多个jbutton、jlabel和其他对象一样,我希望将它们的可见性设置为false并使用函数启用 我可以将这些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);
组件。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想要做的。想要避免;但是现在我不能给它添加组件了。非常感谢。我只需要找到集合类。是否可以将新组件动态添加到此列表中?如有的话,详情为何