java - 我怎样才能让 JPanel 在窗口滚动时自动更新?

标签 java user-interface swing

我是 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/

相关文章:

c++ - 用不同的线程处理gui

python - Qgridlayout 控制widget的大小

java - 将多行 JTextArea 写入 txt 文件

java构建多维数组,其中的单元格是数组列表

java - 需要更好的模板语言

c# - 如何增加整个应用程序的字体大小(C#)

java - 用颜色填充圆圈

java - 显示表标题的上下文菜单并获取列索引?

java - PostgreSQL JDBC - 可以删除但不能重新创建索引

java - J表: Complex Cell Renderer