用于Swing的WindowBuilder制作成员数据,似乎没必要

H2O*_*aCl 2 java swing windowbuilder

WindowBuilder for Swing将复选框创建为局部变量,将文本框创建为成员数据.这种不一致困扰着我.因为无论如何它都被链接到顶层JFrame,只要JFrame有对它们的引用,这些小部件肯定会存在,因此似乎不需要将文本框作为成员数据.在我看来,文本框应该像复选框一样是本地人.当地人的封装效果更好.本地引用可能会死于WindowBuilder生成的GUI对象(扩展JFrame的类)构造函数的末尾,而JFrame仍然会引用所有小部件.

使它们成为本地并将"最终"放在这些窗口小部件声明的前面,以便它们可以在事件处理程序的匿名内部类中使用,这是使它们工作所需的.我还必须重新排列顺序,因为文本框的实例化顺序无关紧要,如果它们都被声明为成员.顺序对本地人很重要,所以我不得不将"新"运算符(实例化)的使用"向上"移动到本地范围的顶部.他们只需要在使用它们的事件处理程序的北面.

到目前为止,我发现没有错误,所以我问为什么WindowBuilder没有这样开始.我是Swing和WindowBuilder的新手,所以很有可能WindowBuilder有很好的理由不这样做,即使它似乎是我的情况的正确方法.

以下是在一些简单的命名修改之后但在上述修改之前的WindowBuilder输出.这是输出,因为它有2个文本框,2个复选框,北边有2个按钮,中间有1个标签.这是粘贴在这里,以防有人可以在这里看到一些东西可以解释WindowBuilder使用成员数据背后的选择.

public class TestWB extends JFrame
{
    private static final long serialVersionUID = 1L;
    private JPanel contentPane;
    private JTextField textBox1;
    private JTextField textBox2;

    public TestWB() // the constructor
    { 
       ... // see the constructor below
    }
}
Run Code Online (Sandbox Code Playgroud)

上述类的构造函数:

public TestWB()
{
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setBounds(100, 100, 646, 451);
    contentPane = new JPanel();
    contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
    contentPane.setLayout(new BorderLayout(0, 0));
    setContentPane(contentPane);

    JPanel northPanel = new JPanel();
    contentPane.add(northPanel, BorderLayout.NORTH);

    JButton button1 = new JButton("button1");
    button1.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent arg0) {
        }
    });
    northPanel.add(button1);

    JButton button2 = new JButton("button2");
    button2.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
        }
    });
    northPanel.add(button2);

    final JCheckBox checkBox1 = new JCheckBox("cb1");
    checkBox1.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            CbProcessor cbp = new CbProcessor();
            cbp.dealWithCb(checkBox1.isSelected(), textBox1);
        }
    });
    northPanel.add(checkBox1);

    final JCheckBox checkBox2 = new JCheckBox("cb2");
    checkBox2.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            CbProcessor cbp = new CbProcessor();
            cbp.dealWithCb(checkBox2.isSelected(), textBox2);
        }
    });
    northPanel.add(checkBox2);

    textBox1 = new JTextField();
    textBox1.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
        }
    });
    textBox1.setText("tb1");
    northPanel.add(textBox1);
    textBox1.setColumns(5);

    textBox2 = new JTextField();
    textBox2.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
        }
    });
    textBox2.setText("tb2");
    northPanel.add(textBox2);
    textBox2.setColumns(5);

    JPanel centerPanel = new JPanel();
    contentPane.add(centerPanel, BorderLayout.CENTER);

    JLabel label1 = new JLabel("label1");
    centerPanel.add(label1);
}
Run Code Online (Sandbox Code Playgroud)

小智 6

这种情况下,阅读WindowBuilder文档很容易回答您的问题.WindowBuilder将以您喜欢的任何方式生成代码.窗口小部件都可以是局部变量,都是字段,或者是它们之间的任意组合.您可以单独控制不同窗口小部件的范围,也可以逐个类型控制(通过设置默认值).事实上,WindowBuilder拥有一组非常丰富的代码生成首选项,可以复制您想要的任何代码生成样式.它也很乐意对您抛出的任何代码进行逆向工程,因此您可以对生成的代码进行任何更改(手动或通过工具),它将保持非常高兴.

Swing代码生成首选项

Swing变量首选项