java - Swing 中带有自定义绘画的分层面板

标签 java swing

我正在用 Java 编写 map 应用程序,使用 Swing 作为 UI(我在本文末尾附上了原型(prototype)图)。该 map 是使用扩展 JPanel 的自定义 MapPanel 类实现的。 map 作为一系列 300x300 图像(瓦片)从服务器获取,只要调用其 paintMap() 方法,这些图像就会绘制在 MapPanel 上。由于代码的长度和复杂性(多个类等),我无法在此处包含所有代码,但 paintMap() 方法基本上是这样工作的:

// Loop for each map tile (image, xPos, yPos)
getGraphics().drawImage(image, xPos, yPos, 300, 300, null);

我想让另一个 JPanel(包含一个用于缩放控制的 JSlider)覆盖在 map 面板的顶部,但我很难让它工作。每当我绘制 map 时,覆盖的 JPanel 都会消失。如果我在 paintMap() 方法中重新绘制覆盖的 JPanel,当拖动 map 时它会严重闪烁(因此会不断重新绘制)。

关于如何在不闪烁的情况下实现我的 UI 有什么建议吗?

UI prototype

最佳答案

getGraphics().drawImage(image, xPos, yPos, 300, 300, null); // WRONG!!
  1. 不要调用 getGraphics() - 而是覆盖 JPanelJComponentpaintComponent(Graphics) > 并根据要求进行绘画。
  2. 使用this作为ImageObserver

关于java - Swing 中带有自定义绘画的分层面板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9856093/

相关文章:

java - 代码设计: performance vs maintainability

java - 未登录时禁用 JButton

java - KeyListener 和 MouseListener 不工作

java - 如何将多个元素相互对齐?

java - ActionListener 不适用于所有对象

java - 防止 JLabel 位置重置?

java - 在日志中显示线程 ID 而不是线程名称

java - 在数据库中存储 BitSet 数组的最佳方法?

java - cacerts 和 keystore 有什么区别?

java - JTable 不会更新 fireXXXXX() 事件