0

我想制作一个带有Swing布局的Java程序,其中左侧有一个菜单,当鼠标悬停在菜单区域上时会展开,但在鼠标离开后会自动收缩。

我试图模仿 Android 的移动 Youtube 或 Weebly 的编辑器之类的效果。对于那些不知道的人来说,这两种布局的左侧都有菜单,当您的鼠标悬停在它们上方时会展开。然后在您的鼠标离开该区域后,菜单再次收缩并且不在视线范围内。

我能够JSplitPane成功创建包含我的菜单,但我不知道如何在用户的鼠标悬停在JSplitPane组件上时使其自动展开,或者如何在鼠标离开该区域后使其收缩。

如果有人想知道为什么:这种类型的菜单对用户来说很容易使用,但是因为它在不需要时会隐藏起来,所以我可以为程序的主要部分留出更多空间。

任何帮助将不胜感激谢谢!

4

2 回答 2

2

有两个基本问题...

  1. 您需要检测鼠标何时悬停在分隔线和
  2. 当它存在时,“菜单”

第二种比较简单,可以使用aMouseListener和监听mouseExit事件,在鼠标离开时设置分割窗格分隔符的位置。

虽然这很复杂,好像用户通过跨越分隔线存在“菜单”,这可能会触发“菜单”再次可见......

第一个问题比较复杂,因为它JSplitPane包含三个组件,左右组件,还有一个分隔器组件。 JSplitPane实际上并不允许访问分隔线,这很烦人,因为它使用自己的鼠标侦听器,它会阻止鼠标事件进入拆分本身。

相反,您需要通过 UI 委托来访问它。

一旦你设置了鼠标监听器,你需要确保菜单只有在菜单被隐藏时才会显示,为此,我只是检查了“菜单”组件的大小

例如...

import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Insets;
import java.awt.Rectangle;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionAdapter;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JSplitPane;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.plaf.basic.BasicSplitPaneDivider;
import javax.swing.plaf.basic.BasicSplitPaneUI;

public class TestSpltPane {

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

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

                final JPanel left = new JPanel();
                left.setBackground(Color.RED);
                left.setPreferredSize(new Dimension(100, 100));
                JPanel right = new JPanel();
                right.setBackground(Color.BLUE);
                right.setPreferredSize(new Dimension(100, 100));
                final JSplitPane sp = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, left, right);
                sp.setDividerLocation(0);

                BasicSplitPaneDivider divider = ((BasicSplitPaneUI) sp.getUI()).getDivider();
                divider.addMouseListener(new MouseAdapter() {

                    @Override
                    public void mouseEntered(MouseEvent e) {
                        if (left.getWidth() == 0) {
                            sp.setDividerLocation(100);
                        }
                    }

                });

                left.addMouseListener(new MouseAdapter() {

                    @Override
                    public void mouseExited(MouseEvent e) {
                        sp.setDividerLocation(0);
                    }

                });

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

}
于 2013-11-27T19:58:27.807 回答
2

好好利用jSplitPan.setDividerLocation(location);:设置分隔线的位置。location- 指定 UI 特定值(通常是像素数)的 int。

jSplitPane1.addMouseMotionListener(new MouseMotionAdapter() {
            public void mouseMoved(MouseEvent evt) {
                // use evt.getSource() if needed
                jSplitPan1.setDividerLocation(location);
            }
        });

您可能需要稍微智能地计算分频器位置。提示:通过计算相关的首选大小提示。相关部分应由您发现。

查看官方教程页面即可了解:How to use MouseMotionListeners包括其他事件侦听器。

于 2013-11-27T19:18:38.157 回答