2

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

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

到目前为止,我没有发现任何错误,所以我问为什么 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
    }
}

上述类的构造函数:

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);
}
4

2 回答 2

6

在这种情况下,阅读 WindowBuilder 文档可以轻松回答您的问题。WindowBuilder 将以您喜欢的任何方式生成代码。小部件都可以是局部变量,都可以是字段,或两者之间的任何组合。您可以单独或按类型(通过设置默认值)控制不同小部件的范围。事实上,WindowBuilder 有一组非常丰富的代码生成偏好,并且可以复制几乎任何你想要的代码生成风格。它还可以很高兴地对您扔给它的任何代码进行逆向工程,因此您可以对生成的代码进行几乎任何您想要的更改(手动或通过工具),它会非常高兴。

Swing 代码生成首选项

摆动变量首选项

于 2011-09-28T02:34:29.850 回答
1

我对 WindowBuilder 不太了解,但我确实对 SWT 和 SimpleDesktopAplication FrameWorks 有所了解,但是

1) 两者都基于 AWT(来自 SWT)和 Swing

2) 两者都是覆盖标准 AWT 和 Swing 的方法

3) 在某些情况下,很难从 Framework 的方法返回标准 AWT 和 Swing 的方法

我建议在开始时学习基本的Swing ,

于 2011-09-21T09:34:04.533 回答