-1

私はこのjFrameクラスを持っています:

    public class Frame1 extends javax.swing.JFrame {

    ........

    String name;
    File file;
    JFileChooser FileChooser = new JFileChooser();

    if (FileChooser.getSelectedFile().isFile()) {
    try {    
           file = FileChooser.getSelectedFile();
           name = FileChooser.getSelectedFile().getName();   
           System.out.println( name ); 

        } catch (FileNotFoundException ex) {
            Logger.getLogger(Frame1.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
    ........

    private void Button1 (java.awt.event.ActionEvent evt) {                                            

                java.awt.EventQueue.invokeLater(new Runnable() {
                @Override
                public void run() {
                    Frame2 obj = new Frame2 ();
                }
            });    
        }                                           
}

次に、クラス「Frame2」を作成しました。

public class Frame2 extends javax.swing.JFrame {

.......

}

お分かりのように、プログラムの開始時に JFileChooser を使用してファイルを選択します。その後、別の jFrame を開くボタンをクリックします。このjFrame(Frame2)で

必要なのは、前の jFrame (Frame1) で選択したファイルを使用することです。したがって、「Frame2」の「Frame1」から「file」変数を使用する必要があります。

私はFrame2でこれをやろうとしました:

Frame1 obj1 = new Frame1();
File file2 = obj1.file;
System.out.println( file2  ); 

プログラムを実行してファイルを選択し、「Button1」をクリックして「Frame2」を実行すると、最初に「Frame1」からファイル名(「name」)が出力され、その後「null」が出力されるので、 「Frame1」から正しい「file」値を取得し、「Frame2」で使用します。

どうやってやるの?ありがとう

4

1 に答える 1

5

これはうまくいきません:

Frame1 obj1 = new Frame1();
File file2 = obj1.file;
System.out.println( file2  ); 

クラスの新しいインスタンス (ここでは Frame1) が以前に使用されたクラスの別のインスタンス (以前に表示された Frame1 インスタンス) と同じ情報を保持していると考え、これは単純に真実ではありません。静的変数を使用しない限り、そうしないことを強くお勧めします。

代わりに:

  1. 最初の JFrame をモーダル JDialog または JOptionPane に変更します
  2. getSelectedFile()選択したファイルを返すパブリック メソッドを指定します。これがあなたの質問の本当の目的です-あるオブジェクトの状態を別のオブジェクトと共有します-これを行う1つの方法は、基本的なゲッターおよびセッターメソッドを使用することです。
  3. 次に、ダイアログを表示し、戻ってきたら、上記のオブジェクトで上記のメソッドを呼び出します。
  4. あるいは、単に JFileChooser ダイアログを表示しないのはなぜですか?

例えば:

import java.io.File;
import javax.swing.*;

public class Foo {

   private static void createAndShowGui() {
      JFileChooser fileChooser = new JFileChooser();
      int result = fileChooser.showOpenDialog(null);
      if (result == JFileChooser.APPROVE_OPTION) {
         File file = fileChooser.getSelectedFile();
         JTextField field = new JTextField(file.getAbsolutePath(), 30);
         JPanel panel = new JPanel();
         panel.add(new JLabel("Selected File:"));
         panel.add(field);

         // create and open a new JFrame with the selected file's path
         JFrame frame = new JFrame("Foo");
         frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
         frame.getContentPane().add(panel);
         frame.pack();
         frame.setLocationByPlatform(true);
         frame.setVisible(true);
      }

   }

   public static void main(String[] args) {
      SwingUtilities.invokeLater(new Runnable() {
         public void run() {
            createAndShowGui();
         }
      });
   }
}
于 2013-07-10T20:33:16.053 に答える