0

JFileChooserボタンには数十個あるので、抽象アクションを使用したいと思います。

public class OpenFileAction extends AbstractAction {
JFrame frame;
JFileChooser chooser;

OpenFileAction(JFrame frame, JFileChooser chooser) {
    super("Open...");
    this.chooser = chooser;
    this.frame = frame;
}

public void actionPerformed(ActionEvent evt) {
    // Show dialog; this method does not return until dialog is closed
    chooser.showOpenDialog(frame);
}
};

明らかに、JFileChooserの結果を変数に書き込みたいと思います。アクションが終了した後、どうすればe.getSource()にアクセスできますか?FileChooserダイアログが開く前にトリガーされるため、これは機能しません。

    JButton btnNewButton_1 = new JButton(new OpenFileAction(new JFrame(), new JFileChooser(new File(".")) ) );
    btnNewButton_1.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            //process e.getSource() ?
        }
    });
4

3 に答える 3

3

あなたが求めているのは次のことだと思います:

public abstract class OpenFileAction extends AbstractAction {
    JFrame frame;
    JFileChooser chooser;

    public OpenFileAction(JFrame frame, JFileChooser chooser) {
        super("Open...");
        this.chooser = chooser;
        this.frame = frame;
    }

    public void actionPerformed(ActionEvent evt) {
        int option = chooser.showOpenDialog(this.frame);
        if (option == JFileChooser.APPROVE_OPTION) {
            File selectedFile = chooser.getSelectedFile();
            doWithSelectedFile(selectedFile)
        }
    }

    /**
     * Method to override, which gets called with the selected file.
     */
    protected abstract doWithSelectedFile(File file);
}

...

OpenFileAction action = new OpenFileAction(frame, new JFileChooser(new File("."))) {
    @Override
    protected void doWithSelectedFile(File file) {
        // do what you want here
    }
};
JButton button = new JButton(action);
于 2012-06-29T07:47:03.020 に答える
1

これは、これを解決する方法を示すコードの更新です。ActionJButton (これは ActionListener でもあります) にすでに を設定しているため、アクション リスナーは必要ありません。

import java.awt.Component;
import java.awt.event.ActionEvent;
import java.io.File;

import javax.swing.AbstractAction;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.SwingUtilities;

public class TestFileChooser {

    public static class OpenFileAction extends AbstractAction {
        JFileChooser chooser;

        OpenFileAction(JFileChooser chooser) {
            super("Open...");
            this.chooser = chooser;
        }

        @Override
        public void actionPerformed(ActionEvent evt) {
            int retval = chooser.showOpenDialog((Component) evt.getSource());
            if (retval == JFileChooser.APPROVE_OPTION) {
                File selectedFile = chooser.getSelectedFile();
                JOptionPane.showMessageDialog((Component) evt.getSource(), "You have chosen " + selectedFile.getAbsolutePath());
            }
        }
    };

    protected void initUI() {
        JFrame frame = new JFrame("Test file chooser");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        JFileChooser chooser = new JFileChooser(new File("."));
        JButton btnNewButton_1 = new JButton(new OpenFileAction(chooser));
        frame.add(btnNewButton_1);
        frame.setSize(600, 400);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() {
                new TestFileChooser().initUI();
            }
        });
    }
}

これは、追加情報を提供する可能性のあるJFileChooserのチュートリアルです。

于 2012-06-29T07:26:25.410 に答える
0

編集:

次のコードはあなたに適しています:

JButton openButton = new JButton();
openButton.addActionListener(new ActionListener(){
    public void actionPerformed(evt){
        final JFileChooser fileChooser = new JFileChooser();
        File openFile;
        if(fileChooser.showOpenDialog(frame) == JFileChooser.APPROVE_OPTION)
            openFile= fileChooser.getSelectedFile();
        //place your code here
    }
});

または(絶対にローカル メソッドが必要な場合)

JButton openButton = new JButton();
openButton.addActionListener(new ActionListener(){
    public void actionPerformed(evt){
        final JFileChooser fileChooser = new JFileChooser();
        if(fileChooser.showOpenDialog(frame) == JFileChooser.APPROVE_OPTION)
            openButtonActionPerformed(fileChooser.getSelectedFile());
    }
});
openButtonActionPerformed(File openFile){
    //place your code here
}

別のクラスを作成する必要はありません

于 2012-06-29T07:53:49.790 に答える