有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

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

以下是我写的代码:

我目前正在使用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


共 (1) 个答案

  1. # 1 楼答案

    这真的很棘手

    您可以在“left”组件上使用MouseListener,并监视mouseEnteredmouseExited事件,但是当您移入和移出一个子组件时,这些事件也会被触发,该子组件本身有一个MouseListener(如JButton

    好的,您可以在JSplitPane上使用MouseMotionListener并监视mouseMoved事件并检查鼠标光标的位置,但当组件(左/右)获得它们自己的MouseListener时,这就糟了,因为MouseEvent不再被传递到JSplitPane

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

    SplitPane

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