-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”,这样我就可以了t 从“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()返回所选文件的公共方法。这就是你的问题的真正意义——与另一个对象共享一个对象的状态——一种方法是通过你的基本 getter 和 setter 方法。
  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 回答