java drawline变黑,为什么java.awt.Graphics.drawLine特别慢?

我正在尝试实现以下'网格'布局.

reKYo.png

该类正在扩展java.awt.Canvas,并在paint函数中绘制这些形状(或行).为什么选择帆布?点击这里,尝试初始化做类似的事情.

更新了MCVE代码以获取上述"布局":

import java.awt.BasicStroke;

import java.awt.BorderLayout;

import java.awt.Canvas;

import java.awt.Color;

import java.awt.Dimension;

import java.awt.Graphics;

import java.awt.Graphics2D;

import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;

import javax.swing.JButton;

import javax.swing.JFrame;

import javax.swing.JLabel;

import javax.swing.JPanel;

import javax.swing.SwingConstants;

import javax.swing.SwingUtilities;

import javax.swing.UIManager;

@SuppressWarnings("serial")

public class SO_MCVE extends JPanel {

private DrawingCanvas _drawingCanvas = null;

private JButton repaintBtn;

public SO_MCVE() {

super(new BorderLayout());

_drawingCanvas = new DrawingCanvas();

_drawingCanvas.setSize(new Dimension(600, 600));

JLabel repaintLabel = new JLabel(

"

" +

"REPAINT");

repaintLabel.setHorizontalAlignment(

SwingConstants.CENTER);

repaintBtn = new JButton();

repaintBtn.add(repaintLabel);

repaintBtn.addActionListener(new ActionListener() {

public void actionPerformed(ActionEvent e) {

_drawingCanvas.triggerRepaint();

}

});

add(_drawingCanvas, BorderLayout.CENTER);

add(repaintBtn, BorderLayout.PAGE_END);

}

private static void createAndShowGUI() {

JFrame frame = new JFrame("StackOverflow MCVE for drawLine");

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

frame.add(new SO_MCVE());

frame.pack();

frame.setVisible(true);

}

public static void main(String[] args) {

SwingUtilities.invokeLater(new Runnable() {

public void run() {

UIManager.put("swing.boldMetal", Boolean.FALSE);

createAndShowGUI();

}

});

}

}

@SuppressWarnings("serial")

class DrawingCanvas extends Canvas {

public static final Color lightGreen = new Color(0, 255, 0, 180);

public static final BasicStroke STROKE1PX = new BasicStroke(1.0f);

public static final BasicStroke STROKE3PX = new BasicStroke(3.0f);

private static final int LEFT = 50;

private static final int RIGHT = 550;

private static final int TOP = 50;

private static final int BOTTOM = 550;

private static final double WIDTH = 500.00d;

private static final double HEIGHT = 500.00d;

public DrawingCanvas() {

setBackground(Color.BLACK);

}

public void paint(Graphics g) {

update(g);

}

public void triggerRepaint() {

repaint();

}

public void update(Graphics g) {

Graphics2D g2 = (Graphics2D) g;

Dimension dim = getSize();

int w = (int) dim.getWidth();

int h = (int) dim.getHeight();

// Clears the rectangle that was previously drawn

g2.setPaint(Color.BLACK);

g2.fillRect(0, 0, w, h);

drawLines(g2, w, h);

}

/** Draw the lines marking the x-y limits **/

private void drawLines(Graphics2D g2, int w, int h) {

long start = System.nanoTime();

System.out.println("Start of drawLines(): " + start);

// Thick lines

g2.setPaint(Color.GREEN);

g2.setStroke(STROKE3PX);

g2.drawLine(LEFT, 0, LEFT, h);

g2.drawLine(RIGHT, 0, RIGHT, h);

g2.drawLine(0, TOP, w, TOP);

g2.drawLine(0, BOTTOM, w, BOTTOM);

System.out.println("Done drawing thick lines!");

long end = System.nanoTime();

System.out.println("Time taken (ns): " +

(end - start) + ", Time taken(ms): " +

((end - start)/1000/1000));

start = end;

// Thin vertical lines

g2.setPaint(lightGreen);

g2.setStroke(STROKE1PX);

int wInc = ((int) WIDTH) / 50;

for(int i = LEFT; i <= RIGHT; i += wInc) {

g2.drawLine(i, TOP, i, BOTTOM);

}

System.out.println("Done drawing vertical lines!");

end = System.nanoTime();

System.out.println("Time taken (ns): " +

(end - start) + ", Time taken(ms): " +

((end - start)/1000/1000));

start = end;

// Thin horizontal lines

g2.setPaint(lightGreen);

g2.setStroke(STROKE1PX);

int hInc = ((int) HEIGHT) / 50;

for(int i = TOP; i <= BOTTOM; i += hInc) {

g2.drawLine(LEFT, i, RIGHT, i);

}

System.out.println("Done drawing horizontal lines!");

end = System.nanoTime();

System.out.println("Time taken (ns): " +

(end - start) + ", Time taken(ms): " +

((end - start)/1000/1000));

System.out.println();

}

}

上面显示的代码的问题是,每当我调用时,渲染这些行需要一段时间(大约3秒)repaint().

按"重新绘制"按钮以在MCVE中触发重绘.

线条将逐一慢慢绘制,如下图所示:

HZ9l5.png

所以问题是:

有什么理由为什么drawLine这么慢?我尝试在类似的for循环中使用g2.draw(一些Ellipse2D.Double ..)绘制尽可能多的(如果不是更多)椭圆,并且没有问题.

注意:使用jre1.7.0_25,Windows 7,Eclipse

使用System.nanoTime()进行简单基准测试:

Done drawing thick lines!

Time taken (ns): 8858966, Time taken(ms): 8

Done drawing vertical lines!

Time taken (ns): 3649188968, Time taken(ms): 3649

Done drawing horizontal lines!

Time taken (ns): 106730282, Time taken(ms): 106

注意:绘制'细垂直线'是永远的!

更新:

注意:使用jre1.8.0_11,Windows 7,Eclipse

使用System.nanoTime()进行简单基准测试:

Done drawing thick lines!

Time taken (ns): 110027, Time taken(ms): 0

Done drawing vertical lines!

Time taken (ns): 185567, Time taken(ms): 0

Done drawing horizontal lines!

Time taken (ns): 195419, Time taken(ms): 0

注意:使用jre1.8.0_45,Windows 7,Eclipse

使用System.nanoTime()进行简单基准测试:

Done drawing thick lines!

Time taken (ns): 6716121, Time taken(ms): 6

Done drawing vertical lines!

Time taken (ns): 2427676380, Time taken(ms): 2427

Done drawing horizontal lines!

Time taken (ns): 83030042, Time taken(ms): 83

显然,jre1.8.0_11工作得很好?

我如何运行不同的jre版本(不确定我是否正确执行!):

GHx4H.png

谢谢!:)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值