4

我有一个包含 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;
}

我收到以下错误:

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

我想这是正常的,因为 ActionUsuels 没有扩展任何 JComponent 类。但我怎么能超越呢?我正在尝试做的事情是不好的做法吗?我的意图是编写一次事件并能够从任何组件调用它们。

只是为了让您了解我在做什么,我在 Menu 类中有这个:

 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]);

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

任何的想法 ?

谢谢 !

4

2 回答 2

11

通常,传递给 JDialogs 的父类是应用程序的主 JFrame。除其他外,这允许对话框位于应用程序窗口的中心。

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

做不到这一点,null也是一个有效的父规范。给定null,对话框在屏幕上居中,但无论如何通常都可以正常工作。

好机会!:)

于 2009-12-29T14:14:14.257 回答
2

这是一个坏主意:

if(nameAction == "OPEN_PROJECT")

您需要改用它:

if("OPEN_PROJECT".equals(nameAction))

== 运算符只检查两个引用是否相等,而不检查它们指向的字符串是否相同。这就是编写 String 的 equals 方法的目的。这是“浅”和“深”的区别。

你可以在这里看到它的实际效果:

String x = new String("foo");  // don't write code like this; just an example
String y = new String("foo");  // x and y are different reference values
System.out.println(x == y);    // prints "false"
System.out.println(x.equals(y)); // prints "true"
于 2009-12-29T14:27:57.377 回答