java swing paint_Java Paint未在Swing中绘制

本文讨论了在Java Swing中遇到的绘图问题,指出Swing的`paintComponent`方法应完整重绘场景。文章比较了矢量图形(保存所有绘制操作)和位图(在内存中创建图像)两种方法的优缺点。矢量图形适合缩放,但可能因操作积累而变慢;位图速度快,支持位图操作,但内存消耗大且不能完美缩放。文中提供了一个例子,展示如何使用位图缓冲区进行绘图,同时指出了缩放限制。
摘要由CSDN通过智能技术生成

小编典典

有多种方法可以解决您的问题。@MattiasF和@MadProgrammer是正确的:Swing在做它应该做的事情。您的paintComponent方法应该重绘整个场景,而不是添加到前一个场景。

到目前为止,建议的解决方案会导致应用程序执行矢量图形处理:您正在记住原始的绘制操作,并且在每个绘制上都执行每个绘制操作(Java2D对其进行了一些优化,因为它实际上不会重绘区域。当前在屏幕上不可见的区域,但要弄清楚哪些区域是可见的,哪些区域不可见,也需要花费时间。

优点是,如果需要更大或更小的图像,则可以完美地缩放绘图操作。缺点是,一旦存储了许多绘图操作,它的速度可能会变慢,并且无法(轻松)进行位图操作。

另一种方法是位图方法。您可以在内存中建立绘图的位图,然后使用该paintComponent方法将位图绘制到屏幕上。

优点是通常更快。它还允许位图操作,并且针对此模型进行编程通常也更容易,因为您可以在需要时进行绘制,而不是在内存中构建一系列绘制操作。缺点是它使用更多的内存(直到您执行许多绘图操作为止),并且您无法再完美地缩放图像。

为了使您的工作,例如与保存在内存中的位图,添加等领域image,并imageGraphics为您的阶级,并更换您的鼠标监听ml,以及在paintComponent用下面的代码的方法:

private BufferedImage image = new BufferedImage(500, 500, BufferedImage.TYPE_INT_ARGB);

private Graphics2D imageGraphics = image.createGraphics();

public class ml extends MouseAdapter implements MouseMotionListener, MouseListener {

public void mousePressed(MouseEvent e) {

end = e.getPoint();

}

public void mouseDragged(MouseEvent e) {

start = end;

end = e.getPoint();

imageGraphics.setColor(c);

imageGraphics.setStroke(new BasicStroke(5));

imageGraphics.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);

imageGraphics.drawLine(start.x, start.y, end.x, end.y);

repaint();

}

public void mouseReleased(MouseEvent e) {

start = null;

end = null;

}

}

public void paintComponent(Graphics g) {

super.paintComponent(g);

Graphics2D g2 = (Graphics2D) g;

g2.drawImage(image, null, 0, 0);

}

您将立即看到缩放问题。位图缓冲区为500x500像素,超出此范围的任何内容都不会绘制。这基本上与Microsoft绘画的工作方式相同:开始绘制之前,您需要了解画布的大小。

2020-10-18

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值