java - 鼠标监听器未触发

标签 java swing mouselistener

我已经在这段代码上工作了很长时间,并且反复处理鼠标事件。我有一个 MainClass (实现 MouseListener)。 UI 有一个 JFrame,其中有一个 basePanelBasePanel 具有 GridPanel(调用 Grid 实现 MouseListener)。 GridGridLayout 上有单独的 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/

相关文章:

java - ProgressMonitorDialog 和 InvocableTargetException 中的取消按钮

Java Swing : best way to set background image clickable

java - 为什么 JPanel 不显示 ImageIcon?

java - 命令行解析 : Commons CLI alternatives?

java - 如何使用 WAS 调度程序(websphere Scheduler)调用 POJO?

Java 键绑定(bind)

java - 如何设置Dialog的大小以匹配JTable的大小?

Java在jframe中打开文件窗口

java - 如何在不同分辨率下获取同一位置的鼠标位置

java - Java 中的 mousePressed() 方法似乎不起作用