1

我从 GUI 和听众开始。我想通过另一个实现 ActionListener 的类从 pc 中选择文件并将其设置到 Hlavna 类中的“File zvolenysubor”中。我可以在侦听器的 actionPerformed 方法中选择文件并将其设置为“File subor”,但我未能将其保存到我的 main 中的“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());        
    }   
}
4

1 回答 1

0

不太清楚你在这里问什么。Java 通过值而不是引用传递方法参数,因此您提供给 VyberListener 构造函数的 File 参数仅在 VyberListener 类中由 actionPerformed 方法更新,而不是 main 方法中的引用。你想在这里完成什么?

如果您尝试在 main 方法中更新“File zvolenysubor”,则可能值得将您的 VyberListener 类中的“File subor”公开,以便可以通过 main 方法访问它。

更新 为了尽量减少下面评论中的喋喋不休,我会试着总结一下。尽管 Java 支持按引用传递,但它实际上只是按引用传递指针。因此,在您的示例中,您将一个空对象引用(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;
    }
}
于 2013-02-08T13:16:08.393 回答