使用来自另一个类的变量的值

Fra*_*ank -1 java swing instance

我有这个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 ();
                }
            });    
        }                                           
}
Run Code Online (Sandbox Code Playgroud)

然后我创建了类"Frame2":

public class Frame2 extends javax.swing.JFrame {

.......

}
Run Code Online (Sandbox Code Playgroud)

你可以成像,当我的程序启动时,我使用JFileChooser来选择一个文件; 之后我点击一个打开另一个jFrame的按钮; 在这个jFrame(Frame2)中

我需要的是使用我在之前的jFrame(Frame1)中选择的文件.所以我需要在"Frame2"中使用"Frame1"中的"file"变量.

我试图在Frame2中这样做:

Frame1 obj1 = new Frame1();
File file2 = obj1.file;
System.out.println( file2  ); 
Run Code Online (Sandbox Code Playgroud)

因此,当我运行程序并选择一个文件,然后单击"Button1"运行"Frame2"时,它首先从"Frame1"打印文件名("name"),然后打印"null",这样我就能'从"Frame1"获取正确的"文件"值并在"Frame2"中使用它.

我怎样才能做到这一点?谢谢

Hov*_*els 5

这不起作用:

Frame1 obj1 = new Frame1();
File file2 = obj1.file;
System.out.println( file2  ); 
Run Code Online (Sandbox Code Playgroud)

因为它属于一个常见的新手陷阱:认为类的一个新实例(此处为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();
         }
      });
   }
}
Run Code Online (Sandbox Code Playgroud)