- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
所以我使用 Java Swing 为我的应用程序构建 UI,并使用自定义图像来替换丑陋的 Java 图像,自定义图像具有样式并且很容易集成到 Java Swing 中。
现在我的问题是我需要在应用程序中使用 JScrollBar
和 JScrollPane
而我真的不想使用默认的 Java 滚动条或甚至 native 操作系统滚动条。
我只是希望能够将自定义图像作为滚动条的背景和一个图像作为滚动条的缩略图。
如何使用图片制作自定义的JScrollBar?
最佳答案
我写了一个示例,展示了如何为滚动条的缩略图和背景(称为轨道)设置自定义图像。您需要两个文件 thumb.png
和 track.png
用于自定义图像,它们位于您的类文件所在的同一位置。我还对图像进行了一些缩放以适合滚动条。只需用这段代码试验一下。我更改了滚动条的宽度 (setPreferredSize
) 以更好地查看图像。
要点是您必须创建自己的类 MyUi
扩展 BasicScrollBarUI
并覆盖 paintThumb
和 paintTrack
,并使用 setUI(new MyUI)
个性化您的滚动条:
import java.awt.*;
import java.io.FileReader;
import java.io.IOException;
import javax.swing.*;
import javax.swing.plaf.metal.MetalScrollBarUI;
import javax.imageio.ImageIO;
import java.io.File;
import java.awt.geom.AffineTransform;
public class CustomScrollbarUIExample {
public static void main(String[] args) {
JScrollPane before = makeExamplePane();
JScrollPane after = makeExamplePane();
JScrollBar sb=after.getVerticalScrollBar();
sb.setPreferredSize(new Dimension(50, Integer.MAX_VALUE));
sb.setUI(new MyScrollbarUI());
JFrame f = new JFrame();
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Container c = f.getContentPane();
c.setLayout(new GridLayout(2, 1, 0, 1));
c.add(before);
c.add(after);
f.setSize(450, 400);
f.setVisible(true);
}
private static JScrollPane makeExamplePane() {
String exampleText= "Lorem ipsum dolor sit amet,\n consetetur sadipscing elitr,\n sed diam nonumy eirmod \ntempor invidunt ut labore et dolore \nmagna aliquyam erat,\n sed diam voluptua. At vero eos et accusam et \njusto duo dolores et ea rebum. Stet clita\n kasd gubergren, no sea\n takimata sanctus est Lorem ipsum dolor sit amet.\n Lorem ipsum dolor sit amet,\n consetetur sadipscing elitr, sed diam\n nonumy eirmod tempor invidunt \nut labore et dolore\n magna aliquyam erat, sed diam voluptua.\n At vero eos et accusam et justo \nduo\n dolores et ea rebum. Stet clita kasd gubergren, no sea\n takimata sanctus est Lorem\n ipsum dolor sit amet. Lorem ipsum dolor\n sit amet, consetetur sadipscing elitr,\n sed diam nonumy\n eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos\n et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est \nLorem ipsum dolor sit amet.Duis\n autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel\n illum dolore eu feugiat nulla facilisis at vero eros et \naccumsan et iusto odio \ndignissim qui blandit praesent luptatum zzril delenit augue\n duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer\n adipiscing elit, sed diam nonummy nibh euismod \ntincidunt ut laoreet\n dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam,\n quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea\n commodo consequat. Duis autem vel eum iriure \ndolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla \nfacilisis at vero eros et accumsan et iusto odio dignissim qui blandit\n praesent luptatum zzril delenit augue duis dolore \nte feugait nulla facilisi.";
JTextArea text = new JTextArea(exampleText);
JScrollPane scroll = new JScrollPane(text);
return scroll;
}
static class MyScrollbarUI extends MetalScrollBarUI {
private Image imageThumb, imageTrack;
MyScrollbarUI() {
try {
imageThumb = ImageIO.read(new File("thumb.png"));
imageTrack = ImageIO.read(new File("track.png"));
} catch (IOException e){}
}
@Override
protected void paintThumb(Graphics g, JComponent c, Rectangle thumbBounds) {
g.translate(thumbBounds.x, thumbBounds.y);
g.setColor( Color.red );
g.drawRect( 0, 0, thumbBounds.width - 2, thumbBounds.height - 1 );
AffineTransform transform = AffineTransform.getScaleInstance((double)thumbBounds.width/imageThumb.getWidth(null),(double)thumbBounds.height/imageThumb.getHeight(null));
((Graphics2D)g).drawImage(imageThumb, transform, null);
g.translate( -thumbBounds.x, -thumbBounds.y );
}
@Override
protected void paintTrack(Graphics g, JComponent c, Rectangle trackBounds) {
g.translate(trackBounds.x, trackBounds.y);
((Graphics2D)g).drawImage(imageTrack,AffineTransform.getScaleInstance(1,(double)trackBounds.height/imageTrack.getHeight(null)),null);
g.translate( -trackBounds.x, -trackBounds.y );
}
}
}
有关详细信息,请参阅源文件 MetalScrollBarUI.java
。
关于java - 使用图像制作自定义 JScrollBar,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12265740/
大家晚上好; 我java swing我正在尝试有一个如图所示的菜单 (图中左侧) 但是,看起来比我想象的要困难。我有边框布局,我把盒子布局放在中间,jscroll栏放在右边。在框布局内,我但带有图标的
我添加了以下代码,用于在文本字段中显示滚动条。但它仍然没有出现。有人可以帮我解决这个问题吗?我无法弄清楚错误发生在哪里: public JTextArea talkArea = new JTextAr
我想创建一个水平滚动条,其最大值设置为2(它应该只允许选择0、1或2作为值),但如果该值小于11,旋钮是不可见的。 scrlLineDist = new JScrollBar(); s
我正在尝试将垂直的 JScrollBar 放在 JPanel 的顶部。我可以很容易地添加滚动条,但是当我运行程序时,我的滚动条没有任何效果。我可以上下拖动它,但 JPanel 的内容不会移动。我已经阅
当我将JScrollBar的visibleAmount设置为等于最大值时,JScrollbar的 slider 消失了。我不知道为什么?我想让滚动条像这样: [] (拇指的大小充满了 JScrollb
我想自定义滚动条对象的输出。下面的代码适用于 JTextPane,那么 JScrollBar 的等效代码是什么? private JTextPane textPane; StyledD
如何根据滚轮鼠标旋转量以编程方式移动 JScrollBar? 最佳答案 您可以使用 JScrollBar 的 setValue 方法来设置滚动条的位置。 或者,您可以使用 JScrollBar 后面的
我想完全改变一个 scollbar 的外观,但是重写 JScrollBar 和 paintComponent 方法不起作用,track 和 thumb 被绘制了但是左右箭头保持不变。 我还在 JScr
所以我使用 Java Swing 为我的应用程序构建 UI,并使用自定义图像来替换丑陋的 Java 图像,自定义图像具有样式并且很容易集成到 Java Swing 中。 现在我的问题是我需要在应用程序
背景 希望在 JScrollPane 的角落添加一个滚动锁定按钮不遮挡视口(viewport)内容。下图显示了一个 JScrollPane包裹在 SwingNode在 JavaFX 应用程序中: 右下
(经过描述,代码中的事情就清楚了) 我有一个程序,其中包含 JScrollBar、JTextArea、JTextFields、JButtons 和其他一些东西。 (我只添加了SSCCE代码) 好的,我
我正疯狂地尝试制作一个更大的 JScrollBar。我想做一个更大的结和轨道...以及 JScrollBar 本身。 我在这里找到了一些代码来扩展我自己的 BasicScrollBarUI 来更改颜色
如果滚动 Pane 的 View 组件足够大,则滚动条拇指很小,因此无法在 Windows L&F 上正确绘制。 这只是一个审美问题;滚动条功能正常,其他 L&F 似乎一切都很好。 有办法解决吗?也许
我希望能够使用 JScrollBar 更改形状的位置和/或大小。我对 Swing 组件还很陌生,但已经弄清楚如何更改字符串的位置,但我不知道如何使用从 PaintComponent 绘制的形状来实现它
我的框架上有一个 JScrollBar,而不是 ScrollFrame 中,并且滚动条旋钮/ slider 非常薄。我尝试更改滚动条的属性,并尝试制作自定义 JScrollBar 组件,但我无法找到更
我有一个 jScrollbar,当我滚动它时(它的值从 0 到 100),我想在文本字段中显示该值。这是如何从 jScrollBar 获取值 AdjustmentListener adjListene
我有一系列列标签,它们独立于下面矩阵中显示的数据滚动。除了悬停时,我可以使整个滚动条透明。标签正对着数据,我喜欢这样,但是,在悬停时,除非我移动垂直滚动条(我宁愿不这样做),否则滚动条会遮住所有标签的
如何改变 JScroll Bar 中箭头的高度?我能够改变宽度滚动条,但箭头的高度仍然很小。感谢您的帮助。 最佳答案 绘画是由几个 BasicArrowButtons 完成的,它们的绘画方法中有这个:
在我的应用程序中,我有两个 Swing 组件在彼此之上,看起来像下图。问题是橙色组件需要一个垂直滚动条,但我希望组件的右边缘保持完全对齐(并且宽度可以随着用户使应用变宽或变窄而变化)。如果我使用网格布
因此有一个 JScrollBar 的构造函数,如下所示: public JScrollBar(int orientation, int value, int extent, int min, int
我是一名优秀的程序员,十分优秀!