Java jSplitPane鼠标悬停时显示和隐藏左窗格

Java jSplitPane鼠标悬停时显示和隐藏左窗格,java,swing,mouseevent,jsplitpane,Java,Swing,Mouseevent,Jsplitpane,我正在开发一个可以显示和隐藏分割平面的应用程序。 我读过一些关于如何获得这个的文章,但这不是我想要的 这是我写的代码: 我现在正在使用netbeans private void jSplitPane1MouseEntered(java.awt.event.MouseEvent evt) { if(MouseInfo.getPointerInfo().getLocation() == jSplitPa

我正在开发一个可以显示和隐藏分割平面的应用程序。 我读过一些关于如何获得这个的文章,但这不是我想要的

这是我写的代码:

我现在正在使用netbeans

private void jSplitPane1MouseEntered(java.awt.event.MouseEvent evt) {                                         
        if(MouseInfo.getPointerInfo().getLocation() == jSplitPane1.getLeftComponent().getLocation()){
           jSplitPane1.setDividerLocation(100);
           System.out.println("Mouse Entered");
       }else{
           jSplitPane1.setDividerLocation(20);
           System.out.println("Mouse Exited");
       }
    } 
我提到这些职位:


我想要发生的是,当我将鼠标移到jSplitPane的左侧时,我会按照我的第一个
if
语句将分隔符扩展到100,当它存在于左侧时,它会收缩回分隔符位置20。

这真的非常棘手

您可以在“左”组件上使用
MouseListener
,并监视
mouseenterned
mouseExited
事件,但当您移入和移出具有
MouseListener
的子组件(如
JButton
)时,也会触发这些事件

好的,您可以在
JSplitPane
上使用
MouseMotionListener
,监视
mouseMoved
事件,并检查鼠标光标的位置,但组件(左/右)获得自己的
MouseListener
时,这一切都会化为乌有,由于
MouseEvent
s不再传送到
JSplitPane

因此,最后一个选项是将全局
AWTListener
附加到事件队列,并监视
JSplitPane
本身上发生的事件,例如


这真的很棘手

您可以在“左”组件上使用
MouseListener
,并监视
mouseenterned
mouseExited
事件,但当您移入和移出具有
MouseListener
的子组件(如
JButton
)时,也会触发这些事件

好的,您可以在
JSplitPane
上使用
MouseMotionListener
,监视
mouseMoved
事件,并检查鼠标光标的位置,但组件(左/右)获得自己的
MouseListener
时,这一切都会化为乌有,由于
MouseEvent
s不再传送到
JSplitPane

因此,最后一个选项是将全局
AWTListener
附加到事件队列,并监视
JSplitPane
本身上发生的事件,例如


可以问题是?哦,我很抱歉!我在忙我的工作。我来编辑这篇文章。你看!我需要根据splitPane进行更改,因为在我的splitPane中是动态面板。好吗?问题是?哦,我很抱歉!我在忙我的工作。我来编辑这篇文章。你看!我需要根据splitPane进行更改,因为我的splitPane中有动态面板。很抱歉回复太晚,谢谢您的回答。我看到它工作得很好,但老实说,我不太确定如何将它添加到我的应用程序中。我使用的是NetBeans,我还不完全熟悉向组件添加自定义代码,但我从您的代码中了解到:
1。您获取了窗格的边界并检查它是否包含鼠标的当前位置。
然后,我感到困惑。基本上,我做的第一件事是检查
MouseEvent#点
是否在
JSplitPane
的边界内,然后我将
MouseEvent
转换为
JSplitPane
的上下文,然后检查
MouseEvent
是否在
leftPane
的上下文中
MouseEvent
s是上下文的,会自动转换为生成它们的组件的坐标上下文(即0x0是组件的左上角),谢谢!现在开始工作了!谢谢你解释这个概念。我只是想在把东西放进去之前了解一下它是如何工作的。我将不得不编译这篇文章,因为它在将来会很有用。很抱歉回复太晚,谢谢你的回答。我看到它工作得很好,但老实说,我不太确定如何将它添加到我的应用程序中。我使用的是NetBeans,我还不完全熟悉向组件添加自定义代码,但我从您的代码中了解到:
1。您获取了窗格的边界并检查它是否包含鼠标的当前位置。
然后,我感到困惑。基本上,我做的第一件事是检查
MouseEvent#点
是否在
JSplitPane
的边界内,然后我将
MouseEvent
转换为
JSplitPane
的上下文,然后检查
MouseEvent
是否在
leftPane
的上下文中
MouseEvent
s是上下文的,会自动转换为生成它们的组件的坐标上下文(即0x0是组件的左上角),谢谢!现在开始工作了!谢谢你解释这个概念。我只是想在把东西放进去之前了解一下它是如何工作的。我将不得不编译这个,因为它在将来会很有用。
import java.awt.AWTEvent;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.GridBagLayout;
import java.awt.Toolkit;
import java.awt.event.AWTEventListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JSplitPane;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class Main {

    public static void main(String[] args) {
        new Main();
    }

    public Main() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    ex.printStackTrace();
                }

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.add(new TestPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class TestPane extends JPanel {

        public TestPane() {
            setLayout(new BorderLayout());

            JSplitPane pane = new JSplitPane();
            pane.setLeftComponent(makePane(Color.RED));
            pane.setRightComponent(makePane(Color.BLUE));

            Toolkit.getDefaultToolkit().addAWTEventListener(new AWTEventListener() {
                @Override
                public void eventDispatched(AWTEvent event) {
                    if (event instanceof MouseEvent) {
                        MouseEvent me = (MouseEvent) event;
                        if (pane.getBounds().contains(me.getPoint())) {
                            System.out.println("Global Motion in the pane...");
                            me = SwingUtilities.convertMouseEvent(me.getComponent(), me, pane);
                            Component left = pane.getLeftComponent();
                            if (left.getBounds().contains(me.getPoint())) {
                                pane.setDividerLocation(100);
                            } else {
                                pane.setDividerLocation(20);
                            }
                        }
                    }
                }
            }, MouseEvent.MOUSE_MOTION_EVENT_MASK);

            // You don't need this, this is to demonstrate
            // that mouse events aren't hitting your component
            // via the listener
            pane.addMouseMotionListener(new MouseAdapter() {
                @Override
                public void mouseMoved(MouseEvent e) {
                    System.out.println("Motion in the pane...");
                    Component left = pane.getLeftComponent();
                    if (left.getBounds().contains(e.getPoint())) {
                        pane.setDividerLocation(100);
                    } else {
                        pane.setDividerLocation(20);
                    }
                }

            });
            pane.setDividerLocation(20);

            add(pane);
        }

        protected JPanel makePane(Color background) {
            JPanel pane = new JPanel() {
                @Override
                public Dimension getPreferredSize() {
                    return new Dimension(100, 100);
                }
            };
            pane.setLayout(new GridBagLayout());
            pane.add(new JButton("..."));
            pane.setBackground(background);
            pane.addMouseListener(new MouseAdapter() {
                @Override
                public void mouseClicked(MouseEvent e) {
                    System.out.println("...");
                }
            });
            return pane;
        }

    }

}