java - JSplitPane 小边框但大抓取命中框

标签 java swing jsplitpane

我有两个 JPanel 合并在一个 JSplitPane 中。用户应该能够非常自由地移动分割 Pane 分隔线,但分隔线不应该太大(最好情况下只有 1 像素)。

有没有办法将dividerSize保持为1,但增加点击divider的hitbox?这样,当单击鼠标时,分隔线每侧可能 20px 也会被抓取?

最佳答案

您可以向组件添加 MouseListener 并手动调整分隔线位置。

这是一个帮助您入门的基本示例:

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class DividerListener extends MouseAdapter
{
    private JSplitPane splitPane;
    private Component component;
    private int pressedX;
    private int dividerLocation;

    public DividerListener(JSplitPane splitPane, Component component)
    {
        this.splitPane = splitPane;
        this.component = component;
        component.addMouseListener(this);
        component.addMouseMotionListener(this);
    }

    @Override
    public void mousePressed(MouseEvent e)
    {
        pressedX = SwingUtilities.convertPoint(component, e.getPoint(), splitPane).x;
        dividerLocation = splitPane.getDividerLocation();
    }

    @Override
    public void mouseDragged(MouseEvent e)
    {

        int draggedX = SwingUtilities.convertPoint(component, e.getPoint(), splitPane).x;
        int deltaX = draggedX - pressedX;
        splitPane.setDividerLocation(dividerLocation + deltaX);
    }

    private static void createAndShowGUI()
    {
        JSplitPane splitPane = new JSplitPane();

        JLabel left = new JLabel("LEFT");
        splitPane.setLeftComponent(left);
        new DividerListener(splitPane, left);

        JLabel right = new JLabel("RIGHT");
        splitPane.setRightComponent(right);
        new DividerListener(splitPane, right);

        JFrame frame = new JFrame("SSCCE");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add( splitPane);
        frame.setLocationByPlatform( true );
        frame.setSize(200, 200);
        frame.setVisible( true );
    }

    public static void main(String[] args)
    {
        EventQueue.invokeLater( () -> createAndShowGUI() );
/*
        EventQueue.invokeLater(new Runnable()
        {
            public void run()
            {
                createAndShowGUI();
            }
        });
*/
    }
}

您需要自定义逻辑来检查鼠标是否在左侧组件的右边缘或右侧组件的左边缘按下。因此,您可能需要添加另一个参数,以便知道如何进行边界检查。

然后您需要设置一个标志,以便 mouseDragged 代码可以处理该事件或在您距离边缘不够近时忽略它。

关于java - JSplitPane 小边框但大抓取命中框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37462651/

相关文章:

Java:打印数组中数字的位置

java - 如何创建一个新的 Action 监听器

java - 评估通过文件与编码创建 GUI

java - iText5 : Header content is coming two times while creating PDF

java - 删除 @ManyToMany 关联 Spring Data Jpa 时出现 ConcurrentModificationException

java - JSplitPane 调整光标大小

java - 在拖动 JSplitPane 分隔线时如何避免(或消耗)鼠标事件?

java - 检测 JSplitPane 分隔线移动

java - Android:将 Foursquare 集成到应用程序中

java - 鼠标悬停时背景图像发生变化的 JButton