我在Java GUI中使用jLayeredPane。我在jLayeredPane的DEFAULT_LAYER上添加了一些面板(jPanelsLayer1),并且每个jPanel都有一个MouseAdapter,它覆盖mouseEntered和mouseExited用于我的目的。当我在JlayerdePane的PALETTE_LAYER上添加另一个组件(jPanelsLayer2),在jPanelsLayer1的顶部,并为它们定义了MouseAdapter时,我遇到了问题。当鼠标进入公共区域时,mouseEntered和不同层的jPanel的mouseExited连续运行几次。我只想在jpanelLayer1的顶部看到jPanelslayer2 mouseAdapters时它们是活动的。也许解决方案是删除jPanelLayer1 mouseAdapter。但这没有效果。
请指导我..... sajad
答案 0 :(得分:3)
我不确定你的问题出在哪里,因为当我测试它时,即使Palette面板位于Default面板上,当鼠标位于Palette面板上方时,鼠标仅在Palette面板中处于活动状态。例如,这是我的SSCCE来测试这个概念。随意修改它以向我们展示您的问题:
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Point;
import java.awt.event.*;
import javax.swing.*;
@SuppressWarnings("serial")
public class LayeredFun extends JLayeredPane {
private static final int JLP_WIDTH = 400;
private static final int JLP_HEIGHT = 400;
private static final Dimension PANEL_SIZE = new Dimension(200, 200);
public LayeredFun() {
JPanel defaultPanel = createPanel("Default Panel", new Point(10, 10), Color.cyan);
JPanel palettePanel = createPanel("Palette Panel", new Point(100, 100), Color.pink);
add(defaultPanel, JLayeredPane.DEFAULT_LAYER);
add(palettePanel, JLayeredPane.PALETTE_LAYER);
}
private JPanel createPanel(String name, Point location, Color color) {
JPanel defaultPanel = new JPanel();
defaultPanel.setSize(PANEL_SIZE);
defaultPanel.setLocation(location);
MyMouseAdapter defaultMouseAdapater = new MyMouseAdapter(name);
defaultPanel.addMouseListener(defaultMouseAdapater);
defaultPanel.addMouseMotionListener(defaultMouseAdapater);
defaultPanel.setBackground(color);
defaultPanel.setBorder(BorderFactory.createTitledBorder(name));
return defaultPanel;
}
@Override
public Dimension getPreferredSize() {
return new Dimension(JLP_WIDTH, JLP_HEIGHT);
}
private class MyMouseAdapter extends MouseAdapter {
private String name;
public MyMouseAdapter(String name) {
this.name = name;
}
@Override
public void mouseEntered(MouseEvent e) {
System.out.printf("%s: mouseEntered%n", name);
}
@Override
public void mouseExited(MouseEvent e) {
System.out.printf("%s: mouseExited%n", name);
}
@Override
public void mouseMoved(MouseEvent e) {
System.out.printf("%s: mouseMoved%n", name);
}
}
private static void createAndShowUI() {
JFrame frame = new JFrame("LayeredFun");
frame.getContentPane().add(new LayeredFun());
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
public static void main(String[] args) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
createAndShowUI();
}
});
}
}