0

jmenuitem New Game int x をクリックするたびに値が 1 になるコードを作成しましたが、残念ながら値は返されません

    package sprite;

    import java.awt.event.*;

    import javax.swing.*;
    import  sprite.Intro;
    import sprite.Fishes;

    public class Ken{

    static int x;

    public static void main(String args[])
    {   
        JFrame.setDefaultLookAndFeelDecorated(true);
        JFrame f = new JFrame("Save the FISH.");
        Fishes fs = new Fishes();
        Intro in = new Intro();
        Arrow a = new Arrow();          
        f.setResizable(false);
        f.setVisible(true);
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setSize(800,600);
        if(x == 0){
            f.add(a);
        }           
        if(x == 1){
            f.add(fs);
        }           
        JMenuBar mb = new JMenuBar();
        JMenu opt = new JMenu("Game");
        JMenu sd = new JMenu("Select Difficulty");
        JMenuItem ng = new JMenuItem("New Game");
        JMenuItem ex = new JMenuItem("Exit");
        JMenuItem l1 = new JMenuItem("Easy");
        JMenuItem l2 = new JMenuItem("Average");
        JMenuItem l3 = new JMenuItem("Hard");           
        f.setJMenuBar(mb);    
        mb.add(opt);
        mb.add(sd);         
        opt.add(ng);
        opt.add(ex);            
        sd.add(l1);
        sd.add(l2);
        sd.add(l3);

        class exit implements ActionListener{

            public void actionPerformed(ActionEvent e) {
                System.exit(0);
            }
        }

        class newGame implements ActionListener{

            public void actionPerformed(ActionEvent e) {
                x = 1;
            }
        }           
        ng.addActionListener(new newGame());
        ex.addActionListener(new exit());
    }       
}

私が計画しているのは、x の値が 1 になるため、別のクラスでそれを使用して続行でき、x の値が 1 になるたびに新しいパネルが表示されるということです。

4

1 に答える 1

2

静的な世界から抜け出して、真の OOP クラスを作成します。これは、"状態" を持つクラス、つまりインスタンス フィールドを持つクラスです。actionPerformed 内からインスタンス フィールドを設定して、問題を解決できます。

public static main メソッドは、GUI オブジェクトを作成して実行するためだけに存在する必要があります。それだけです。


編集
あなたはコメントで述べました、

正確にはどういう意味ですか?私はただの初心者で、Java のすべての要素を完全に理解しているわけではありません。

申し訳ありませんが、ランチタイムが終わり、仕事に戻らなければならなかったため、最後の回答は少し急いでいました. 現在、あなたのプログラムは、すべてがこのメソッドに押し込まれようとしている単一の静的なメイン メソッドにすぎません。これは、ユーザーに 2 つの数字を尋ね、数字を追加して答えを返すような、最も基本的なコンソール プログラムを作成する場合には問題ありませんが、もはやこれを行う必要はありません。代わりに、Swing GUI プログラムを作成しようとしています。このプログラムは、ユーザーがイベント駆動型の方法で操作した場合に状態を変更したいものです。つまり、ユーザーがボタンを押したり、メニュー項目。

ニーズと要件がより複雑になっているため、これを反映するようにプログラム構造を変更する必要があります。これはあなたがこれを行う絶対的な要件ですか?いいえ - チューリング等価と呼ばれるものは、単一の静的 main メソッド内で想像できる最も複雑なプログラムを作成できることを示していますが、複雑さが増すため、プログラムを理解するのが非常に難しくなり、デバッグがほとんど不可能になります。

私が具体的に推奨するのは、1 つ以上の適切に動作するオブジェクト指向クラス、非静的変数と非静的メソッドを持つクラスを作成し、これらを使用して GUI とそのモデル (GUI プログラムがすべき非 GUI 核) を構築することです。持ってる)。繰り返しますが、main メソッドは短く、非常に短く、上記のクラスを作成し、GUI を表示するように設定することのみに関与する必要があり、それだけです。

あなたがしたいことは、Java の基本的な概念、特に Java クラスの作成方法について学ぶことです。これには Java チュートリアルが役立ちます。


編集2
あなたのプログラムには、変数の状態を変更することによって、以前に変数を使用していたものが魔法のように変更されるという初心者の誤謬に苦しんでいるという点で、別の大きな問題があります。

たとえば、プログラムで静的変数 x を使用して 0 または 1 の値を保持し、その変数の状態に基づいて JFrame にコンポーネントを追加しようとするとします。

// Code Block (A)
if(x == 0){
   f.add(a);
}           
if(x == 1){
   f.add(fs);
} 

このコードが呼び出されると、プログラムは実行を開始したばかりでxあり、デフォルト値は 0 でありa、JFrame に追加されることに注意してください。

ActionListener の後半で、x の値を 1 に変更します。

// Code Block (B)
class newGame implements ActionListener {
   public void actionPerformed(ActionEvent e) {
      x = 1;
    }
}  

ただし、コード ブロック (B) で x の値を変更しても、JFrame の表示内容には影響しないことを理解する必要があります。これは、コード ブロック (A) が実行されて完了し、このプログラムで再度実行されることはないためです。

解決策は、(B) 内からコード ブロック (A) を再実行することです。これはお勧めしませんが、CardLayout を使用して JFrame によって表示される JPanels を Card ブロック (B) 内から交換することをお勧めします。

CardLayout の詳細については、CardLayout チュートリアルを参照してください。また、ここにあるこのサイトのコードを使用して、以前の回答を確認してください。

于 2013-10-17T17:06:45.147 に答える