当前位置: 首页 > 知识库问答 >
问题:

Java2D drawString非常慢?

祁晟
2023-03-14

我试图使用Java Swing/AWT 2D图形在窗口中显示一些非常基本的信息。在这一点上,我只是画了一些弦,但是尽管这个任务看起来并不困难,但它运行得非常慢。

import javax.swing.*;
import java.awt.*;

public class Example {
    public static void main(String[] args) {
        JFrame frame = buildFrame();
        JPanel pane = new JPanel() {
            int counter = 0;

            @Override
            public void paintComponent(Graphics g) {
                super.paintComponent(g);
                Graphics2D g2 = (Graphics2D)g;
                g2.setColor(Color.black);
                g2.drawString(Integer.toString(counter++), 20, 20);
                g2.drawString("HALLO", 50, 50);
                g2.drawString("HALLO", 50, 60);
                g2.drawString("HALLO", 50, 70);
                g2.drawString("HALLO", 50, 80);
                g2.drawString("HALLO", 50, 90);
                g2.drawString("HALLO", 50, 100);
                g2.drawString("HALLO", 50, 110);
                g2.drawString("HALLO", 50, 120);
                g2.drawString("HALLO", 50, 130);
                g2.drawString("HALLO", 50, 140);
                g2.drawString("HALLO", 50, 150);
                g2.drawString("HALLO", 50, 160);
                g2.drawString("DIES IST NUR EINT EST FÜR EINEN LANGENSTRING", 200, 160);
                g2.drawString("DIES IST NUR EINT EST FÜR EINEN LANGENSTRING", 200, 170);
                g2.drawString("DIES IST NUR EINT EST FÜR EINEN LANGENSTRING", 200, 180);
                g2.drawString("DIES IST NUR EINT EST FÜR EINEN LANGENSTRING", 200, 190);
                g2.drawString("DIES IST NUR EINT EST FÜR EINEN LANGENSTRING", 200, 100);
                g2.drawString("DIES IST NUR EINT EST FÜR EINEN LANGENSTRING", 200, 110);
                g2.drawString("DIES IST NUR EINT EST FÜR EINEN LANGENSTRING", 200, 120);
                g2.drawString("DIES IST NUR EINT EST FÜR EINEN LANGENSTRING", 200, 130);
                g2.dispose();
            }
        };
        frame.add(pane);

        while (true) {
            pane.repaint();
            frame.setVisible(true);
        }
    }

    private static JFrame buildFrame() {
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        frame.setSize(480, 272);
        frame.setVisible(true);
        return frame;
    }
}

我是不是根本上错过了什么?

共有1个答案

田丰
2023-03-14

不如先将字符串绘制到BufferedImage中:

BufferedImage bi = new BufferedImage(pane.getSize().width, pane.getSize().height, BufferedImage.TYPE_INT_RGB);
Graphics2D g2D = bi.createGraphics();
g2D.drawString("HALLO", 50, 50);
...
g2D.dispose();

缓存它,在paintComponent()中,只需绘制图像

g2D.drawImage(bi, 0, 0, this);
 类似资料:
  • 我正在尝试新的Python Interactive Broker API,但我在第一步遇到了一些严重的速度问题... 下面的代码(见下文)重复了两次 直到数据被接收完毕 直到应用程序完全断开连接。。。 为什么这么慢?最好的加速方法是什么? 我还试图在后台持续运行它,以便只在运行时提交请求 但速度也非常慢。有什么建议吗

  • 问题内容: 我很想使用BrowserSync进行开发。但是,页面加载(不仅是更改后重新加载)非常慢。 我使用模式。在没有BrowserSync的情况下浏览网页的速度应该很快。 原因之一可能是我安装BrowserSync时出现以下错误: 我从头开始安装节点(使用和软件包安装程序),但无法摆脱错误。 此外,如果使用Gulp或在命令行上运行BrowserSync,也没有什么不同。 任何想法? 问题答案:

  • 我搜索了数据库和食谱,但似乎找不到正确的答案。我有一个非常简单的python代码,它总结了一个范围内的自我权力。我需要这个非常非常大的数字的最后十位,我已经尝试了get上下文(). prec,但是我仍然达到了极限。 代码如下: 我怎么能看到这些美丽的数字?它在我的四核上打印速度相对较快。这只是为了给ProjectEuler带来乐趣,问题#48,请不要破坏者。我不想要解决方案,也不想让工作为我完成,

  • 非常道CSS框架是一个国内开源CSS框架,它具有良好的规范性、兼容性、易用性。除了框架有一个良好的展示效果外,还规划了一套比较合理的自定义CSS入库规则,这使得这套框架可以更好的满足一些使用者的CSS定制需求。最后也是最重要的一点,它还处在测试阶段,你的支持和意见将会就是我们坚持的动力,让我们一起使它更加完善,在此感谢! 在线演示:http://www.icsser.com/feichangdao

  • 问题内容: 一些背景信息:我想在Red Hat服务器上运行脚本以从/ dev / random中读取一些数据,并使用Perl unpack()命令将其转换为十六进制字符串,以备后用(基准数据库操作)。我在/ dev / random上运行了一些“ head -1”,它看起来工作得很好,但是多次调用后,它还是会挂起。几分钟后,它将最终输出一小段文本,然后结束。 我切换到/ dev / urandom

  • 问题内容: 这是我用来填写QT Designer中绘制的表格的代码。设计为对任何表通用,它可以正常工作,但是…当我尝试显示包含18列和〜12000行的datasat时,它冻结30秒或更长时间。因此,我做错了什么,有没有办法加快速度,保持代码仍然适合任何表? 那是我的代码: 问题答案: 这里是一个测试脚本,它比较了几种填充表格的方法。 自定义模型要快得多,因为它不必先创建所有项- 但请注意,这是一个