我是 Java 的新手,所以这可能非常简单,但我不确定如何让它工作。
基本上,我有一个用于绘制网格的类,它扩展了 JPanel。我将此类放在 JScrollPane 内的窗口中。滚动按照我想要的方式工作,除了我类(class)内的绘图在窗口滚动后不会自行更新。如果调整窗口大小,它会更新。
我想我应该使用事件/监听器或类似的东西,但我不确定从哪里开始寻找。
编辑:另外,当我打开其中一个菜单并且它重叠在绘图上时,菜单覆盖的区域不会更新。
好吧,让我们再试一次: 我有一个名为 draw 的类。然后我有一个 GridBagLayout out of draws。这创建了我需要的网格。我有一个围绕网格移动的对象,因此我可以通过这种方式更新网格,而无需自己计算必须更新的矩形。
然后这个网格在一个没有子类化的 JScrollPane 里面。我在创建窗口时使用 pack() ,但问题是,窗口可能比分辨率允许的要大,所以我需要它是可滚动的。滚动对我有用,但在我使用它时它不会更新图像。但是,调整窗口大小确实会更新它。
我想要的是一种在单击 JScrollPane 时重绘所有窗口的方法。现在,一旦我访问菜单,我还需要重绘整个东西(或某些部分,我稍后会看到),因为菜单下的网格的绘制部分没有更新。
这是我能描述的最好的方式。
最佳答案
只需为 scrolling viewport change 事件添加一个监听器并发出 repaint()。我想我会反对 Steve Moyer 的回答,因为绘画只能作为绘画 Activity 的一部分进行。
如果滚动的组件足够大,您应该重新绘制在视口(viewport)组件(您的 JScrollPane)中可见的 JPanel 部分。
编辑
要跟踪视口(viewport)的移动,请使用 JScrollPane getViewport() 和 JViewport addChangeListener()。然后在绘制方法中确定要绘制的区域时,使用JViewport的方法来确定 View 的哪些部分是可见的。请注意,这应该是仅在通过在每个绘制事件中重绘整个 View 而正常工作后才应用的优化。
关于java - 我怎样才能让 JPanel 在窗口滚动时自动更新?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/579993/