无法通过侦听器设置变量

时间:2013-02-08 12:53:58

标签: java actionlistener

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

1 个答案:

答案 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;
    }
}