Я сделал простую игру тральщика, используя 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();
}
});
}
}