我已经在这段代码上工作了很长时间,并且反复处理鼠标事件。我有一个 MainClass
(实现 MouseListener
)。 UI 有一个 JFrame
,其中有一个 basePanel
。 BasePanel
具有 GridPanel
(调用 Grid 实现 MouseListener
)。 Grid
在 GridLayout
上有单独的 JPanel
。当我单击 Grid 时,它会触发 Grid 中的事件方法,但不会触发 MainClass 中的事件方法。它以前可以工作,但现在不再工作了。
在接口(interface)方法中,我只输入了 println 来跟踪触发的内容。
主类
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);
}
网格
类
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);
}
最佳答案
这就是 Swing 中事件处理的工作原理。从非常高层次的角度来看 - 当生成事件时,将检查该坐标的最顶层组件以查看它是否会消耗该事件。如果是,则事件被传递到该组件并停止处理;如果没有,则检查该位置的下一个最顶层组件,依此类推,直到到达顶层容器。一个事件永远不会被传递到多个组件。
如果您确实需要顶级容器来获取所有事件,即使是在已注册监听器的子级上,您也可以通过使用 AWTEventListener 或使用 GlassPane 并自行处理重新分派(dispatch)事件来实现此目的,两者均如所述在 answers to this question .
关于java - 鼠标监听器未触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30199007/