我有这个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”中使用它。
我该怎么做? 感谢
答案 0 :(得分:5)
这不起作用:
Frame1 obj1 = new Frame1();
File file2 = obj1.file;
System.out.println( file2 );
因为它属于一个常见的新手陷阱:认为类的一个新实例(此处为Frame1)与另一个以前使用的类实例(显示的前一个Frame1实例)保存相同的信息,而这仅仅是除非你使用静态变量,否则我会强烈要求你不。
相反,为什么不:
getSelectedFile()
。这就是你的问题所在 - 将一个对象的状态与另一个对象共享 - 一种方法是通过你的基本getter和setter方法。例如:
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();
}
});
}
}