我的Java菜单可以';你不能叫两次吗?

我的Java菜单可以';你不能叫两次吗?,java,swing,menu,applet,jframe,Java,Swing,Menu,Applet,Jframe,我对java和编程都是新手,我正在编写一个包含菜单的程序。(它是java中的JFrame)它所做的是当你点击一个JButton时,它会在屏幕上显示一个小程序。完成小程序后,它会进入一个屏幕,您可以选择再次运行小程序,或者在按下按钮时返回主菜单。问题是,当你按下按钮返回菜单时,它不会。它所做的只是使两个按钮都不可点击。 这是我用来绘制菜单的方法: public static void drawMenu() { f.add(BOption1); f.add(BOption2); }

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

public static void drawMenu()
{
    f.add(BOption1);
    f.add(BOption2);
}
这两个jbutton已经在构造函数中声明过了,在我第一次运行菜单时,它们工作得很好。然后,当您点击其中一个按钮时,它将使用f.remove(…)从屏幕上删除两个按钮。有人知道为什么我第二次调用这个方法时它不起作用吗

编辑: 对不起,我想说的是画布,不是小程序

编辑:
我找到了问题的解决方案,但还是要谢谢你。

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

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

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

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

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

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

public static void drawMenu()
{
    f.add(BOption1);
    f.add(BOption2);
}
有人知道为什么我第二次调用这个方法时它不起作用吗

不知何故,您的代码正在更改程序的状态,从而使JButtons没有响应。它是怎么做到的,你告诉我们的还不够多


我不确定我们是否有足够的信息来回答你的问题。请显示更多的代码,并为我们提供更详细和准确的描述。最好是你能发布一篇文章。

这是你的主类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,您给它取相同的名称可能会让很多人感到困惑。也许可以称之为蛇形框架
  • 所有静态变量都应该是实例变量
  • 你甚至不应该有一个蛇框变量(你的变量f)。相反,您应该使用当前的SnakeFrame实例,
    this
    (如果愿意)
  • 不要在没有必要的情况下将AWT与Swing组件混合使用。例如,您不应该使用画布派生对象,而应该使用JPanel派生对象
  • 您的代码应该遵循Java命名约定,以便其他人(例如我们)能够理解它。变量名和方法名都应该以小写开头
  • 您需要阅读并使用布局管理器来帮助您在GUI上放置GUI组件,而不是使用空布局和
    setBounds(…)
  • 最重要的是,要在您尝试交换视图时,阅读并使用CardLayout,因为它正是为此目的而构建的

为了更快地获得更好的帮助,请发布一条关于,
“对不起,我想说的是画布,不是applet。”
:这一点还不清楚。你说的“画布”是什么意思?你是说画布对象吗?编译器在拼写、大小写和语法方面都是严格而无情的,你在这里提问时也应该如此。很高兴你解决了这个问题。为了所有人的利益,请与所有人分享问题的原因和您的解决方案。请注意,我仍然坚持我在下面答案中发布的建议,我的建议(在某种程度上)可以帮助您解决程序中的严重问题。问题(我相信)是我从框架中删除了jbutton,然后添加了它们,因此我改为使用setVisible(false)使其不可见。然后,当我需要将它们显示在屏幕上时,我再次执行了f.add(…)。您需要查看代码本身,还是希望我进一步解释它的工作原理?@user2371168:如果您能够创建一个。请查看链接。上面的超链接是指向我的sscce的链接(我希望它能工作,我以前从未尝试过这个网站)@user2371168:你发布的不是sscce。请再看看我和安德鲁给你提供的链接。第一个字母“s”代表“short”。SSCCE最多只能有100行代码,它应该编译、运行并演示您的问题。链接解释了所有这些,并且解释得很好。您应该能够在您的问题中发布您的SSCCE的完整代码。还有许多人(包括我自己)不信任下载网站,比如你正在起诉的网站。+1提醒不要使用
null
layout(以及所有其他好建议)