当前位置: 首页 > 知识库问答 >
问题:

如何避免鼠标在任何嵌套组件上退出以触发

司寇凯
2023-03-14

在我的代码中,我有:

一个扩展JComponent的抽象类,其中包含一些JTextFields。JTextFields是不可编辑的。JComponent类实现了MouseListener:-当mouseEnted事件触发时,将向其添加一个边框。-当mouseExted事件触发时,边框被删除。-当mouseClick事件触发时,该组件的所有字段都设置为可编辑。

这应该是这样的:

  • 用户想要编辑一个字段

问题是:当鼠标在任何JTextField上移动时,mouseExited会触发。你将如何解决这个问题?

下面是一个简单的类,它将向您展示一个包含jTextField的窗口,该窗口包含在一个面板中,以与上面描述的非常相似的方式实现MouseListener。不要考虑它是如何编写的,它只是为了目的!

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);
            }
        });
    }

共有2个答案

萧韬
2023-03-14

问题是您将MouseListener设置为JPanel,这没有多大意义(对于所需描述的行为)。

只需将MouseListener更改为JTextField

text.addMouseListener(new MouseListener() {

这对我来说很好。

更新:

你错过了一些东西,伴侣:)谢谢你的快速回答,但是,我的JPanel可以包含更多,然后一个文本字段,它可以包含例如,10个!

这个例子可以作为例子,但是在现实生活中,你不会创建一个内心的听众,你会创建一个类。

class MyMouseListener implements MouseListener {
    // define methods and behaviour
}

然后您将它添加到您的可选区域,如:

MyMouseListener listener = new MyMouseListener()
panel1.addMouseListener(listener);
panel2.addMouseListener(listener);
panel3.addMouseListener(listener);

提示:记住MouseEvent扩展自ComponentEvent,它有一个很棒的方法getComponent()

返回事件的发起人。

杭涵映
2023-03-14

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

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更容易,那么您只需要覆盖要自定义的方法。

 类似资料:
  • 在Java,有没有一种方法可以避免在调用的每个级别上嵌套null检查,以确保沿途没有阻止下一次调用的null。有没有一个优雅的方法来做这件事? 例如: Objone.ObjTwo.ObjTree.ObjFour.ObjF

  • 问题内容: 避免嵌套查询有多重要。 我一直学会避免像瘟疫一样躲避它们。但是对我来说,它们是最自然的事情。在设计查询时,我首先写的是嵌套查询。然后,我将其转换为联接,有时需要花费很多时间才能正确。而且很少会带来很大的性能提升(有时确实会提高) 他们真的那么糟糕吗?有没有一种方法可以使用没有临时表和文件排序的嵌套查询 问题答案: 这确实取决于我遇到的情况,我可以通过使用子查询来改进一些查询。 我知道的

  • 问题内容: 我想用SQL编写脚本,该脚本会将这2个表(A,B)复制到其他2个表(C,D),并具有与A,B相同的结构。 重要提示 : 表C,d是 不是 必要的空 多个进程可以同时调用脚本 表A具有表B的外键(fk_a_b) 假设将表B复制到D之后,这就是我得到的 现在,当我将表A复制到CI时,需要知道,ID = 21现在映射到ID = 51,ID = 32映射到ID = 52。最后,表C将为: 由于

  • 问题内容: 我已经使用Java已有一段时间了,但是我对循环的教育还是有点不足。我知道如何创建存在于Java中的每个循环以及如何打破循环。但是,最近我想到了: 假设我有两个嵌套循环。我可以只使用一条语句来打破两个循环吗? 这是我到目前为止所拥有的。 有没有办法做到这一点? 问题答案: 在Java中,您可以使用标签来指定要中断/继续的循环:

  • 我有一组按顺序完成的操作,但如果中间序列返回“null”,我希望尽早中止该操作(跳过后续步骤)。 我想出了一个这样的函数,它给出了一个输入参数,对Redis执行几个操作,如果存在的话,它将返回一个乘积。由于中间请求中有一个可能返回空值,所以整个操作可能会“失败”,因此我想缩短后续的不必要步骤。

  • 我需要从mongo(v3.2.10)集合(使用Pymongo 3.3.0)中获取大量(例如1亿)文档并迭代它们。迭代需要几天时间,我经常遇到由于游标超时而导致的异常。 在我的例子中,我需要在迭代时睡上不可预知的时间。例如,我可能需要:-获取10个文档-睡眠1秒-获取1000个文档-睡眠4小时-获取1个文档等 我知道我可以: 完全禁用超时,但如果可能的话,我希望避免这种情况,因为如果我的代码完全停止