2011-01-14 8 views
3

JDialogを持っています。AsbtractActionを呼び出すとJFileChooserとなり、ユーザはディレクトリを選択できます。これらはすべて別々のクラスです。 JFileChooserの値を渡す適切な方法は何ですか?JDialogにディレクトリへのパスを表示できますか?コンポーネント間で値を渡す

編集:質問が更新されました。

+2

P. - あなたは 'JFileChooser'を意味していますか? – Qwerky

+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クラスの匿名クラスであるためです。

+0

心配はいりません。私はそれを感謝し、それは質問に答える。そのためには、コンストラクタへの参照を渡してからコールバックを行う方法があります。合格するには、AsbtractActionが別々のコンポーネントであり、他のコンポーネントで使用できるので、私はこのようにする必要があります。 –

+0

基本的には、AbstractActionにパラメータを渡していません。実際、AbstractActionはYourDialog.this.somePropertyOrMethodのようにアクセスすることによって、「呼び出し側」の非プライベートプロパティにアクセスできます。これは、AbstractActionがYourDialogクラスの匿名クラスであるためです。 –

+1

私の最後のコメントを追加するように編集されていますが、実際にはいくつかの良い点が反映されていると思います。 –

3

私はこれはプロではありませんが、別のオブジェクトのあるオブジェクトの値を渡すのに2つの一般的な方法があると思います。もう一方は値を一方から他方に引きます。私は、クラス1にクラス2への参照があり、クラス2で値を渡すメソッドを呼び出すという明白な方法を意味します。あなたの例では、AbstractActionはGUIへの参照を持ち、GUIのメソッドを呼び出しますそのように、JTextFieldの設定:GUIはアクションに登録されたリスナーがあり、プロパティが変更されたことを通知したときにGUIから情報を引き出しどこ

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

他の方法はより複雑です。これは、これを使用するときの最良の例ではないかもしれませんが、コードをデカップリングするのに便利な方法です。これの例はちょっと複雑です。両方の例があります:

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"); 
    } 
} 
+0

アプローチ1は簡単で、Asbtractionでメソッドを呼び出して属性を読み込もうとする最初の解決策を打ち負かしました(値が更新される保証はありません)。それはクラスを相互依存するものにしますが、AbstractActionが再利用されることを意図している場合は、デカップリングが必要です。 2番目の解決策はObserverのパターンと非常によく似ています。私はPropertyChangeSupportを見ていきます。 –

+1

**これはObserverパターンです**です。 –

関連する問題