我找到了CustomScrollbarUIExample
,我正在尝试将其完全更改为我自己的(attribution,当然,这是合法的)。我马上就遇到了问题。
我想要实现的是在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岁,我不能将所有这些添加到评论中。
答案 0 :(得分:1)
在paintThumb()
缩放图片之后,在drawImage()
,中添加边框。从original开始并使用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);
}