Фокус на компоненте является нулевым - PullRequest
0 голосов
/ 14 марта 2019

Я сделал простую игру тральщика, используя java. Я хотел, чтобы пользователь нажал пробел, когда бомба была нажата, чтобы перезагрузить игру. Я также предлагаю пользователю выбрать размер доски до запуска игры. У меня есть доска размером 5x5 10x10 и 20x20.

Что я заметил, когда играл в игру, так это то, что доска 20х20 - это единственная доска, которая сбрасывается при нажатии на клавишу пробела. Таким образом, KeyListener работает, только если компонент сфокусирован. Поэтому я использовал метод JFrame.getFocusOwner(), чтобы увидеть, какой компонент имеет фокус.

Я запускал игру три раза, играя каждый размер по одному разу. Когда были нажаты кнопки 5x5 и 10x10, и на каждой доске было показано, что фокус был нулевым. Когда я делал то же самое для платы 20х20, основное внимание уделялось JPanel или MinesweeperGame, поэтому ключевой слушатель работал. Может кто-нибудь объяснить, почему платы 5x5 и 10x10 имеют нулевую фокусировку, когда код для платы 20x20 одинаков.

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import static java.lang.System.*;
public class MinesweeperGame extends JPanel {
   private MinesweeperCells cells;
   private int mouseX,mouseY;
   private int mouseButton;
   private boolean isTitle=true; 
   private JButton fiveByFive;
   private JButton tenByTen;
   private JButton twentyByTwenty;
   private JButton start;
   private static JFrame frame;
   public MinesweeperGame() {
      addMouseListener(new MouseAdapter() {
         public void mouseClicked(MouseEvent event) {
            mouseX=event.getX();
            mouseY=event.getY();
            mouseButton=event.getButton();
            repaint();
         }
      });
      addKeyListener(new KeyAdapter() {
         public void keyTyped(KeyEvent event) {           
            System.out.println(cells.getDead());
            if(event.getKeyChar()==KeyEvent.VK_SPACE&&cells.getDead()) {
               cells.createCells();
               cells.isDead(false);
               repaint();
            }
         }
      });
      setFocusable(true);
      cells = new MinesweeperCells();
      showTitle();      
   }
   public Color getBackground() {
      return new Color(196,206,211);
   }
   public Dimension getPreferredSize() {
      return new Dimension(800,800);
   }
   public void paintComponent(Graphics window) {
      super.paintComponent(window);
      Graphics2D g2d = (Graphics2D)window;
      System.out.println("JPanel: "+isFocusOwner());
      out.println("5Button: "+fiveByFive.isFocusOwner());
      out.println("10Button: "+tenByTen.isFocusOwner());
      out.println("20Button: "+twentyByTwenty.isFocusOwner());
      out.println("Button: "+start.isFocusOwner());
      out.println(frame.getFocusOwner()+"\n");
      if(isTitle) {
         GradientPaint gradient = new GradientPaint(0,0,new Color(119,125,132),800,800,Color.WHITE);
         g2d.setPaint(gradient);
         window.fillRect(0,0,800,800);
      } else {
         if(mouseButton==MouseEvent.BUTTON1) { 
            cells.isRevealed(mouseX,mouseY); 
         } else if(mouseButton==MouseEvent.BUTTON3) {
            cells.isFlag(mouseX,mouseY);
            mouseButton=0;
         }     
         mouseX=0;
         mouseY=0;
         cells.paintCells(window);
      }    
   }
   public void showTitle() {
      setLayout(new GridBagLayout());
      GridBagConstraints constraints = new GridBagConstraints();

      JLabel title = new JLabel("Minesweeper");
      title.setFont(new Font("Lucida Grande",Font.PLAIN,100));
      title.setForeground(Color.BLACK);
      constraints.gridx=0;
      constraints.gridy=0;
      add(title,constraints);

      start = new JButton("Start");
      constraints.gridx=0;
      constraints.gridy=2;
      add(start,constraints);

      fiveByFive = new JButton("5 x 5");
      tenByTen = new JButton("10 x 10");
      twentyByTwenty = new JButton("20 x 20");

      ActionListener buttonAction = new ActionListener() {
         public void actionPerformed(ActionEvent event) {
            if(event.getSource()==start) {
               remove(title);
               remove(start);
               constraints.gridx=0;
               constraints.gridy=0;
               add(fiveByFive,constraints);
               constraints.gridx=0;
               constraints.gridy=1;
               add(tenByTen,constraints);
               constraints.gridx=0;
               constraints.gridy=2;
               add(twentyByTwenty,constraints);
            } else {
               isTitle=false;
               if(event.getSource()==fiveByFive) {
                  cells.setGridSize(5,5);
               } else if(event.getSource()==tenByTen) {
                  cells.setGridSize(10,10);
               } else if(event.getSource()==twentyByTwenty) {
                  cells.setGridSize(20,20);
               }      
               remove(fiveByFive);
               remove(tenByTen);
               remove(twentyByTwenty);
            }   
            revalidate();
            repaint();
         } 
      };
      fiveByFive.addActionListener(buttonAction);
      tenByTen.addActionListener(buttonAction);
      twentyByTwenty.addActionListener(buttonAction);
      start.addActionListener(buttonAction);
   }   
   public static void createAndShowGUI() {
      frame = new JFrame("Minesweeper");
      frame.setLocation(300,0);
      frame.setResizable(false);
      frame.add(new MinesweeperGame());
      frame.pack();
      frame.setVisible(true);
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
   }
   public static void main(String[] args) {
      SwingUtilities.invokeLater(new Runnable() {
         public void run() {
            createAndShowGUI();
         }
      });
   }
} 
...