Java JMenuItems没有响应

Java JMenuItems没有响应,java,swing,jmenu,jmenuitem,jmenubar,Java,Swing,Jmenu,Jmenuitem,Jmenubar,我已经创造了一个3x3记忆游戏的颜色。程序运行并显示颜色,但JMenuBar无法正常工作。新棋盘、游戏和结束游戏的按钮不工作。我的Actionlistener有什么问题吗 代码应该是这样工作的: 这是StartPlayer import gui.MemoryGameWindow; import gui.ColoredPanel; import gui.GamePanel; public class StartPlayer { public static void main(String[]

我已经创造了一个3x3记忆游戏的颜色。程序运行并显示颜色,但
JMenuBar
无法正常工作。新棋盘、游戏和结束游戏的按钮不工作。我的
Actionlistener
有什么问题吗

代码应该是这样工作的:

这是
StartPlayer

import gui.MemoryGameWindow;
import gui.ColoredPanel;
import gui.GamePanel;

public class StartPlayer {
  public static void main(String[] args) {
  new MemoryGameWindow();
  
}
}
package gui;

import java.awt.Color;
import java.awt.event.MouseListener;
import javax.swing.JPanel;

public class ColoredPanel extends JPanel {
  private Color thisColor = null;
  
  private Color challenge = null;
  
  public ColoredPanel(Color color) {
    this.thisColor = color;
    setBackground(color);
  }
  
  public void setGameMode(Color c, MouseListener ml) {
    setBackground(Color.LIGHT_GRAY);
    this.challenge = c;
    System.out.println("Coloredpanel says challenge is " + this.challenge);
    addMouseListener(ml);
  }
  
  public void restoreBackground() {
    setBackground(this.thisColor);
  }
}
package gui;

import java.awt.Color;
import java.awt.GridLayout;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.Random;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class GamePanel extends JPanel {
  private Color[] colors = new Color[] { Color.GREEN, Color.YELLOW, Color.MAGENTA };
  
  private Random r = new Random();
  
  private int square = 9;
  
  private Color challenge;
  
  private int countOfPossibleHits = 0;
  
  private int countOfWinnerHits = 0;
  
  private JPanel challengeDisplay;
  
  public GamePanel(JPanel cd) {
    this.challengeDisplay = cd;
    setLayout(new GridLayout(3, 0, 2, 2));
    for (int i = 0; i < this.square; i++)
      add(new ColoredPanel(this.colors[this.r.nextInt(this.colors.length)])); 
  }
  
  public Color startGame() {
    Color[] existingColors = new Color[getComponentCount()];
    int i;
    for (i = 0; i < getComponentCount(); i++)
      existingColors[i] = ((ColoredPanel)getComponent(i)).getBackground(); 
    this.challenge = existingColors[this.r.nextInt(existingColors.length)];
    this.countOfPossibleHits = 0;
    for (i = 0; i < getComponentCount(); i++) {
      if (((ColoredPanel)getComponent(i)).getBackground() == this.challenge)
        this.countOfPossibleHits++; 
    } 
    for (i = 0; i < getComponentCount(); i++)
      ((ColoredPanel)getComponent(i)).setGameMode(this.challenge, new TheMouselistener()); 
    return this.challenge;
  }
  
  class TheMouselistener extends MouseAdapter {
    public void mousePressed(MouseEvent e) {
      ColoredPanel clickedObject = (ColoredPanel)e.getSource();
      clickedObject.restoreBackground();
      if (clickedObject.getBackground() != GamePanel.this.challenge) {
        clickedObject.add(new JLabel("Game Over!"));
        GamePanel.this.challengeDisplay.add(new JLabel("Game Over!"));
        System.out.println("Game Over");
        GamePanel.this.updateUI();
      } else {
        GamePanel.this.countOfWinnerHits = GamePanel.this.countOfWinnerHits + 1;
        if (GamePanel.this.countOfWinnerHits == GamePanel.this.countOfPossibleHits) {
          clickedObject.add(new JLabel("You won!"));
          GamePanel.this.challengeDisplay.add(new JLabel("You Won!"));
          GamePanel.this.updateUI();
        } 
      } 
    }
  }
}
package gui;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;

public class MemoryGameWindow extends JFrame implements ActionListener {
  private JMenuItem newgame = null;
  
  private JMenuItem playgame = null;
  
  private JMenuItem exit = null;
  
  private GamePanel gamepanel = null;
  
  private JPanel challengeDisplay;
  
  public MemoryGameWindow() {
    setTitle("memory game");
    setLayout(new BorderLayout(5, 5));
    add(this.challengeDisplay = new JPanel() {
        
        },  "North");
    add(this.gamepanel = new GamePanel(this.challengeDisplay));
    setJMenuBar(new GameMenubar(this));
    setSize(600, 600);
    setLocationRelativeTo((Component)null);
    setVisible(true);
  }
  
  public void actionPerformed(ActionEvent e) {
    Object s = e.getSource();
    if (s == this.newgame) {
      remove(this.gamepanel);
      remove(this.challengeDisplay);
      add(this.challengeDisplay = new JPanel() {
          
          },  "North");
      add(this.gamepanel = new GamePanel(this.challengeDisplay));
      this.playgame.setEnabled(true);
      this.gamepanel.updateUI();
    } 
    if (s == this.playgame) {
      Color challenge = this.gamepanel.startGame();
      this.challengeDisplay.setBackground(challenge);
      this.playgame.setEnabled(false);
      this.gamepanel.updateUI();
    } 
    if (s == this.exit)
      System.exit(0); 
  }
  
  class GameMenubar extends JMenuBar {
    public GameMenubar(MemoryGameWindow memoryGameWindow) {
      JMenu file;
      add(file = new JMenu("File"));
      MemoryGameWindow.this.newgame = new JMenuItem("new board");
      file.add(new JMenuItem("new board"));
      MemoryGameWindow.this.playgame = new JMenuItem("play");
      file.add(new JMenuItem("play"));
      MemoryGameWindow.this.exit = new JMenuItem("end program");
      file.add(new JMenuItem("end program"));
      MemoryGameWindow.this.newgame.addActionListener(memoryGameWindow);
      MemoryGameWindow.this.playgame.addActionListener(memoryGameWindow);
      MemoryGameWindow.this.exit.addActionListener(memoryGameWindow);
      
      
    }
  }
}
这是
彩色面板

import gui.MemoryGameWindow;
import gui.ColoredPanel;
import gui.GamePanel;

public class StartPlayer {
  public static void main(String[] args) {
  new MemoryGameWindow();
  
}
}
package gui;

import java.awt.Color;
import java.awt.event.MouseListener;
import javax.swing.JPanel;

public class ColoredPanel extends JPanel {
  private Color thisColor = null;
  
  private Color challenge = null;
  
  public ColoredPanel(Color color) {
    this.thisColor = color;
    setBackground(color);
  }
  
  public void setGameMode(Color c, MouseListener ml) {
    setBackground(Color.LIGHT_GRAY);
    this.challenge = c;
    System.out.println("Coloredpanel says challenge is " + this.challenge);
    addMouseListener(ml);
  }
  
  public void restoreBackground() {
    setBackground(this.thisColor);
  }
}
package gui;

import java.awt.Color;
import java.awt.GridLayout;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.Random;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class GamePanel extends JPanel {
  private Color[] colors = new Color[] { Color.GREEN, Color.YELLOW, Color.MAGENTA };
  
  private Random r = new Random();
  
  private int square = 9;
  
  private Color challenge;
  
  private int countOfPossibleHits = 0;
  
  private int countOfWinnerHits = 0;
  
  private JPanel challengeDisplay;
  
  public GamePanel(JPanel cd) {
    this.challengeDisplay = cd;
    setLayout(new GridLayout(3, 0, 2, 2));
    for (int i = 0; i < this.square; i++)
      add(new ColoredPanel(this.colors[this.r.nextInt(this.colors.length)])); 
  }
  
  public Color startGame() {
    Color[] existingColors = new Color[getComponentCount()];
    int i;
    for (i = 0; i < getComponentCount(); i++)
      existingColors[i] = ((ColoredPanel)getComponent(i)).getBackground(); 
    this.challenge = existingColors[this.r.nextInt(existingColors.length)];
    this.countOfPossibleHits = 0;
    for (i = 0; i < getComponentCount(); i++) {
      if (((ColoredPanel)getComponent(i)).getBackground() == this.challenge)
        this.countOfPossibleHits++; 
    } 
    for (i = 0; i < getComponentCount(); i++)
      ((ColoredPanel)getComponent(i)).setGameMode(this.challenge, new TheMouselistener()); 
    return this.challenge;
  }
  
  class TheMouselistener extends MouseAdapter {
    public void mousePressed(MouseEvent e) {
      ColoredPanel clickedObject = (ColoredPanel)e.getSource();
      clickedObject.restoreBackground();
      if (clickedObject.getBackground() != GamePanel.this.challenge) {
        clickedObject.add(new JLabel("Game Over!"));
        GamePanel.this.challengeDisplay.add(new JLabel("Game Over!"));
        System.out.println("Game Over");
        GamePanel.this.updateUI();
      } else {
        GamePanel.this.countOfWinnerHits = GamePanel.this.countOfWinnerHits + 1;
        if (GamePanel.this.countOfWinnerHits == GamePanel.this.countOfPossibleHits) {
          clickedObject.add(new JLabel("You won!"));
          GamePanel.this.challengeDisplay.add(new JLabel("You Won!"));
          GamePanel.this.updateUI();
        } 
      } 
    }
  }
}
package gui;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;

public class MemoryGameWindow extends JFrame implements ActionListener {
  private JMenuItem newgame = null;
  
  private JMenuItem playgame = null;
  
  private JMenuItem exit = null;
  
  private GamePanel gamepanel = null;
  
  private JPanel challengeDisplay;
  
  public MemoryGameWindow() {
    setTitle("memory game");
    setLayout(new BorderLayout(5, 5));
    add(this.challengeDisplay = new JPanel() {
        
        },  "North");
    add(this.gamepanel = new GamePanel(this.challengeDisplay));
    setJMenuBar(new GameMenubar(this));
    setSize(600, 600);
    setLocationRelativeTo((Component)null);
    setVisible(true);
  }
  
  public void actionPerformed(ActionEvent e) {
    Object s = e.getSource();
    if (s == this.newgame) {
      remove(this.gamepanel);
      remove(this.challengeDisplay);
      add(this.challengeDisplay = new JPanel() {
          
          },  "North");
      add(this.gamepanel = new GamePanel(this.challengeDisplay));
      this.playgame.setEnabled(true);
      this.gamepanel.updateUI();
    } 
    if (s == this.playgame) {
      Color challenge = this.gamepanel.startGame();
      this.challengeDisplay.setBackground(challenge);
      this.playgame.setEnabled(false);
      this.gamepanel.updateUI();
    } 
    if (s == this.exit)
      System.exit(0); 
  }
  
  class GameMenubar extends JMenuBar {
    public GameMenubar(MemoryGameWindow memoryGameWindow) {
      JMenu file;
      add(file = new JMenu("File"));
      MemoryGameWindow.this.newgame = new JMenuItem("new board");
      file.add(new JMenuItem("new board"));
      MemoryGameWindow.this.playgame = new JMenuItem("play");
      file.add(new JMenuItem("play"));
      MemoryGameWindow.this.exit = new JMenuItem("end program");
      file.add(new JMenuItem("end program"));
      MemoryGameWindow.this.newgame.addActionListener(memoryGameWindow);
      MemoryGameWindow.this.playgame.addActionListener(memoryGameWindow);
      MemoryGameWindow.this.exit.addActionListener(memoryGameWindow);
      
      
    }
  }
}
这是
游戏面板

import gui.MemoryGameWindow;
import gui.ColoredPanel;
import gui.GamePanel;

public class StartPlayer {
  public static void main(String[] args) {
  new MemoryGameWindow();
  
}
}
package gui;

import java.awt.Color;
import java.awt.event.MouseListener;
import javax.swing.JPanel;

public class ColoredPanel extends JPanel {
  private Color thisColor = null;
  
  private Color challenge = null;
  
  public ColoredPanel(Color color) {
    this.thisColor = color;
    setBackground(color);
  }
  
  public void setGameMode(Color c, MouseListener ml) {
    setBackground(Color.LIGHT_GRAY);
    this.challenge = c;
    System.out.println("Coloredpanel says challenge is " + this.challenge);
    addMouseListener(ml);
  }
  
  public void restoreBackground() {
    setBackground(this.thisColor);
  }
}
package gui;

import java.awt.Color;
import java.awt.GridLayout;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.Random;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class GamePanel extends JPanel {
  private Color[] colors = new Color[] { Color.GREEN, Color.YELLOW, Color.MAGENTA };
  
  private Random r = new Random();
  
  private int square = 9;
  
  private Color challenge;
  
  private int countOfPossibleHits = 0;
  
  private int countOfWinnerHits = 0;
  
  private JPanel challengeDisplay;
  
  public GamePanel(JPanel cd) {
    this.challengeDisplay = cd;
    setLayout(new GridLayout(3, 0, 2, 2));
    for (int i = 0; i < this.square; i++)
      add(new ColoredPanel(this.colors[this.r.nextInt(this.colors.length)])); 
  }
  
  public Color startGame() {
    Color[] existingColors = new Color[getComponentCount()];
    int i;
    for (i = 0; i < getComponentCount(); i++)
      existingColors[i] = ((ColoredPanel)getComponent(i)).getBackground(); 
    this.challenge = existingColors[this.r.nextInt(existingColors.length)];
    this.countOfPossibleHits = 0;
    for (i = 0; i < getComponentCount(); i++) {
      if (((ColoredPanel)getComponent(i)).getBackground() == this.challenge)
        this.countOfPossibleHits++; 
    } 
    for (i = 0; i < getComponentCount(); i++)
      ((ColoredPanel)getComponent(i)).setGameMode(this.challenge, new TheMouselistener()); 
    return this.challenge;
  }
  
  class TheMouselistener extends MouseAdapter {
    public void mousePressed(MouseEvent e) {
      ColoredPanel clickedObject = (ColoredPanel)e.getSource();
      clickedObject.restoreBackground();
      if (clickedObject.getBackground() != GamePanel.this.challenge) {
        clickedObject.add(new JLabel("Game Over!"));
        GamePanel.this.challengeDisplay.add(new JLabel("Game Over!"));
        System.out.println("Game Over");
        GamePanel.this.updateUI();
      } else {
        GamePanel.this.countOfWinnerHits = GamePanel.this.countOfWinnerHits + 1;
        if (GamePanel.this.countOfWinnerHits == GamePanel.this.countOfPossibleHits) {
          clickedObject.add(new JLabel("You won!"));
          GamePanel.this.challengeDisplay.add(new JLabel("You Won!"));
          GamePanel.this.updateUI();
        } 
      } 
    }
  }
}
package gui;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;

public class MemoryGameWindow extends JFrame implements ActionListener {
  private JMenuItem newgame = null;
  
  private JMenuItem playgame = null;
  
  private JMenuItem exit = null;
  
  private GamePanel gamepanel = null;
  
  private JPanel challengeDisplay;
  
  public MemoryGameWindow() {
    setTitle("memory game");
    setLayout(new BorderLayout(5, 5));
    add(this.challengeDisplay = new JPanel() {
        
        },  "North");
    add(this.gamepanel = new GamePanel(this.challengeDisplay));
    setJMenuBar(new GameMenubar(this));
    setSize(600, 600);
    setLocationRelativeTo((Component)null);
    setVisible(true);
  }
  
  public void actionPerformed(ActionEvent e) {
    Object s = e.getSource();
    if (s == this.newgame) {
      remove(this.gamepanel);
      remove(this.challengeDisplay);
      add(this.challengeDisplay = new JPanel() {
          
          },  "North");
      add(this.gamepanel = new GamePanel(this.challengeDisplay));
      this.playgame.setEnabled(true);
      this.gamepanel.updateUI();
    } 
    if (s == this.playgame) {
      Color challenge = this.gamepanel.startGame();
      this.challengeDisplay.setBackground(challenge);
      this.playgame.setEnabled(false);
      this.gamepanel.updateUI();
    } 
    if (s == this.exit)
      System.exit(0); 
  }
  
  class GameMenubar extends JMenuBar {
    public GameMenubar(MemoryGameWindow memoryGameWindow) {
      JMenu file;
      add(file = new JMenu("File"));
      MemoryGameWindow.this.newgame = new JMenuItem("new board");
      file.add(new JMenuItem("new board"));
      MemoryGameWindow.this.playgame = new JMenuItem("play");
      file.add(new JMenuItem("play"));
      MemoryGameWindow.this.exit = new JMenuItem("end program");
      file.add(new JMenuItem("end program"));
      MemoryGameWindow.this.newgame.addActionListener(memoryGameWindow);
      MemoryGameWindow.this.playgame.addActionListener(memoryGameWindow);
      MemoryGameWindow.this.exit.addActionListener(memoryGameWindow);
      
      
    }
  }
}

请看以下两行:

MemoryGameWindow.this.playgame = new JMenuItem("play");
file.add(new JMenuItem("play"));
首先,将
playgame
的值设置为new JMenuItem。在代码的后面,您将向其添加一个ActionListener。完全正确

问题是,添加了ActionListener的JMenuItem并不是您要添加到菜单栏的内容。相反,您正在添加一个全新的JMenuItem,它没有添加ActionListeners

解决方法非常简单:

file.add(MemoryGameWindow.this.playgame);
显然,您还需要为其他菜单项执行此操作