4

JMenuBarを含むJavaGUIプロジェクトがあり、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クラスを拡張しないため、これは正常だと思います。しかし、どうすればそれを超えることができますか?私がやろうとしていることは悪い習慣ですか?私の意図は、イベントを1回記述して、任意のコンポーネントから呼び出すことができるようにすることです。

私がしていることをあなたに理解させるために、私はこれを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これを実現する 1 つの方法は、メイン フレームを引数としてコンストラクターに渡すことです。

それに失敗しnullた場合も、有効な親仕様です。を指定するとnull、ダイアログは画面の中央に配置されますが、通常は問題なく動作します。

ボンヌチャンス!:)

于 2009-12-29T14:14:14.257 に答える
2

これは悪い考えです:

if(nameAction == "OPEN_PROJECT")

代わりにこれを使用する必要があります。

if("OPEN_PROJECT".equals(nameAction))

== 演算子は、2 つの参照が等しいかどうかのみをチェックし、それらが指す文字列が同一であるかどうかはチェックしません。これが 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 に答える