1

GUI とリスナーから始めます。ActionListenerを実装する別のクラスで、pcからファイルを選択して、クラスHlavnaの「ファイルzvolenysubor」に設定したい。リスナーの actionPerformed メソッドでファイルを選択して「File 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());        
    }   
}
4

1 に答える 1

0

ここで何を求めているのかよくわかりません。Java はメソッド引数を参照ではなく値で渡すため、VyberListener のコンストラクターに提供する File パラメーターは、メイン メソッドの参照ではなく、actionPerformed メソッドによって VyberListener クラスでのみ更新されます。ここで何を達成しようとしているのですか?

メイン メソッドで「File zvolenysubor」を更新しようとしている場合は、メイン メソッドからアクセスできるように、VyberListener クラスで「File subor」を public にする価値があるかもしれません。

更新 以下のコメントでのおしゃべりの量を最小限に抑えるために、要約してみます。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;
    }
}
于 2013-02-08T13:16:08.393 に答える