如何避免在任何嵌套组件上触发mouseExited [英] how to avoid mouseExited to fire while on any nested component

查看:101
本文介绍了如何避免在任何嵌套组件上触发mouseExited的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在我的代码中,我有:

一个扩展JComponent的抽象类,其中包含一些JTextField. JTextFields是不可编辑的. JComponent类实现MouseListener: -当mouseEntered事件触发时,将添加边框. -当mouseExited事件触发边框时,将删除边框. -当mouseClicked事件触发时,该组件的所有字段均设置为可编辑.

an abstract class extending JComponent which contains some JTextFields. JTextFields aren't editable. JComponent class implement MouseListener: - when mouseEntered event fires a border is added to it. - when mouseExited event fires border is removed. - when mouseClicked event fires all fields of that component are set as editable.

这应该以这种方式工作:

  • 用户要编辑字段.
  • 他将鼠标悬停在jComponent的任意点上
  • 在jComponent上绘制边框以突出显示它
  • 用户单击并触发mouseClicked方法来执行其工作.

问题是: 当鼠标悬停在任何JTextField上时,将触发mouseExited. 您将如何解决该问题?

The problem is: mouseExited fires when the mouse goes over on any JTextField. How would you solve the problem?

下面是一个简单的类,该类将向您显示一个包含jTextField的窗口,该窗口包含在面板中,该面板以与上述类似的方式实现MouseListener.不要考虑它是怎么写的,只是出于目的!

What follows is a simple class which will show you a window with a jTextField contained into a panel which implement MouseListener in a way pretty similar to the one described above. Do not take into consideration how it's written, it s just for purpose!

public static void main(String[] args)  {       
        SwingUtilities.invokeLater(new Runnable() {
            public void run(){   
                int i=0;
                //mainWindow
                    JFrame mainWindow = new JFrame("MyFrame");
                    mainWindow.setLayout(new BorderLayout());
                    mainWindow.setMinimumSize(new Dimension(200,200));

                    JPanel viewPort = new JPanel();

                    final JTextField text = new JTextField("SOME_RANDOM_TEXT");
                    text.setEditable(false);

                    final JPanel panel = new JPanel();
                    panel.add(text);
                    panel.setBackground(Color.green);
                    panel.addMouseListener(new MouseListener() {
                        @Override
                        public void mouseReleased(MouseEvent e) {
                            //NOTHING
                        }
                        @Override
                        public void mousePressed(MouseEvent e) {
                            //NOTHING
                        }

                        @Override
                        public void mouseExited(MouseEvent e) {
                            panel.setBorder(BorderFactory.createEmptyBorder());
                        }

                        @Override
                        public void mouseEntered(MouseEvent e) {
                            panel.setBorder(BorderFactory.createLineBorder(Color.BLUE));
                        }

                        @Override
                        public void mouseClicked(MouseEvent e) {
                            ((JTextField)panel.getComponent(0)).setEditable(true);
                            panel.getComponent(0).requestFocus();
                        }
                    });
                    viewPort.add(panel);
                    mainWindow.add(viewPort,BorderLayout.CENTER);
                    mainWindow.setVisible(true);
            }
        });
    }

推荐答案

您可以检查事件的鼠标点,以确定该点是否仍在面板的边界内:

You can check the mouse point of the event to determine if the point is still in the bounds of the panel or not:

panel.addMouseListener(new MouseAdapter()
{
    @Override
    public void mouseExited(MouseEvent e)
    {
        Rectangle r = e.getComponent().getBounds();
        Point p = e.getPoint();

        if (p.x < 0 || p.x >= r.width
        ||  p.y < 0 || p.y >= r.height)
            panel.setBorder( null );
    }

    @Override
    public void mouseEntered(MouseEvent e)
    {
        panel.setBorder(BorderFactory.createLineBorder(Color.BLUE));
    }
});

扩展MouseAdapter更容易,那么您只需要覆盖要自定义的方法即可.

It is easier to extend MouseAdapter, then you only need to override the methods you want to customize.

这篇关于如何避免在任何嵌套组件上触发mouseExited的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆