Java 我应该扩展Swing JCheckBox吗?

Java 我应该扩展Swing JCheckBox吗?,java,swing,jcheckbox,Java,Swing,Jcheckbox,我有一个带有多个JCheckbox的Swing应用程序。每个JCheckBox对应于我程序中其他地方的Foo类型的另一个对象。对于每个类型为Foo的对象,我将有一个jcheckbox供用户单击(它告诉Foo对象它们是否应该显示在UI上) 我目前正在使用JCheckBox上的name属性作为Foo对象的字符串“name”的引用。我觉得一个更干净的解决方案是扩展JCheckBox向它添加一个额外的字段,这样JCheckBox就可以通过简单地存储对它的引用来跟踪它所连接的Foo对象。思想?人们是否定期

我有一个带有多个JCheckbox的Swing应用程序。每个
JCheckBox
对应于我程序中其他地方的
Foo
类型的另一个对象。对于每个类型为
Foo
的对象,我将有一个jcheckbox供用户单击(它告诉Foo对象它们是否应该显示在UI上)


我目前正在使用
JCheckBox
上的name属性作为
Foo
对象的字符串“name”的引用。我觉得一个更干净的解决方案是扩展
JCheckBox
向它添加一个额外的字段,这样
JCheckBox
就可以通过简单地存储对它的引用来跟踪它所连接的Foo对象。思想?人们是否定期扩展Swing组件,以便将控制器/视图中的零件链接回模型?我会遇到什么可怕的陷阱吗?

这是一个常见的要求,你可以非常随意地
JCheckbox
将a扩展到某个
JFooCheckBox
中,其中包含Foo对象,侦听器应该负责Foo的显示/隐藏

如果没有额外的细节,很难了解这个特定示例的全貌。您可以使用操作来完成此任务。有关更多详细信息,请参阅。以下是一个例子:

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.event.*;
import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintStream;
import java.util.ArrayList;
import java.util.List;

import javax.swing.*;

public class CheckBoxDemo {

    static class Foo {
        private boolean visible;
        private String name;

        public Foo(String name) {
            this.name = name;
        }

        public boolean isVisible() {
            return visible;
        }

        public void setVisible(boolean visible) {
            this.visible = visible;
            System.out.println(getName() + ".setVisible:" + visible);
        }

        public String getName() {
            return name;
        }
    }

    static class FooAction extends AbstractAction {
        private Foo foo;

        public FooAction(Foo foo) {
            super(foo.getName());
            this.foo = foo;
        }

        @Override
        public void actionPerformed(ActionEvent e) {
            JCheckBox checkBox = (JCheckBox) e.getSource();
            foo.setVisible(checkBox.isSelected());
        }
    }

    private static void createAndShowGUI() {
        List<Foo> fooList = new ArrayList<Foo>();
        fooList.add(new Foo("Foo1"));
        fooList.add(new Foo("Foo2"));
        fooList.add(new Foo("Foo3"));

        JPanel content = new JPanel(new BorderLayout());

        JPanel fooPanel = new JPanel();
        for (Foo foo : fooList) {
            fooPanel.add(new JCheckBox(new FooAction(foo)));
        }

        content.add(fooPanel, BorderLayout.NORTH);

        final JTextArea textArea = new JTextArea();
        textArea.setEditable(false);
        JScrollPane scrollPane = new JScrollPane(textArea);
        scrollPane.setPreferredSize(new Dimension(200, 200));
        content.add(scrollPane, BorderLayout.CENTER);

        JFrame frame = new JFrame("CheckBoxDemo");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(content);

        frame.pack();
        frame.setLocationByPlatform(true);
        frame.setVisible(true);

        // just for brevity of example
        System.setOut(new PrintStream(new OutputStream() {
            @Override
            public void write(int b) throws IOException {
                textArea.append(String.valueOf((char) b));
            }
        }));
    }

    public static void main(String[] args) {
        javax.swing.SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                createAndShowGUI();
            }
        });
    }
}
导入java.awt.BorderLayout;
导入java.awt.Dimension;
导入java.awt.event.*;
导入java.io.IOException;
导入java.io.OutputStream;
导入java.io.PrintStream;
导入java.util.ArrayList;
导入java.util.List;
导入javax.swing.*;
公共类CheckBoxDemo{
静态类Foo{
私有布尔可见;
私有字符串名称;
公共Foo(字符串名称){
this.name=名称;
}
公共布尔值可见(){
返回可见;
}
公共void集合可见(布尔可见){
可见的;可见的;
System.out.println(getName()+”.setVisible:“+可见);
}
公共字符串getName(){
返回名称;
}
}
静态类FooAction扩展了AbstractAction{
私人富福;
公共食品行动(食品){
super(foo.getName());
this.foo=foo;
}
@凌驾
已执行的公共无效操作(操作事件e){
JCheckBox checkBox=(JCheckBox)e.getSource();
setVisible(checkBox.isSelected());
}
}
私有静态void createAndShowGUI(){
List-dunist=新建ArrayList();
添加(新Foo(“Foo1”);
添加(新Foo(“Foo2”);
添加(新Foo(“Foo3”);
JPanel content=newjpanel(newborderlayout());
JPanel fooPanel=新的JPanel();
对于(Foo-Foo:傻瓜){
添加(新JCheckBox(新FooAction(foo));
}
添加(fooPanel,BorderLayout.NORTH);
最终JTextArea textArea=新JTextArea();
textArea.setEditable(false);
JScrollPane scrollPane=新的JScrollPane(textArea);
scrollPane.setPreferredSize(新维度(200200));
添加(滚动窗格,BorderLayout.CENTER);
JFrame=新JFrame(“CheckBoxDemo”);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
框架。添加(内容);
frame.pack();
frame.setLocationByPlatform(真);
frame.setVisible(true);
//只是为了举例说明
系统放样(新打印流(新输出流)(){
@凌驾
公共无效写入(int b)引发IOException{
extarea.append(String.valueOf((char)b));
}
}));
}
公共静态void main(字符串[]args){
javax.swing.SwingUtilities.invokeLater(新的Runnable(){
公开募捐{
createAndShowGUI();
}
});
}
}
一般规则是不要出于应用程序的原因扩展JSomething:它们被设计为按原样使用


您的上下文听起来像一个绑定场景@马克斯建议(使用动作作为绑定代理)指向后续的方向,对于更复杂的要求,您可能会考虑使用绑定框架(如JooDead或BeTeBeNeS绑定)

OK,所以您应该说,我应该使用该动作来跟踪JCHECKBOX和FO对象之间的连接。因此,该操作知道JCheckBox及其表示的Foo对象,当JCheckBox的状态更改时,它可以相应地更改Foo对象的状态。