-2

私はJavaとプログラミング全般に不慣れで、メニューを持つプログラムを書いています。(Java では JFrame です) JButton を押すと、画面にアプレットが表示されます。アプレットが完了すると、アプレットを再度実行するか、ボタンを押したときにメイン メニューに戻るかを選択できる画面に移動します。問題は、メニューに戻るボタンを押しても戻らないことです。どちらのボタンもクリックできないようにするだけです。これは、メニューを描画するために使用する方法です。

public static void drawMenu()
{
    f.add(BOption1);
    f.add(BOption2);
}

2 つの jbuttons はコンストラクターで既に宣言されており、メニューを初めて実行したときに正常に動作します。次に、ボタンの 1 つを押すと、f.remove(...) で両方のボタンが画面から削除されます。このメソッドを 2 回目に呼び出したときに機能しない理由を知っている人はいますか?

編集: 申し訳ありませんが、アプレットではなく、キャンバスと言うつもりでした。

編集編集:私は私の問題の解決策を見つけましたが、とにかくありがとう。

4

2 に答える 2

1

メイン クラス Frame のコードは次のとおりです。

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class Frame extends JFrame {

   static OnePlayer onePlayer;
   static TwoPlayer twoPlayer;

   static Frame f;
   static JButton BOnePlayer = new JButton("Single Player");
   static JButton BTwoPlayer = new JButton("Multiplayer");
   static JButton BInstructions = new JButton("Instructions");
   static JButton toMenu;
   static JButton replay;

   public Frame(String name) {
      super(name);
      this.setTitle(name);
      this.setVisible(true);
      this.setSize(640, 673);
      this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      this.setResizable(false);
      this.setLocationRelativeTo(null);
      this.setLayout(null);
      this.setBackground(Color.GRAY);

      BOnePlayer.setBounds(120, 150, 400, 100);
      BTwoPlayer.setBounds(120, 250, 400, 100);
      BInstructions.setBounds(120, 350, 400, 100);

      BOnePlayer.setFont(new Font("Comic Sans MS", Font.ITALIC, 20));
      BTwoPlayer.setFont(new Font("Comic Sans MS", Font.ITALIC, 20));
      BInstructions.setFont(new Font("Comic Sans MS", Font.ITALIC, 20));

      BOnePlayer.addActionListener(new ActionListener() {
         public void actionPerformed(ActionEvent e) {
            Container onePane = f.getContentPane();
            onePane.setLayout(new GridLayout(1, 1));
            onePlayer = new OnePlayer();
            onePane.add(onePlayer);
            onePlayer.init();

            f.remove(BOnePlayer);
            f.remove(BTwoPlayer);
            f.remove(BInstructions);
         }
      });
      BTwoPlayer.addActionListener(new ActionListener() {
         public void actionPerformed(ActionEvent e) {
            Container twoPane = f.getContentPane();
            twoPane.setLayout(new GridLayout(1, 1));
            twoPlayer = new TwoPlayer();
            twoPane.add(twoPlayer);
            twoPlayer.init();

            f.remove(BOnePlayer);
            f.remove(BTwoPlayer);
            f.remove(BInstructions);
         }
      });
      BInstructions.addActionListener(new ActionListener() {
         public void actionPerformed(ActionEvent e) {

         }
      });
   }

   public static void main(String[] args) {
      f = new Frame("Snake");
      drawMenu();
   }

   public static void OnePlayerDone(int score) {

   }

   public static void TwoPlayerDone(int winner, int p1score, int p2score) {
      f.remove(twoPlayer);

      replay = new JButton("Play Again");
      toMenu = new JButton("Return to Menu");

      replay.setBounds(120, 100, 400, 100);
      toMenu.setBounds(120, 500, 400, 100);

      replay.setFont(new Font("Comic Sans MS", Font.ITALIC, 20));
      toMenu.setFont(new Font("Comic Snas MS", Font.ITALIC, 20));

      f.add(replay);
      f.add(toMenu);

      replay.addActionListener(new ActionListener() {
         public void actionPerformed(ActionEvent e) {
            Container twoPane = f.getContentPane();
            twoPane.setLayout(new GridLayout(1, 1));
            twoPlayer = new TwoPlayer();
            twoPane.add(twoPlayer);
            twoPlayer.init();
         }
      });
      toMenu.addActionListener(new ActionListener() {
         public void actionPerformed(ActionEvent e) {
            drawMenu();
         }
      });
   }

   public static void drawMenu() {
      f.add(BOnePlayer);
      f.add(BTwoPlayer);
      f.add(BInstructions);
   }
}

提案:

  • まず、クラスの名前を 以外の名前に変更しますFrame。これは、密接に関連するコア Java クラスの名前であり、JFrame に相当する AWT です。同じ名前を付けると、多くの人が混乱する可能性があります。おそらくそれを呼び出しますSnakeFrame
  • 代わりに、すべての静的変数をインスタンス変数にする必要があります。
  • SnakeFrame 変数 (変数 f) さえ持つべきではありません。代わりに、現在の SnakeFrame インスタンスを使用する必要がありますthis
  • AWT と Swing コンポーネントを不必要かつ必要なく混在させないでください。たとえば、Canvas 派生オブジェクトではなく、JPanel 派生オブジェクトを使用する必要があります。
  • コードは、他の人 (たとえば私たち) が理解できるように、Java 命名規則に従う必要があります。変数名とメソッド名はすべて小文字で始める必要があります。
  • null レイアウトやsetBounds(...).
  • 最も重要なのは、やろうとしているときにビューを交換するには、この目的のために構築された CardLayout を読んで使用することです。
于 2013-06-29T20:46:29.027 に答える
0

これは回答ではなく、削除されますが、より複雑なコメントを投稿する必要がありました:

メニューを含むプログラムを書いています。(Java では JFrame です) JButton を押すと、画面にアプレットが表示されます。

なぜこれを行っているのか説明できますか?JFrame がアプレットをアプレットとして表示するのは非常にまれであり、困難です。スタンドアロンのアプレット ビューアを使用してアプレットを起動することでこれを行っていますか? おそらく、ダイアログや別の JFrame を表示するなど、別のことをしているのに、それを説明するのに間違った用語を使用していませんか?

アプレットが完了すると、アプレットを再度実行するか、ボタンを押したときにメイン メニューに戻るかを選択できる画面に移動します。

どうやってこれを達成しますか?どのコードを使用しますか?

問題は、メニューに戻るボタンを押しても戻らないことです。どちらのボタンもクリックできないようにするだけです。これは、メニューを描画するために使用する方法です。

public static void drawMenu()
{
  f.add(BOption1);
  f.add(BOption2);
}

このメソッドを 2 回目に呼び出したときに機能しない理由を知っている人はいますか?

どういうわけか、コードがプログラムの状態を変更しているため、JButton が応答しなくなります。それがどのようにこれを行っているか - あなたは私たちが言うのに十分に話していません.

あなたの質問に答えるのに十分な情報がまだありません。より多くのコードを示して、何が起こっているかをより詳細かつ正確に説明してください。sscceを投稿できれば最高です。

于 2013-06-29T19:19:16.913 に答える