在组件之间传递值

时间:2011-01-14 12:10:22

标签: java swing parameter-passing

我有JDialog调用AsbtractAction,调出JFileChooser,以便用户可以选择目录。这些都是单独的类。从JFileChooser传递值的正确方法是什么,以便我可以在JDialog中显示目录的路径?

编辑:更新了问题。

2 个答案:

答案 0 :(得分:3)

这是一个不完整的例子,但我想可以让你知道如何实现你所需要的。重要的是引用您想要选择的属性,如YourDialog.this.selectedFile=file;

请参阅下文,了解如何将其放入代码中:

   public class YourDialog extends JDialog implements ActionListener {
          protected File selectedFile=null;
          //Constructor
          public YourDialog(JFrame frame, boolean modal, String message) {
                //... create button and added to the panel
                someButton.addActionListener(new AbstractAction {
                    public void actionPerformed(ActionEvent e) {
                            final JFileChooser fc = new JFileChooser();
                            int returnVal = fc.showOpenDialog(YourDialog.this);
                            if (returnVal == JFileChooser.APPROVE_OPTION) {
                                File file = fc.getSelectedFile();

                                // HERE IS THE TRICK I GUESS !!
                                YourDialog.this.selectedFile=file;
                            }
                    }

                });
          }
    }

我希望对未发布完整示例感到有帮助和抱歉。

修改

本质上我们没有将任何参数传递给AbstractAction。事实是,AbstractAction可以通过访问类似YourDialog.this.somePropertyOrMethod来访问“调用者”的任何非私有属性。这是因为AbstractActionYourDialog类的匿名类。

答案 1 :(得分:3)

我不是这方面的专业人士,但我相信我有两种常用方法可以将值从一个对象传递到另一个对象(并且可能有更多),方法是将值从一个推送到其他并将值从一个拉到另一个。通过推送我的意思是这样做的明显方式,其中第一类引用了第二类,并在类2中调用了一个传递值的方法。在您的示例中,AbstractAction引用了GUI并在GUI中调用了一个方法设置JTextField,如下所示:

  public void actionPerformed(ActionEvent arg0) {
     String text = "Text from MyPushAction";
     guiPanel.setPushPathFieldText(text); 
  }

另一种方式更复杂,其中GUI具有向操作注册的侦听器,并且在通知属性已更改时从GUI提取信息。这可能不是您何时使用它的最佳示例,但它可以是解耦代码的有用方法。这方面的一个例子有点复杂。以下是两者的示例:

import java.awt.event.ActionEvent;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeSupport;

import javax.swing.*;

public class FuSwing {
    private static void createAndShowUI() {
        GuiPanel guiPanel = new GuiPanel();

        JFrame frame = new JFrame("FuSwing");
        frame.getContentPane().add(guiPanel);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                createAndShowUI();
            }
        });
    }
}

class GuiPanel extends JPanel {
    private MyPullAction myPullAction = new MyPullAction();
    private JTextField pushPathField = new JTextField(20);
    private JButton pushActionButton = new JButton(new MyPushAction(this));
    private JTextField pullPathField = new JTextField(20);
    private JButton pullActionButton = new JButton(myPullAction);

    public GuiPanel() {
        add(pushActionButton);
        add(pushPathField);
        add(Box.createHorizontalStrut(15));
        add(pullActionButton);
        add(pullPathField);

        myPullAction.addPropertyChangeListener(new PropertyChangeListener() {

            public void propertyChange(PropertyChangeEvent evt) {
                if (evt.getPropertyName().equals(MyPullAction.TEXT_PROPERTY)) {
                    pullPathField.setText(evt.getNewValue().toString());
                }
            }
        });
    }

    public void setPushPathFieldText(String text) {
        pushPathField.setText(text);
    }
}

class MyPushAction extends AbstractAction {
    private GuiPanel guiPanel;

    public MyPushAction(GuiPanel guiPanel) {
        super("Push Action");
        this.guiPanel = guiPanel;
    }

    public void actionPerformed(ActionEvent arg0) {
        String text = "Text from MyPushAction";
        guiPanel.setPushPathFieldText(text);
    }

}

class MyPullAction extends AbstractAction {
    public static final String TEXT_PROPERTY = "text";
    private String text = "";
    private PropertyChangeSupport pcs = new PropertyChangeSupport(this);

    public MyPullAction() {
        super("Pull Action");
    }

    public void addPropertyChangeListener(PropertyChangeListener listener) {
        pcs.addPropertyChangeListener(listener);
    }

    public String getText() {
        return text;
    }

    public void setText(String text) {
        String oldText = this.text;
        this.text = text;
        PropertyChangeEvent evt = new PropertyChangeEvent(this, TEXT_PROPERTY, oldText, text);
        pcs.firePropertyChange(evt);
    }

    public void actionPerformed(ActionEvent e) {
        setText("Text from MyPullAction");
    }
}