MouseListener未触发

时间:2015-05-12 18:41:28

标签: java swing mouselistener

我一直在研究这段代码并且在鼠标事件中来回传递。我有一个MainClass(实现MouseListener)。用户界面的JFramebasePanelBasePanelGridPanel(调用网格实现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

1 个答案:

答案 0 :(得分:1)

这是Swing中事件处理的工作原理。从非常高级的视图 - 当生成事件时,检查该坐标处的最顶层组件以查看它是否将使用该事件。如果是,则将事件传递给该组件并停止处理;如果没有,则检查该位置的下一个最顶层组件,依此类推,直到到达顶级容器。事件永远不会传递给多个组件。

如果您确实需要顶级容器来获取所有事件,即使是已注册侦听器的子节点,您也可以使用AWTEventListener,或使用GlassPane并自行处理重新调度事件,这两者都是如上所述在answers to this question