JFileChooser类型中的方法showSaveDialog(Component)不适用于()

时间:2014-06-23 08:42:07

标签: java swing

我想用saveDialog初始化一个帧,但是当使用这个chooser.showSaveDialog(this);时,我收到一个错误:

public void initialize() {

    JFrame frame = new JFrame();
    Container content = frame.getContentPane();
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    //Menu
    JMenu menu = new JMenu("File");
    menu.add(new AbstractAction("Make Image") {
        public void actionPerformed(ActionEvent e) {
            JFileChooser chooser  = new JFileChooser();
            int option = chooser.showSaveDialog(this);
            if(option == JFileChooser.APPROVE_OPTION) {
                File file = chooser.getSelectedFile();
                writeJPEGImage(file);
            }
        }});

    JPopupMenu.setDefaultLightWeightPopupEnabled(false);
    JMenuBar menuBar = new JMenuBar();
    menuBar.add(menu);
    frame.setJMenuBar(menuBar);


    content.add(tree);
    frame.pack();
    frame.setVisible(true);
}

错误:

  

JFileChooser类型中的方法showSaveDialog(Component)不是   适用于arguments()

我知道这个方法通常会得到一个Component,但是我的类中没有,因为我在这个方法中加载它。

有任何建议如何解决?

感谢您的回答!

PS。: new Test()确实有效,但我必须给它当前的组件!

3 个答案:

答案 0 :(得分:5)

您可以使用已创建的帧变量作为参数或内容变量。

int option = chooser.showSaveDialog(frame);

int option = chooser.showSaveDialog(content);

此外,您必须将它们定义为final,以便能够从您的匿名类访问它们:

final JFrame frame = new JFrame();

final Container content = frame.getContentPane();

答案 1 :(得分:2)

第一个参数应该是它所在的父组件/窗口,JFrame最像。但是this引用了一个匿名的AbstractAction子类。

如果代码在框架类中,请使用null,或使用类名this

int option = chooser.showSaveDialog(MyFrame.this);

答案 2 :(得分:1)

在此背景下......

new AbstractAction("Make Image") {
    public void actionPerformed(ActionEvent e) {
        int option = chooser.showSaveDialog(this);

this指的是AbstractAction

的实例

相反,您最有可能想要使用父组件引用。

int option = chooser.showSaveDialog(frame);

由于您已将frame创建为本地变量,因此您需要将其设为final

final JFrame frame = new JFrame();