我从GUI和听众开始。我想选择并通过另一个实现ActionListener的类将文件从pc设置为Hlavna类中的“File zvolenysubor”。 我可以在监听器的actionPerformed方法中选择文件并将其设置为“文件subor”但我无法将其保存到我的主文件中的“File zvolenysubor”(我的所有想法如何做到也失败了)。 我应该更改/添加什么?
以下是我的课程:
public class Hlavna {
public static void main(String[] args) {
File zvolenysubor = null;
JFrame frame = new JFrame("ABCDE");
JButton vybersuboru = new JButton("vyber");
vybersuboru.setBounds(220, 15, 200, 20);
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(640, 480);
frame.add(vybersuboru);
frame.setLayout(null);
VyberListener list1 = new VyberListener(zvolenysubor);
vybersuboru.addActionListener(list1);
vybersuboru.setText("vyber subor");
}
}
public class VyberListener implements ActionListener {
private File subor;
public VyberListener(File subor){
this.subor = subor;
}
@Override
public void actionPerformed(ActionEvent e) {
JFileChooser chooser = new JFileChooser();
System.out.println("lol");
FileNameExtensionFilter filter = new FileNameExtensionFilter("JPG & GIF Images", "jpg", "gif");
chooser.setFileFilter(filter);
chooser.showOpenDialog(null);
subor = chooser.getSelectedFile();
System.out.println(subor.getAbsolutePath());
}
}
答案 0 :(得分:0)
不确定你在这里问的是什么。 Java通过值传递方法参数而不是引用,因此您提供给VyberListener的构造函数的File参数仅在ActionPerformed方法的VyberListener类中更新,而不是在main方法中的引用。你想在这里完成什么?
如果您正在尝试更新main方法中的“File zvolenysubor”,则可能需要将VyberListener类中的“File subor”设置为public,以便main方法可以访问它。
<强>更新强> 为了尽量减少下面评论中的聊天量,我将尝试总结。尽管Java支持按引用传递,但它实际上只是通过引用传递指针。因此,在您的示例中,将null对象引用(subor)传递给ActionListener,然后在actionPerformed方法中覆盖:
subor = chooser.getSelectedFile();
因此,您的文件变量“zvolenysubor”永远不会更新。为了更新Hlavna类中的字段,我建议使用以下“容器”模式:
public class Hlavna {
public static void main(String[] args) {
// New "FileReference" container instance
FileReference zvolenysubor = new FileReference();
JFrame frame = new JFrame("ABCDE");
JButton vybersuboru = new JButton("vyber");
vybersuboru.setBounds(220, 15, 200, 20);
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(640, 480);
frame.add(vybersuboru);
frame.setLayout(null);
VyberListener list1 = new VyberListener(zvolenysubor);
vybersuboru.addActionListener(list1);
// Retrieves the updated File instance
File updatedFile = zvolenysubor.getFile();
}
}
public class VyberListener implements ActionListener {
private FileReference subor;
public VyberListener(FileReference subor){
this.subor = subor;
}
@Override
public void actionPerformed(ActionEvent e) {
JFileChooser chooser = new JFileChooser();
FileNameExtensionFilter filter = new FileNameExtensionFilter("JPG & GIF Images", "jpg", "gif");
chooser.setFileFilter(filter);
chooser.showOpenDialog(null);
subor.setFile(chooser.getSelectedFile());
}
}
// FileReference container class allows the file reference to be updated by the ActionListener
// without re-initialising the object reference
public class FileReference {
private File _file;
public void setFile(File file) {
_file = file;
}
public File getFile() {
return _file;
}
}