我想知道在不同的动作中修改对象的最佳方法是什么。
示例:我有一个带有一些组件的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;
}
}
这是对的吗?
答案 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,那么第二个解决方案就是好的。