Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何避免子GUI对象接管鼠标侦听器?_Java_Swing_Events_Mouselistener - Fatal编程技术网

Java 如何避免子GUI对象接管鼠标侦听器?

Java 如何避免子GUI对象接管鼠标侦听器?,java,swing,events,mouselistener,Java,Swing,Events,Mouselistener,MyFatherPanel通过鼠标输入(红色)/退出(橙色)鼠标事件更改颜色。它工作得很好,但是当我输入按钮“Testbutton”(这是我父亲面板的子组件)时,鼠标退出事件就会出现。但我仍然在我父亲的小组里 有人能给我解释一下为什么以及如何解决这样一个问题吗 我希望父面板是橙色的,只要我的鼠标在面板内(无论鼠标是否在子对象上) 在mouseExited事件中,可以检查鼠标点是否仍在父组件的边界内 比如: addMouseListener(new MouseAdapter() { @Ov

My
FatherPanel
通过鼠标输入(红色)/退出(橙色)鼠标事件更改颜色。它工作得很好,但是当我输入按钮“Testbutton”(这是我父亲面板的子组件)时,鼠标退出事件就会出现。但我仍然在我父亲的小组里

有人能给我解释一下为什么以及如何解决这样一个问题吗

我希望父面板是橙色的,只要我的鼠标在面板内(无论鼠标是否在子对象上)


在mouseExited事件中,可以检查鼠标点是否仍在父组件的边界内

比如:

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)
            setBackground( Color.RED );
    }

    @Override
    public void mouseEntered(MouseEvent e)
    {
        setBackground( Color.ORANGE );
    }
});
addMouseListener(新的MouseAdapter()
{
@凌驾
公共无效mouseExited(MouseEvent e)
{
矩形r=e.getComponent().getBounds();
点p=e.getPoint();
如果(p.x<0 | | p.x>=r.width
||p.y<0 | | p.y>=r.高度)
挫折地面(颜色:红色);
}
@凌驾
公共无效鼠标事件(鼠标事件e)
{
挫折背景(颜色为橙色);
}
});

注意:扩展
MouseAdapter
更容易,因为您只需要实现想要处理的方法。

您还可以在编辑父面板颜色的按钮上添加鼠标侦听器。Java GUI必须在不同的操作系统、屏幕大小、屏幕分辨率等上工作。在不同的地区使用不同的PLAF。因此,它们不利于像素完美布局。而是使用布局管理器,或者与布局填充和边框一起使用。@XtremeBaumer:我考虑过,但是我必须对每个子组件都这样做。安德鲁·汤普森:你确定裁员经理能解决这个问题吗?我为父面板尝试了FlowManager,但行为是相同的:
public FatherPanel(){setSize(300300);setLayout(new FlowLayout());setBackground(Color.RED)
layoutmanager不会解决这个问题。他只是告诉你,因为你使用的是绝对布局。想象一下,你在一个1920x1080的屏幕上工作,并为你制作全尺寸的应用程序。然后你在一台屏幕为800x800的pc上执行应用程序。这会导致一些真正混乱的gui,layoutmanager会帮助你防止ent thisThx是您的解决方案。但是,我问自己是否有办法让子组件(在我的例子中是按钮)将鼠标输入的事件传递到父面板。但我不知道在哪个主题下搜索。我想它可能类似于“动作传递”或“事件传递”。你能帮我看看哪里吗?@Serek,如果你向组件添加了一个侦听器,那么组件只能侦听事件。因此,如果你要向按钮添加一个侦听器,那么你可以使用组件。dispatchEvent(…)。但是,您需要转换事件以将事件源更改为面板,而不是添加额外工作的按钮。您已经声明不希望向所有组件添加侦听器,因此我给了您一个简单的解决方案。别忘了“接受”通过单击复选标记可以找到答案,这样人们就知道问题已经解决了。感谢您提供的解决方案。我将查看dispatchEvent()方法。选中标记:-)如果我已经从JFrame扩展了视图,如何使用mouseAdapter?我无法从第二个类扩展。
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)
            setBackground( Color.RED );
    }

    @Override
    public void mouseEntered(MouseEvent e)
    {
        setBackground( Color.ORANGE );
    }
});