首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JSlider图像跟踪

JSlider图像跟踪
EN

Stack Overflow用户
提问于 2016-06-01 09:26:51
回答 1查看 180关注 0票数 1

我想把一个图像(一个音频的可视化)后面的JSlider,它代表音频播放器,播放的过程。首先,我试图覆盖滑翔机的油漆方法。

代码语言:javascript
复制
public void paintComponent(Graphics g) {
    // Draw the previously loaded image to Component
    g.drawImage(img, 0, -100, null);
    super.paintComponent(g);
}

这是可行的,但图像比滑块要高,所以我的下一次尝试是JLayeredPane,我将JSlider放在带有图像的JLabel之上。第一分钟看上去不错。但我提到过,我需要的是滑块的轨道后面的图像,而不是整个滑块。左边和右边都有空间。有人能告诉我如何计算这个空间吗?还是磁道到滑块边框的宽度和偏移量?这应该在Windows和MacOs下运行,因为这是不同的LookAndFeels,所以我认为硬编码的值不能工作。带背景图像的示例滑翔机

谢谢你。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-06-23 09:44:29

我现在解决这个问题的解决方案是覆盖SliderUI。这是一个非常特殊的组件,所以在所有LookAndFeels上看起来都是一样的,这是不相关的。它还支持直接跳转到鼠标位置,这与BasicSliderUI不同。

代码语言:javascript
复制
/**
 *
 * Custom SliderUI for AudioPlayer with audioimage in background
 */
public class AudioSliderUI extends BasicSliderUI {

    private BasicStroke stroke = new BasicStroke(1f, BasicStroke.CAP_ROUND, 
            BasicStroke.JOIN_ROUND, 0f);

    public AudioSliderUI(AudioSlider b) {
        super(b);
    }

    @Override
    public void paint(Graphics g, JComponent c) {
        Graphics2D g2d = (Graphics2D) g;
        g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, 
                RenderingHints.VALUE_ANTIALIAS_ON);
        super.paint(g, c);
    }

    @Override
    protected Dimension getThumbSize() {
        return new Dimension(2, 200);
    }

    @Override
    public void paintTrack(Graphics g) {
        Graphics2D g2d = (Graphics2D) g;
        Stroke old = g2d.getStroke();
        g2d.setStroke(stroke);
        g2d.setPaint(Color.WHITE);
        if (slider.getOrientation() == SwingConstants.HORIZONTAL) {
            g2d.drawLine(trackRect.x, trackRect.y + trackRect.height / 2, 
                    trackRect.x + trackRect.width, trackRect.y + trackRect.height / 2);
        } else {
            g2d.drawLine(trackRect.x + trackRect.width / 2, trackRect.y, 
                    trackRect.x + trackRect.width / 2, trackRect.y + trackRect.height);
        }
        g2d.setStroke(old);
        Image img = ((AudioSlider)slider).getImage();
        g2d.drawImage(img, trackRect.x, trackRect.y, trackRect.width, trackRect.height, slider);

    }

    @Override
    public void paintThumb(Graphics g) {
        Rectangle knobBounds = thumbRect;
        int w = knobBounds.width;
        int h = 100;
        int newStarty = knobBounds.height/2- h/2;
        g.translate(knobBounds.x, knobBounds.y);

        //     "plain" version
        g.setColor(Color.YELLOW);
        g.fillRect(0, newStarty, w, h);

    }

    @Override
    protected TrackListener createTrackListener(JSlider slider) {
        return new TrackListener() {
            @Override
            public void mousePressed(MouseEvent e) {
                if (UIManager.getBoolean("Slider.onlyLeftMouseButtonDrag")
                        && SwingUtilities.isLeftMouseButton(e)) {
                    JSlider slider = (JSlider) e.getComponent();
                    switch (slider.getOrientation()) {
                    case SwingConstants.VERTICAL:
                        slider.setValue(valueForYPosition(e.getY()));
                        break;
                    case SwingConstants.HORIZONTAL:
                        slider.setValue(valueForXPosition(e.getX()));
                        break;
                    default:
                        throw new IllegalArgumentException(
                                "orientation must be one of: VERTICAL, HORIZONTAL");
                    }
                    super.mousePressed(e); // isDragging = true;
                    super.mouseDragged(e);
                } else {
                    super.mousePressed(e);
                }
            }

            @Override
            public boolean shouldScroll(int direction) {
                return false;
            }
        };
    }
}

匹配滑块:

代码语言:javascript
复制
public class AudioSlider extends JSlider {

    private Image img;

    public AudioSlider() {
        setOpaque(false);
    }

    /**
     * @return the img
     */
    public Image getImage() {
        return img;
    }

    public void setImage(Image img) {
        this.img = img;
    }
}

为我工作,也许不涵盖所有的前景。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37564592

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档