JScrollPane中的Java图形和边界问题

JScrollPane中的Java图形和边界问题,java,swing,border,jscrollpane,jscrollbar,Java,Swing,Border,Jscrollpane,Jscrollbar,我已经找到了一个,我正试图把它完全变成我自己的(当然,这是合法的)。我立刻遇到了一个问题 我想要实现的不是在JScrollPane本身周围加上一个边框,而是一个可移动的块(如果你理解我的意思的话) 我已经把修改过的源代码放在下面,并强调了我的问题 package com.finn.chess; import java.awt.*; import java.awt.image.BufferedImage; import javax.swing.*; import javax.swing.plaf

我已经找到了一个,我正试图把它完全变成我自己的(当然,这是合法的)。我立刻遇到了一个问题

我想要实现的不是在
JScrollPane
本身周围加上一个边框,而是一个可移动的块(如果你理解我的意思的话)

我已经把修改过的源代码放在下面,并强调了我的问题

package com.finn.chess;

import java.awt.*;
import java.awt.image.BufferedImage;
import javax.swing.*;
import javax.swing.plaf.metal.MetalScrollBarUI;

/** @see https://stackoverflow.com/a/12270067/230513 */
public class CustomScrollbarUIExample {

public static void main(String[] args) {
    JScrollPane before = makeExamplePane();
    JScrollPane after = makeExamplePane();
    after.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
    JScrollBar sb = after.getVerticalScrollBar();
    sb.setUI(new MyScrollbarUI());
    JFrame f = new JFrame();
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    f.setLayout(new GridLayout(0,1));
    f.add(before);
    f.add(after);
    f.pack();
    f.setSize(320, 240);
    f.setVisible(true);
}

private static JScrollPane makeExamplePane() {
    JTextArea text = new JTextArea(16, 16);
    text.append("Lorem ipsum dolor sit amet…");
    JScrollPane scroll = new JScrollPane(text);
    return scroll;
}

static class MyScrollbarUI extends MetalScrollBarUI {

    private Image imageThumb, imageTrack;
    private JButton b = new JButton() {

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(0, 0);
        }

    };

    MyScrollbarUI() {
        imageThumb = FauxImage.create(32, 32, Color.blue.brighter());
        imageTrack = FauxImage.create(32, 32, Color.BLACK);
    }

    @Override
    protected void paintThumb(Graphics g, JComponent c, Rectangle r) {
        g.setColor(Color.blue);
        ((Graphics2D) g).drawImage(imageThumb,
            r.x, r.y, r.width, r.height, null);
    }

    @Override
    protected void paintTrack(Graphics g, JComponent c, Rectangle r) {
        ((Graphics2D) g).drawImage(imageTrack,
            r.x, r.y, r.width, r.height, null);
    }

    @Override
    protected JButton createDecreaseButton(int orientation) {
        return b;
    }

    @Override
    protected JButton createIncreaseButton(int orientation) {
        return b;
    }
}

private static class FauxImage {

    static public Image create(int w, int h, Color c) {
        BufferedImage bi = new BufferedImage(
            w, h, BufferedImage.TYPE_INT_ARGB);
        Graphics2D g2d = bi.createGraphics();
        g2d.setPaint(c);
        g2d.fillRect(0, 0, w, h);
        
        // THIS IS MY PROBLEM, THE BORDER
        g2d.setPaint(Color.WHITE);
        g2d.drawRect(0, 0, w-1, h-1);
        
        g2d.dispose();
        return bi;
    }
}
}
就在最后,您可以看到我设置了一个边框来围绕它。 但在大尺寸中,它看起来是这样的:

我不想让那大块白色从底部往下掉;我想要一个简单的,一像素高的边框。 我如何做到这一点?
另外,我正在发布一个全新的帖子,因为另一个帖子已经有2年了,我无法将所有这些添加到评论中。

在通过
drawImage()
缩放图像后,在
paintThumb()
中添加边框。从开始,使用
Color.red
作为重点,结果如下所示:

@Override
protected void paintThumb(Graphics g, JComponent c, Rectangle r) {
    g.setColor(Color.blue);
    Graphics2D g2d = (Graphics2D) g;
    g2d.drawImage(imageThumb, r.x, r.y, r.width, r.height, null);
    g2d.setPaint(Color.red);
    g2d.drawRect(r.x, r.y, r.width - 1, r.height);
}


“另外,我发布了一条全新的帖子,因为另一条……”什么?请提供一个链接。它在我的源代码顶部清楚地指出。/***请参阅*/如果我知道“那”指的是什么,我可能能够回答。不,这是一件好事。它在两个线程中都提供了链接,使得阅读任何一个线程的人都能轻松地看到链接。很漂亮!干杯,垃圾神。回答您自己的代码xD。我很感激。哦。我只是在黑色背景上尝试了Color.WHITE,当我向上滚动时,它会自动剪辑。所以这里留下了白色的痕迹。不管怎样,要解决这个问题吗?没关系。只是更改了drawRect()底部的代码;将-1添加到r.高度,以便。。。g2d.drawRect(r.x,r.y,r.width-1,r.height-1)@user3636058:这听起来很合理;
Graphics
API说,“绘制图形轮廓的操作是使用一支像素大小的笔在像素之间穿过一条无限细的路径,该笔向下悬挂在路径上的定位点右侧。”