当前位置: 首页 > 面试题库 >

使用图像制作自定义JScrollBar

陆文斌
2023-03-14
问题内容

因此,我使用Java Swing为我的应用程序构建UI,并使用自定义图像替换难看的Java图像,这些自定义图像具有样式,并且很容易集成到Java
Swing中。

现在我的问题是我需要使用JScrollBar一个JScrollPane在一个应用程序,我真的不想使用默认的Java滚动条,甚至本机OS滚动条。

我只希望能够将自定义图像作为滚动条的背景,并将图像作为滚动条的Thumb。

如何使用图像制作自定义JScrollBar?


问题答案:

我写了一个示例,展示了如何为滚动条的拇指和背景(称为轨迹)设置自定义图像。您需要两个文件,thumb.png并且track.png用于自定义图像的类文件位于同一位置。我还对图像进行了一些缩放以适合滚动条。只需对此代码进行一些试验。我更改了滚动条(setPreferredSize)的宽度,以便更好地查看图像。

要点是,您必须创建自己的类MyUi来扩展BasicScrollBarUI和覆盖paintThumband
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 );
    }

  }
}

有关更多信息,请参考sourcefile MetalScrollBarUI.java



 类似资料:
  • 问题内容: 我有一个.bmp图像,我想将其用作GUI的光标。该QCursor文件表明,这是可能的(“要创建自己的位图光标,要么使用QCursor构造函数需要一个位图和一个口罩或需要一个像素图作为参数构造函数”),但我似乎无法得到它在我收到’TypeError:QCursor():当我尝试将建议的模块与位图一起使用时,参数1具有意外的类型’str’时起作用。应该怎么做? 下面是产生上述错误的代码。该

  • 我目前正在使用itext-pdf生成PDF。除此之外,我还使用JFreeChart在上面创建图表。我已经创建了一个爆炸效果的甜甜圈图表,它看起来像这样。 然而,我想创建一个甜甜圈图,看起来更像这样。 我想让某些部分脱颖而出,但不要完全从甜甜圈图表中分离出来。我非常感谢关于如何实现这一目标的投入。

  • 问题内容: 我喜欢创建一个看起来像这个图像的java jframe。我已经创建了 具有不同形状(例如三角形,圆形,多边形和一些疯狂的 形状)的jframe。但是问题是很难[99%不可能]创建 这样的图像。我怎么能像这样的jframe。我用这段代码来创建 形状的窗口。 现在我可以将此图像转换为形状。然后设置setshapes。任何想法吗?还是 有办法使jframe的完全透明和jlable(使图像 完

  • 我想创建一个与自定义信息融合的页面。 API-(POST)汇流/rest/API/content 我能够成功上传文本和图像。如果我对上传到某处的图像使用src, 然后这个图像在我新创建的合流页面上成功可见。 但是,如果我使用src作为数据uri, 然后它不会显示图像。 请注意,API不会抛出任何错误,但也不会显示图像。 工作: 不工作: 任何帮助都将不胜感激。 谢谢

  • 简介 Xiaomi Cloud-ML支持Bring Your Own Image功能,允许用户传入自定义的Docker镜像来启动训练任务,可以解决训练任务依赖非Python库的问题。 注意,用户提供的镜像地址应该是公开可访问的,如果在DockerHub中下载镜像和启动任务时间较长。 制作Docker镜像 Cloud-ML的镜像中包含了平台通用的python,nvidia cuda,FDS FUSE

  • 问题内容: 我有许多heroshot图像,单击它们时会弹出模式弹出窗口。我试图使光标在图像上移动时变成放大镜。即使我的位置正确,以下CSS也似乎无法正常工作。 有没有人做过类似的事情?我不介意一个JavaScript解决方案(如果存在)。 编辑 :它可以在Safari中,但不能在Firefox中使用。 问题答案: 您的问题可能是光标URL在Mac的Firefox中不起作用。 通过使用关键字,可以在