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