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拥有一组非常丰富的代码生成首选项,可以复制您想要的任何代码生成样式.它也很乐意对您抛出的任何代码进行逆向工程,因此您可以对生成的代码进行任何更改(手动或通过工具),它将保持非常高兴.

