将MouseListener添加到两个相邻的JComponent,Bug

时间:2016-10-12 10:26:54

标签: java swing event-handling mouselistener

我创建了一个名为FAdjacentTooltips的组件,它显示有关另一个JComponent(JLabel,JPanel ...)的信息,当鼠标进入此组件时,当鼠标退出时消失,这里是事件初始化FAdjacentToolTips类:

this.holderComponent.addMouseListener(new MouseAdapter() {
    @Override
    public void mouseExited(MouseEvent e) {

        FAdjacentToolTips.this.setSize(0, 0);
        FAdjacentToolTips.this.revalidate();
        FAdjacentToolTips.this.repaint();

    }

    @Override
    public void mouseEntered
            (MouseEvent e) {
        if (!activationFlag) {
            FAdjacentToolTips.this.build();
            activationFlag = true;
        }
        FAdjacentToolTips.this.setSize(toolTypeWidth, toolTypeHeight);
        FAdjacentToolTips.this.revalidate();
        FAdjacentToolTips.this.repaint();
    }
});

当鼠标进入JComponent:holderComponent时,FAdjacentToolTips设置为给定大小,当鼠标退出holderComponent时,FAdjacentToolTips大小设置为零。

FAdjacentToolTips添加到一个组件时效果很好,但有问题 当它添加到两个Adjacents JComponents(一个接近另一个)时,这是一个带有两个JLabel的例子

public static void main(String[] args) throws FileNotFoundException, IOException {
    JFrame frame = new JFrame();
    try {
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
    } catch (Exception ex) {

    }
    frame.setMinimumSize(new Dimension(1280, 700));
    frame.setExtendedState(JFrame.MAXIMIZED_BOTH);
    frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
    frame.setLayout(new BorderLayout());

    CustomLabel firstLabel = new CustomLabel("first Label", Color.yellow);
    firstLabel.setLocation(100, 100);

    CustomLabel secondeLabel = new CustomLabel("second Label", Color.blue);
    secondeLabel.setLocation(100, 300);

    JPanel panel = new JPanel(null);
    panel.setOpaque(true);
    panel.setPreferredSize(new Dimension(2000, 2000));
    panel.setBackground(Color.red);

    panel.add(secondeLabel);
    panel.add(firstLabel);

    firstLabel.addFAdjacentToolTip("AAAAAAAA", FAdjacentToolTipable.LEFT_OF_CONTAINER);
    secondeLabel.addFAdjacentToolTip("BBBBB", FAdjacentToolTipable.LEFT_OF_CONTAINER);

    panel.setPreferredSize(new Dimension(2000, 2000));
    frame.getRootPane().getContentPane().add(panel, BorderLayout.CENTER);
    frame.setVisible(true);

}


class CustomLabel extends JLabel implements FAdjacentToolTipable {

    public CustomLabel(String text, Color color) {
        super(text);
        this.setSize(new Dimension(200, 200));
        this.setOpaque(true);
        this.setBackground(color);
    }

    @Override
    public void addFAdjacentToolTip(String text, int side) {
        FAdjacentToolTips fAdjacentToolTips = new FAdjacentToolTips(this, text, side, Color.WHITE, Color.BLACK, Color.black, this.getFont());
        fAdjacentToolTips.activate();

    }
}

firstLabel位于secondLabel的顶部,这是问题行为:

  • 将鼠标从外部移动到其中一个标签时效果很好,当鼠标进入/退出标签时,FAdjacentToolTips显示/消失

  • 将鼠标从firstLabel移动到secondLabel时,firstLabel FAdjacentToolTips会消失(根据需要),但secondLabel FAdjacentToolTips不会出现。

经过多次测试后,我收集了一些信息:

即使FAdjacentToolTips没有显示在屏幕上,也会调用mouseEnter方法,并且大小设置正确

我的问题是:为什么FAdjacentToolTips在从一个标签移动到另一个标签时不显示,即使事件被很好地触发,并且大小设置正确?

这是一个测试程序的可运行程序: 这是源代码:http://www.filedropper.com/javatest 这是runnable:http://www.filedropper.com/javatest_1

了解我的问题: 1 - 尝试将鼠标从JFrame移动到其中一个标签。 2 - 尝试将鼠标从一个标签移动到另一个标签

如果您需要更多信息,请告诉我。

0 个答案:

没有答案