如何在非组件类中使用JFileChooser.showOpenDialog()?

Amo*_*tir 4 java jfilechooser

我有一个包含JMenuBar的Java GUI项目,我刚刚添加了一个JToolBar.在以前的版本中,事件是在扩展JMenuBar的同一个类中实现的.我发现它很蹩脚,并将事件移动到另一个扩展AbstractAction的类中.我的目标是集中所有常见事件,使他们对不同的来源做出反应(JMenuBar,JToolBar等).但是,我遇到了JFileChooser.showOpenDialog()方法的问题.此方法将对话框的父组件作为参数.如果我这样做:

import java.awt.*;
import java.awt.event.*;
import java.io.File;

import javax.swing.*;
import javax.swing.event.*;

public class ActionUsuels extends AbstractAction 
{

    private String nameAction;

    /** Instance de MyFileChooser pour explorer les dossiers/fichiers*/
    private MyFileChooser fc;

    /** Instance d'OpenSave qui contient les algorithmes d'ouverture/sauvegarde*/
    private OpenSave openSave;

    ActionUsuels(String inName, String inPathIcon)
    {
        nameAction = inName;
        putValue(Action.NAME, inName);
        putValue(Action.SMALL_ICON, new ImageIcon(inPathIcon));
        putValue(Action.SHORT_DESCRIPTION, inName);

        this.fc = new MyFileChooser();
        this.openSave = new OpenSave(Panneau.getUnivers());

    }

    public void actionPerformed(ActionEvent e)
    {

        // Evénement nouveau projet
        if(nameAction == "OPEN_PROJECT")
        {

            fc.ContMode();
            fc.refresh();

            int returnVal = fc.showOpenDialog(ActionUsuels.this);

            if (returnVal == MyFileChooser.APPROVE_OPTION) 
            {
                File file = fc.getSelectedFile();

                    openSave.OpenCont(file);
            } 

        }
        static ActionUsuels actionInactive;
}
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

JFileChooser类型中的showOpenDialog(component)方法不适用于参数(ActionUsuels).

我想这是正常的,因为ActionUsuels不扩展任何JComponent类.但我怎么能绕过那个呢?我正在努力做一个坏习惯吗?我的目的是编写一次事件,并能够从任何组件中调用它们.

只是为了让你明白我在做什么,我在菜单类中有这个:

 actions = new ActionUsuels[nameActions.length];

 for(int i = 0; i < nameActions.length; i++)
 {
        actions[i] = new ActionUsuels(nameActions[i], pathIcons[i]);
 }

file_menu.add(actions[0]);

file_menu.addSeparator();

file_menu.add(actions[1]);
Run Code Online (Sandbox Code Playgroud)

每个项目都与动作的名称,图标和合适的事件相关联!

任何的想法 ?

谢谢 !

Car*_*icz 10

通常,传递给JDialogs的父类是应用程序的主JFrame.除此之外,这允许对话框在应用程序窗口的中心.

希望您的动作类可以访问主框架并可以传递对它的引用.实现此目的的一种方法可能是将主框架作为参数传递给ActionUsuels构造函数.

如果做不到这一点,null也是一个有效的父规范.给定null,对话框以屏幕为中心,但无论如何通常都能正常工作.

Bonne的机会!:)