Java图形和JScrollPane中的边框问题

标签 java swing border jscrollpane jscrollbar

我找到了 CustomScrollbarUIExample ,我正在尝试将其完全更改为我自己的(使用 attribution ,当然,这是合法的)。我立即遇到了问题。

我想要实现的是不是在 JScrollPane 本身周围放置边框,而是在可移动的 block 周围放置边框(如果您理解我的意思的话)。

我已经把修改后的源代码放在下面,我已经突出显示了我的问题。

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

就在最后,您可以看到我在它周围设置了一个边框。 但在大尺寸时,它看起来像这样:

Scroll bar

我不希望底部有大块白色;我想要一个简单的、一像素高的边框。 我如何实现这一目标? 另外,我发布了一个全新的线程,因为另一个线程已有 2 年历史,我无法将所有这些添加到评论中。

最佳答案

paintThumb() 中添加边框,图像被 drawImage() 缩放后。从 original 开始并使用Color.red强调,结果如下:

image

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

关于Java图形和JScrollPane中的边框问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26881056/

相关文章:

html - 将 border-radius 应用于 box-shadow 但不应用于 div 本身

java - 我的 .jar 文件不会执行任何操作

java - Hibernate + spring获取最新的lazy 1 to N属性值

java - 瓷砖定义解释。 .* 和 {1} 有什么作用?

java - 验证具有最少数字字符数的数组

android - Cordova 3.4 Android - 专注于输入导致 div 移动/创建边框

java - JPanel 上边距为 0

java - 为什么需要强制转换为 (LayoutManager) 来设置布局?

java - 自定义类变量和 GUI 文本字段

html - 边界半径不像预期的那样圆