如何在JPanel中绘制一些不会被重新绘制的东西,我正在做一个交通模拟程序,我希望绘制一次道路,因为它不会改变。 谢谢如何在jPanel上绘制一些不会重新绘制的东西?
1
A
回答
3
我不确定你是否真的想让你的道路永远不会被重新粉刷 - 例如,当你的窗口被调整大小时,或者在另一个窗口阻挡它时,它会变得可见,重新绘制事件。如果你的面板从不重绘,那么它看起来很奇特。
至于我记得,秋千才会触发适当的绘画事件这样的情况下,所以你应该以下子类JPanel的用合适的替代通常的方法是确定:
public class RoadPanel extends JPanel {
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
// your drawing code here
}
}
如果缓存的路转换为图像或其他图形格式(以节省多次计算显示数据),一次绘制后,这可能会为您节省下一段时间的绘制时间。
3
据我所知,没有,除非有一个透明的覆盖技巧。
我看到(并且确实)的大多数图形应用程序只是在每次重绘时重新绘制整个面板。现在,您可以在图形缓冲区中执行一次,然后通过将图形缓冲区复制到JPanel来快速绘制整个背景。它应该比调用所有图形基元来绘制道路更快。或者,某些2D游戏的做法,可能只画一次,然后更新移动的部分,如精灵:它需要擦除精灵使用的旧地点(在那里恢复背景)并重新绘制精灵新的地方。因此,您仍然拥有图形缓冲区中的道路副本,但不是每次重新绘制整个道路,只更新一些小部分。可以稍快一点。
1
我所做的是设置一个布尔值,以确定某个部分是否需要重绘。然后,在paintComponent()
方法中,我可以检查值并重绘某些东西,或不。
protected void paintComponent(Graphics g){
super.paintComponent(g);
if (drawRoad) {
drawRoadMethod(g);
}
drawTheRest(g);
}
有点像那样。
3
每次面板被遮挡时(例如,框架最小化/另一个窗口放在顶部),组件需要重新绘制。因此只绘制一次东西不会像你想要的那样工作。为了使不改变的部分得到更有效的绘制,您可以将它们绘制成一个“缓冲”图像,然后每次需要重绘面板或组件时绘制该缓冲区。
// Field that stores the image so it is always accessible
private Image roadImage = null;
// ...
// ...
// Override paintComponent Method
public void paintComponent(Graphics g){
if (roadImage == null) {
// Create the road image if it doesn't exist
roadImage = createImage(width, height);
// draw the roads to the image
Graphics roadG = roadImage.getGraphics();
// Use roadG like you would any other graphics
// object to draw the roads to an image
} else {
// If the buffer image exists, you just need to draw it.
// Draw the road buffer image
g.drawImage(roadImage, 0, 0, null);
}
// Draw everything else ...
// g.draw...
}
相关问题
- 1. 如何在Cocoa的AVPlayer视频上绘制一些东西?
- 2. FillRect不会绘制任何东西
- 3. glDrawArrays不会绘制任何东西?
- 4. Libgdx Sprite.draw()不会绘制任何东西
- 5. glDrawElements不会绘制任何东西
- 6. 如何继续在没有重绘的情况下单击按钮后在JPanel上绘制某些东西?
- 7. iOS:如何让绘图板像绘制一些东西?
- 8. 如何重新绘制BorderLayout中的JPanel
- 9. 如何在前端的bing地图绘制一些东西?
- 10. Canvas.drawVertices(...)绘制任何东西
- 11. ImageIcon.paintIcon不会在JPanel上绘制图像
- 12. 如何在Gtk#窗口上绘制某些东西(线,圆等)?
- 13. JPanel不在JFrame上绘制
- 14. 在JButton的右上角绘制一些东西
- 15. 在我的LinearLayout上绘制一些东西?
- 16. tslib工具不会在屏幕上绘制任何东西
- 17. DirectX Demo不会在屏幕上绘制任何东西
- 18. paintGL不会在屏幕上绘制任何东西
- 19. Canvas.DrawBitmap()不会在android上绘制任何东西! (
- 20. 如何取消重新绘制JPanel?
- 21. JPanel不会正确绘制
- 22. 试图重新绘制一个jpanel
- 23. 如何在JPanel上的JLabel上“绘制”?
- 24. 绘制方法不绘制任何东西
- 25. 如何绘制可滚动的东西?
- 26. 如何在默认的绘制结果顶部的子类控件绘制方法中绘制某些东西?
- 27. 堆叠JPanel重新绘制不正确
- 28. JPanel在分配新子类时不会重新绘制
- 29. matplotlib绘制不显示任何东西
- 30. drawRect不想绘制任何东西