好的,因此,在我正在制作的此程序中,用户将能够在计算机上创建其喜爱的应用程序的快捷方式。我猜我的程序有点像是应用程序的枢纽。我有一个小问题,它涉及两个类:AppButton
和AppButtonContainer
。它们都实现了MouseListener
,但是AppButton
扩展了JComponent
,而AppButtonContainer
扩展了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
最佳答案
您可以通过将addMouseListener(this)
放入AppButtonContainer类的构造函数中来解决当前的问题。否则,它将永远不会拾取鼠标事件。
但是,通常来说,将类变成类似的鼠标监听器并不是很好。也许尝试创建一个内部类来侦听鼠标事件,并将其传递给AppButtonContainer。