获取旋钮拇指位置 JScrollPane(滚动条)

问题描述 投票:0回答:1

我需要在JScrollPane中得到一个旋钮拇指的准确中点或顶点,这样当前聚焦的组件(黄色背景的那个)就会跟着拇指走。这可能吗?

enter image description here

ps. 对不起,没有提供代码示例,但实现的内容比较多。

java swing jpanel jscrollpane
1个回答
2
投票

也许有一种方法可以抓住滚动窗格的拇指旋钮,但我不知道。这里有一个几何方法可以找到你想要的东西。

我们将添加一个调整监听器,然后得到滑块的值。从该值我们可以计算出滑块沿场景移动的分数。然后我们得到滚动条的高度,我们可以用这个分数来找到旋钮的位置。

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);
    }

}
© www.soinside.com 2019 - 2024. All rights reserved.