在不同的操作中修改对象后的最佳方法

时间:2013-09-20 14:02:02

标签: java swing object listener

我想知道在不同的动作中修改对象的最佳方法是什么。

示例:我有一个带有一些组件的JPanel,其中一个组件打开一个新的JPanel。在这个新的JPanel中,我有一个按钮,我可以修改第一个JPanel。

我找到了2个有效的解决方案,我想知道哪一个是最好的(或另一个)。

首先在第一个类中添加一个Actionlistener:

public class SomePanel extends JPanel{

    private JButton button = new JButton("Open New Frame");
    private SomeOtherPanel otherPanel = new SomeOtherPanel();
    private int value = 0;

    public SomePanel(){            
        // initialization code            
        button.addActionListener(new ActionListener(){

            @Override
            public void actionPerformed(ActionEvent e) {
                otherPanel.setVisible(true);
            }                
        });

        otherPanel.getButton().addActionListener(new ActionListener(){

            @Override
            public void actionPerformed(ActionEvent e) {
                value = 1;
            }                
        });            
    }


public class SomeOtherPanel extends JPanel{

private JButton button = new JButton("Modify First Panel value");

    public SomeOtherPanel(){

    }
    public JButton getButton() {
        return button;
    }        
}

第二个通过传递第一个JPanel作为第二个参数:

public class SomePanel extends JPanel{

    private JButton button = new JButton("Open New Frame");
    private SomeOtherPanel otherPanel = new SomeOtherPanel(this);
    private int value = 0;

    public SomePanel(){            
        // initialization code ... size, color ...            
        button.addActionListener(new ActionListener(){

            @Override
            public void actionPerformed(ActionEvent e) {
                otherPanel.setVisible(true);
            }                
        });             
    }

    public void setValue(int value) {
        this.value = value;
    }   
}

public class SomeOtherPanel extends JPanel{

    private JButton button = new JButton("Modify First Panel value");
    public SomePanel somePanel;

    public SomeOtherPanel(SomePanel panel){
        this.somePanel = panel;
        button.addActionListener(new ActionListener(){

            @Override
            public void actionPerformed(ActionEvent e) {
                somePanel.setValue(1);
            }                
        });
    }

    public JButton getButton() {
        return button;
    } 
}

这是对的吗?

2 个答案:

答案 0 :(得分:2)

除了你的解决方案是不正确的,在这些对象之间产生高耦合,所以我会给你另一个解决方案。

您可以接近observer pattern然后解耦可视组件,actionListener作为控制器/“中介”。

我不知道你的价值是什么,但我把它作为一个可观察的财产并在其上注册观察员。

public class SomePanel extends JPanel{

private JButton button = new JButton("Open New Frame");
private int value;


public SomePanel(){

    // initialization code ... size, color ...

    button.addActionListener(new ActionListener(){

        @Override
        public void actionPerformed(ActionEvent e) {
              setValue(1);
        }

    });    
}

public void setValue(int value) {
    int oldValue= this.value;
    this.value = value;
    firePropertyChangeValue("value",oldValue,this.value);
}

}

在其他一些小组中

public class SomeOtherPanel extends JPanel {

     private PropertyChangeListener listener = new ValueListener();

      public PropertyChangeListener getListener(){
                  return listener;
      }

     private class ValueListener implements PropertyChangeListener{
            @Override
            public void propertyChange(PropertyChangeEvent evt){
                        if(evt == null)
                            return;

               if(evt.getPropertyName().equals("value") && ((int) evt.getNewValue()) == 1 ){
                    SomeOtherPanel.this.setVisible(true);
               }        
            }        
     }        
 }

在您启动两个面板的客户端代码中。

示例:

  JPanel panel = new SomePanel();
  SomeOtherPanel otherPanel = new SomeOtherPanel();
  panel.addPropertyChangeListener("value",otherPanel.getListener());

<强>更新

因为我不明白你想要实现什么,你的解决方案很容易,只是简单的不使用匿名类

public class SomePanel extends JPanel{

private ActionListener myAction = new ActionListener(){
       @Override
       public void actionPerformed(ActionEvent evt){
           value =1;//or what you want
       }

}; 

public ActionListener getMyAction{
    return myAction;
}


}

在另一个小组中..

public class SomeOtherPanel extends JPanel {

private JButton button = new JButton();

public void addButtonAction(ActionListener listener){
   button.addActionListener(listener);
}

}

在客户端代码中:

 JPanel panel = new SomePanel();
  SomeOtherPanel otherPanel = new SomeOtherPanel();
  otherPanel .addButtonAction(panel .getMyAction());

答案 1 :(得分:0)

两种方法都可以。如果你寻找最干净的方法,我会说这取决于。

这是一个凝聚力问题。你必须问自己,每节课的目的是什么。

如果您认为SomeOtherPanel的目的只是为了应用更改,无论更改是什么,当按下按钮时SomePanel使第一个方法是好的,因为没有触及SomeOtherPanel中的任何代码,您可以选择该类的效果将在SomePanel上有。

如果您认为SomeOtherPanel的目的是将实例变量设置为1,那么第二个解决方案就是好的。