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

jSplitPane Showing and Hiding Left Pane when Mouse over

我正在开发一个允许我显示和隐藏分割平面的应用程序。 我已经阅读了一些关于如何获得它的文章,但这不是我想要的。

这是我写的代码:

我目前正在使用 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");
       }
    } 

我参考了这些帖子:

How to make JSplitPane auto expand on mouse hover?

Get Mouse Position

我想要发生的是,当我将鼠标悬停在 jSplitPane 的左侧时,我会根据我的第一个 if 语句将分隔线扩展到 100,并且当它存在于左侧时,它收缩回到分隔位置 20.

这真的非常棘手。

您可以在 "left" 组件上使用 MouseListener 并监视 mouseEnteredmouseExited 事件,但是当您进入和进入时,这些事件也会被触发从具有自己的 MouseListener 的子组件中提取(如 JButton)。

好的,您可以在 JSplitPane 上使用 MouseMotionListener 并监视 mouseMoved 事件并检查鼠标光标的位置,但这会在组件的那一刻发生(left/right) 获得自己的 MouseListener,因为 MouseEvent 不再传送到 JSplitPane

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

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

    }

}