当JPanel实现时,MouseEvent不会触发

时间:2012-05-26 12:18:15

标签: java swing mouseevent jcomponent mouselistener

好的,所以在我正在制作的这个程序中,用户将能够在他们的计算机上创建自己喜欢的应用程序的快捷方式。对于应用程序,我的程序有点像集线器。我有一个小问题,涉及两个类:AppButtonAppButtonContainer。它们都实现MouseListener,但AppButton扩展JComponentAppButtonContainer扩展JPanel。基本上,当单击AppButton时,它会设置以不同颜色绘制边框以使其看起来处于选中状态。否则,它将边框设置为背景颜色。双击它时,它会打开指定的应用程序。我在AppButton中有一个删除焦点的方法,因此将边框设置为背景颜色。在AppButtonContainer中,有一些代码,以便在单击面板时,它会从AppButton中删除焦点。

但这是我的问题。 AppButtonContainer没有意识到它被点击了。我认为这与顶级容器或其他东西有关,但我不确定。有人可以帮忙吗?

编辑:我发现我没有将addMouseListener(this)放在AppButtonContainer的构造函数中。感谢所有帮助我解决这个问题的人,并在此过程中给我提示:)

AppButtonContianer

public class AppButtonContainer extends JPanel implements MouseListener {
private static final long serialVersionUID = 6485231881729120957L;
public List<AppButton> appButtons;
private static final Color BACKGROUND_COLOR = new Color(18, 18, 18);

public AppButtonContainer(List<AppButton> buttons) {
    this.appButtons = buttons;
    setLayout(new GridLayout(5, 5, 20, 20));
    addButtonsToPane();
}

private void addButtonsToPane() {
    List<AppButton> buttons = this.appButtons;
    for (int i = 0; i < buttons.size(); i++) {
        this.add(buttons.get(i));
    }
}

private void removeAllButtonFocus() {
    for (int i = 0; i < this.appButtons.size(); i++) {
        this.appButtons.get(i).removeFocus();
    }
}

@Override
public void paintComponent(Graphics g) {
    super.paintComponent(g);
    setBackground(BACKGROUND_COLOR);
    repaint();
}

@Override
public void mouseClicked(MouseEvent e) {
    System.out.println("Pane Clicked");
    removeAllButtonFocus();
}

    ...Other MouseEvent methods

1 个答案:

答案 0 :(得分:2)

您可以通过将addMouseListener(this)放在AppButtonContainer类的构造函数中来解决手头的问题。否则,它永远不会拾取鼠标事件。

但是,通常情况下,将类转换为类似于mouselisteners的方法并不好。也许尝试创建一个内部类来侦听鼠标事件并将它们传递给AppButtonContainer。