Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JSplitPane小边框但大抓取盒_Java_Swing_Jsplitpane - Fatal编程技术网

Java JSplitPane小边框但大抓取盒

Java JSplitPane小边框但大抓取盒,java,swing,jsplitpane,Java,Swing,Jsplitpane,我有两个JPanel组合在一个JSplitPane中。用户应该能够非常自由地移动拆分窗格分隔符,但分隔符不应该太大(最好仅1px) 有没有办法让dividerSize保持在1,但增加点击分隔符的点击框?因此,当点击鼠标时,分隔器的每侧也会被抓取20像素?您可以向组件添加鼠标侦听器,并手动调整分隔器的位置 以下是一个让您开始学习的基本示例: import java.awt.*; import java.awt.event.*; import javax.swing.*; public class

我有两个JPanel组合在一个JSplitPane中。用户应该能够非常自由地移动拆分窗格分隔符,但分隔符不应该太大(最好仅1px)


有没有办法让dividerSize保持在1,但增加点击分隔符的点击框?因此,当点击鼠标时,分隔器的每侧也会被抓取20像素?

您可以向组件添加鼠标侦听器,并手动调整分隔器的位置

以下是一个让您开始学习的基本示例:

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代码可以处理事件,或者在距离边缘不够近时忽略事件