gpt4 book ai didi

java - WindowBuilder for Swing制作了成员数据,似乎没有必要

转载 作者:行者123 更新时间:2023-12-02 00:47:55 40 4
gpt4 key购买 nike

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

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

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

最佳答案

在这种情况下,阅读 WindowBuilder 文档可以轻松回答您的问题。 WindowBuilder 将以您喜欢的任何方式生成代码。小部件可以全部是局部变量、全部是字段或两者之间的任意组合。您可以单独或逐个类型(通过设置默认值)控制不同小部件的范围。事实上,WindowBuilder 具有非常丰富的代码生成首选项,并且可以复制您想要的几乎任何代码生成样式。它还会愉快地对您扔给它的任何代码进行逆向工程,因此您可以对生成的代码进行任何您想要的更改(手动或通过工具),并且它会保持完美的状态。

Swing Code Generation Preferences

Swing Variable Preferences

关于java - WindowBuilder for Swing制作了成员数据,似乎没有必要,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7497411/

40 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com