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

时间:2013-07-10 20:30:54

标签: 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 ();
                }
            });    
        }                                           
}

然后我创建了类“Frame2”:

public class Frame2 extends javax.swing.JFrame {

.......

}

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

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

我尝试在第2帧中执行此操作:

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

因此,当我运行程序并选择一个文件然后单击“Button1”运行“Frame2”时,它首先从“Frame1”打印文件名(“name”) 然后它打印“null”,因此我无法从“Frame1”获得正确的“文件”值并在“Frame2”中使用它。

我该怎么做? 感谢

1 个答案:

答案 0 :(得分: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对话框,因为它为你做了所有这些?
  5. 例如:

    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();
             }
          });
       }
    }