获取 knob/thumb 个位置的 JScrollPane
Get knob/thumb postion JScrollPane
我需要在 JScrollPane 中获取 knob/thumb 的确切中间点或顶点,因此当前获得焦点的组件(具有黄色背景的组件)将跟随拇指。可能吗?
ps。很抱歉错过了代码示例,但实现相当大。
也许有一种方法可以获取滚动窗格的 thumb/knob,但我不知道。这是找到你想要的东西的几何方法。
我们将添加一个调整侦听器,然后获取滑块的值。从这个值我们可以计算出滑块移动的场景分数。然后我们得到滚动条的高度,我们可以用分数来找到旋钮的位置。
double relativePositionOnScreen = height*model.getValue()/(model.getMaximum() - model.getMinimum());
旋钮在屏幕上的位置必须相对于视口移动,因此我们可以将值添加到它。
这是一个示例,其中有一个滚动窗格,滚动窗格内部是一个面板,上面有一个框,紧跟旋钮。
import javax.swing.*;
import java.awt.Dimension;
import java.awt.Component;
import java.awt.geom.*;
import java.awt.Graphics;
import java.awt.Graphics2D;
public class ScrollByMe{
public static void main(String[] args){
Rectangle2D rect = new Rectangle2D.Double(0, 0, 0, 0);
JFrame frame = new JFrame("scroll by me");
JPanel panel = new JPanel(){
@Override
public void paintComponent(Graphics g){
super.paintComponent(g);
((Graphics2D)g).draw(rect);
}
};
panel.setPreferredSize( new Dimension(200, 800) );
JScrollPane scroller = new JScrollPane( panel);
JScrollBar bar = scroller.getVerticalScrollBar();
bar.addAdjustmentListener( e ->{
BoundedRangeModel model = bar.getModel();
Dimension d = bar.getSize();
double height = d.getHeight();
double buttonHeight = model.getExtent() * height / (model.getMaximum() - model.getMinimum());
//maximum *value* range.
double relativePositionOnScreen = height*model.getValue()/(model.getMaximum() - model.getMinimum());
rect.setRect( 40, model.getValue() + relativePositionOnScreen, 40, buttonHeight);
panel.repaint();
});
frame.add(scroller);
frame.setSize(200, 400);
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}
我需要在 JScrollPane 中获取 knob/thumb 的确切中间点或顶点,因此当前获得焦点的组件(具有黄色背景的组件)将跟随拇指。可能吗?
ps。很抱歉错过了代码示例,但实现相当大。
也许有一种方法可以获取滚动窗格的 thumb/knob,但我不知道。这是找到你想要的东西的几何方法。
我们将添加一个调整侦听器,然后获取滑块的值。从这个值我们可以计算出滑块移动的场景分数。然后我们得到滚动条的高度,我们可以用分数来找到旋钮的位置。
double relativePositionOnScreen = height*model.getValue()/(model.getMaximum() - model.getMinimum());
旋钮在屏幕上的位置必须相对于视口移动,因此我们可以将值添加到它。
这是一个示例,其中有一个滚动窗格,滚动窗格内部是一个面板,上面有一个框,紧跟旋钮。
import javax.swing.*;
import java.awt.Dimension;
import java.awt.Component;
import java.awt.geom.*;
import java.awt.Graphics;
import java.awt.Graphics2D;
public class ScrollByMe{
public static void main(String[] args){
Rectangle2D rect = new Rectangle2D.Double(0, 0, 0, 0);
JFrame frame = new JFrame("scroll by me");
JPanel panel = new JPanel(){
@Override
public void paintComponent(Graphics g){
super.paintComponent(g);
((Graphics2D)g).draw(rect);
}
};
panel.setPreferredSize( new Dimension(200, 800) );
JScrollPane scroller = new JScrollPane( panel);
JScrollBar bar = scroller.getVerticalScrollBar();
bar.addAdjustmentListener( e ->{
BoundedRangeModel model = bar.getModel();
Dimension d = bar.getSize();
double height = d.getHeight();
double buttonHeight = model.getExtent() * height / (model.getMaximum() - model.getMinimum());
//maximum *value* range.
double relativePositionOnScreen = height*model.getValue()/(model.getMaximum() - model.getMinimum());
rect.setRect( 40, model.getValue() + relativePositionOnScreen, 40, buttonHeight);
panel.repaint();
});
frame.add(scroller);
frame.setSize(200, 400);
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}