-2

我是 java 和一般编程的新手,我正在编写一个包含菜单的程序。(它是 java 中的 JFrame)它的作用是当你点击一个 JButton 时,它会在屏幕上显示一个小程序。小程序完成后,它会进入一个屏幕,您可以在其中选择再次运行小程序或在您按下按钮时返回主菜单。问题是当你点击按钮返回菜单时,它没有。它所做的只是使两个按钮都不可点击。这是我用来绘制菜单的方法:

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

这两个 jbuttons 已经在构造函数中声明了,它们在我第一次运行菜单时工作正常。然后,当您点击其中一个按钮时,它会使用 f.remove(...) 从屏幕上删除两个按钮。有谁知道为什么我第二次调用此方法时它不起作用?

编辑:对不起,我的意思是画布,而不是小程序。

编辑编辑:我找到了解决我的问题的方法,但无论如何感谢。

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 命名约定,以便其他人(例如我们)能够理解它。变量名和方法名都应该以小写字母开头。
  • 您将需要阅读并使用布局管理器来帮助您将 GUI 组件放置在 GUI 上,而不是使用空布局和setBounds(...).
  • 最重要的是,在您尝试交换视图时,请阅读并使用 CardLayout,因为它就是为此目的而构建的。
于 2013-06-29T20:46:29.027 回答
0

这不是答案,将被删除,但我需要发表更复杂的评论:

我正在编写一个包含菜单的程序。(它是 java 中的 JFrame)它的作用是当你点击一个 JButton 时,它会在屏幕上显示一个小程序。

你能解释一下你为什么这样做吗?JFrame 将小程序显示为小程序是最不寻常和最困难的。你是通过使用一些独立的小程序查看器启动小程序来做到这一点的吗?也许您正在做其他事情,例如显示一个对话框或另一个 JFrame,但是使用了错误的术语来描述它?

小程序完成后,它会进入一个屏幕,您可以在其中选择再次运行小程序或在您按下按钮时返回主菜单。

你如何做到这一点?你用什么代码?

问题是当你点击按钮返回菜单时,它没有。它所做的只是使两个按钮都不可点击。这是我用来绘制菜单的方法:

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

有谁知道为什么我第二次调用此方法时它不起作用?

不知何故,您的代码正在改变程序的状态,从而使您的 JButtons 无响应。它是如何做到的——你没有告诉我们足够的东西让我们说。

我不确定我们是否有足够的信息来回答您的问题。请显示更多代码,并为我们提供更详细和准确的描述。如果您可以发布sscce 最好

于 2013-06-29T19:19:16.913 回答