我怎样才能使窗口滚动时JPanel自动更新?

时间:2009-02-24 00:26:34

标签: java user-interface swing

我是Java的新手,所以这可能很简单,但我不确定如何让它工作。

基本上,我有一个用于绘制网格的类,它扩展了JPanel。我把这个类放在JScrollPane里面的窗口中。滚动按照我想要的方式工作,除了窗口滚动后我的类中的绘图不会自动更新。如果窗口调整大小,它会更新。

我想我应该使用事件/听众或类似的东西,但我不知道从哪里开始寻找。

编辑:同样,当我打开其中一个菜单并且它在图纸上重叠时,菜单覆盖的区域不会更新。

好的,我们再试一次: 我有一个名为draw的类。然后我有一个平局的GridBagLayout。这创建了我需要的网格。我有一个物体围绕网格移动,所以这样我就可以更新网格,而不必自己计算必须更新的矩形。

然后这个网格位于JScrollPane中,而不是子类。我在创建Window时使用pack(),但问题是,Window可能比分辨率允许的大,所以我需要它可以滚动。滚动适用于我,但它在我使用它时不会更新图像。但是,调整窗口大小会更新它。

当我点击JScrollPane时,我想要的是重绘所有窗口的方法。现在,我还需要重新绘制整个事物(或者某些部分,稍后我会看到),一旦我访问菜单,因为菜单下的网格绘制部分不会更新。

这是我描述它的最佳方式。

6 个答案:

答案 0 :(得分:1)

只需添加滚动视口更改事件的侦听器并发出repaint()。我想我会反对Steve Moyer的回答,因为绘画只应该作为油漆事件的一部分。

如果滚动的组件足够大,您应该重新绘制在视口组件(您的JScrollPane)中可见的JPanel部分。


修改

要跟踪视口的移动,请使用JScrollPane getViewport()和JViewport addChangeListener()。然后使用JViewport的方法来确定在绘制方法中确定要绘制的区域时视图的哪个部分是可见的。请注意,这应该是仅在绘画正常工作后通过重新绘制每个绘制事件中的整个视图来应用的优化。

答案 1 :(得分:1)

听起来你想做这样的事情:

    final JScrollPane pane = new JScrollPane();
    pane.addMouseListener(new MouseAdapter() {
        @Override
        public void mouseClicked(MouseEvent e) {
            pane.revalidate();
        }
    });

可能有点矫枉过正,但每次单击滚动窗格时,它都会尝试重新绘制层次结构中与屏幕大小相同的所有组件。

答案 2 :(得分:0)

您可能需要指定最小尺寸。

您不发布代码或屏幕截图,因此难以查看。

尝试阅读此帖子中的评论,它看起来类似

JScrollPane now showing its viewport

答案 3 :(得分:0)

你是否有机会在paint()或paintComponent()方法之外绘制你的“绘图”?如果需要,您需要将绘画代码移动到paintComponent()。

答案 4 :(得分:0)

确保面板中的所有内容都设置为滚动窗格的视口视图(JScrollPane.setViewportView)

答案 5 :(得分:-1)

自从我在Swing中使用任何图形以来已经有一段时间了,但我认为您正在寻找的代码类似于:

Graphics g = getGraphics();
if (g != null) paintComponent(g);
else repaint();

正如您所说,您需要在附加到JPanel滚动功能的侦听器中添加此代码。

我可能会创建一个包含整个绘图的Canvas并将其放在JScrollPane中。这将让Java完成所有工作!