Java中的我的菜单不能被称为两次?

时间:2013-06-29 19:13:56

标签: java swing menu applet jframe

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

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

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

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

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

2 个答案:

答案 0 :(得分: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,因为这是为此目的而构建的。

答案 1 :(得分:0)

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

  

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

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

  

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

你是如何实现这一目标的?您使用什么代码?

  

问题是,当您按下按钮返回菜单时,它不会。它所做的只是让按钮都不可点击。这是我用来绘制菜单的方法:

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

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

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

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