我有两个 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/