在get方法内部或外部添加一个监听器

时间:2010-05-24 09:33:48

标签: java swing components event-listener

我正在学习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;
 }

2 个答案:

答案 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的使用。它确保不会发生以下情况:

  • 线程1调用getConnectButton()并看到connectButton == null
  • 线程2调用getConnectButton()并看到connectButton == null
  • 线程1调用createButton
  • 线程2调用createButton。

可能有更好的方法来同步按钮构造,但这是一种方式。