我正在学习Swing并使用一系列get方法编写了一个接口来添加组件。在get方法中添加一个Listener是一个好习惯,如下所示?我想让事情尽可能脱钩。
private JButton getConnectButton() {
if (connectButton == null) {
connectButton = new JButton();
connectButton.setText("Connect");
connectButton.setSize(new Dimension(81, 16));
connectButton.setLocation(new Point(410, 5));
connectButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
// actionPerformed code goes here
}
});
}
return connectButton;
}
答案 0 :(得分:2)
从我作为Swing开发人员的广泛实践中,我可以告诉你,以这种方式获取组件实例(通过getter)并不是一种好的做法。我通常在某些方法(如initComponents())中为Frame / Dialog设置UI,然后在某些方法中添加所有侦听器,如addListeners()。我不确定是否有一个最佳实践如何做事 - 有很多选择和个人喜好。但是,一般情况下,你需要的组件的懒惰初始化(比如我认为的这个按钮)是不需要的。
另外 - 你应该考虑使用一些布局管理器,例如MiG,并避免使用硬编码的组件大小。
答案 1 :(得分:1)
好像你正在实现connectButton
的一些延迟初始化。这可能很好,不过,我会这样做:
private void createButton() {
connectButton = new JButton(new AbstractAction("Connect") {
public void actionPerformed(ActionEvent e) {
// actionPerformed code goes here
}
});
connectButton.setText("Connect");
// Rely on some LayoutManager!
//connectButton.setSize(new Dimension(81, 16));
//connectButton.setLocation(new Point(410, 5));
}
private synchronized JButton getConnectButton() {
if (connectButton == null)
createButton();
return connectButton;
}
请注意synchronized
的使用。它确保不会发生以下情况:
connectButton == null
connectButton == null
可能有更好的方法来同步按钮构造,但这是一种方式。