我一直在研究这段代码并且在鼠标事件中来回传递。我有一个MainClass
(实现MouseListener
)。用户界面的JFrame
有basePanel
。 BasePanel
有GridPanel
(调用网格实现MouseListener
)。 Grid
JPanel
上有GridLayout
个人Grid
。当我点击Grid
时,它会触发MainClass
中的事件方法,但不会触发public class PlayConnect implements MouseListener{
private JFrame mainFrame;
private JPanel basePanel,
buttonPanel,
messagePanel;
private Grid gridPanel;
private void startGame(){
mainFrame = new JFrame("Connect-4");
mainFrame.setSize(800, 700);
basePanel = new JPanel();
basePanel.setName("basePanel");
mainFrame.add(basePanel);
gridPanel = new Grid();
gridPanel.addMouseListener(this); //Added MouseListner
gridPanel.setName("GridPanel");
basePanel.add(gridPanel,BorderLayout.CENTER);
messagePanel = new JPanel();
// messagePanel.addMouseListener(this);
messagePanel.setName("messagePanel");
messArea = new JTextArea();
messArea.setEditable(false);
messFont = new Font(Font.SERIF, Font.BOLD, 20);
messArea.setFont(messFont);
messArea.setText("Game On !");
messagePanel.add(messArea);
basePanel.add(messagePanel,BorderLayout.PAGE_END);
buttonPanel = new JPanel();
buttonPanel.setName("button Panel");
buttonPanel.setLayout(new BoxLayout(buttonPanel, BoxLayout.Y_AXIS));
randButton = new JButton("Random Moves");
buttonPanel.add(randButton);
randButtonHandle = new RandomMoves();
randButton.addActionListener(randButtonHandle);
basePanel.add(buttonPanel,BorderLayout.LINE_END);
mainFrame.setVisible(true);
mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
中的事件方法。它过去工作较早但不再工作。
在界面方法中,我输入了println来跟踪触发的内容。
MAINCLASS
Grid
public class Grid extends JPanel implements MouseListener {
private Cell[][] gridUI = new Cell[6][7];
private static int[][] gridTrack = new int[6][7];
private static int player = 1;
private static Boolean gameOver = false;
public Boolean randPlayer;
private static ArrayList<Cell> cellArray = new ArrayList<Cell>();
public Grid(){
// setPreferredSize(new Dimension(600,700));;
setLayout(new GridLayout(6, 7));
for (int i = 0; i < 6; i++) {
for (int j = 0; j < 7; j++) {
Cell tempCell = new Cell(i,j);
tempCell.addMouseListener(this);
gridUI[i][j] = tempCell;
gridTrack[i][j] = 0;
add(tempCell);
int index = i*6 + j;
cellArray.add(tempCell);
}
}
addMouseListener(this);
}
班级
Parser
答案 0 :(得分:1)
这是Swing中事件处理的工作原理。从非常高级的视图 - 当生成事件时,检查该坐标处的最顶层组件以查看它是否将使用该事件。如果是,则将事件传递给该组件并停止处理;如果没有,则检查该位置的下一个最顶层组件,依此类推,直到到达顶级容器。事件永远不会传递给多个组件。
如果您确实需要顶级容器来获取所有事件,即使是已注册侦听器的子节点,您也可以使用AWTEventListener,或使用GlassPane并自行处理重新调度事件,这两者都是如上所述在answers to this question。