如何在 JPanel 上绘制后重新绘制它?

10
我有一个继承自JPanel的组件,我在上面画了一个网格。现在我有一个JComboBox,我希望用户能够在此处选择网格大小,然后按下按钮使网格更改(重新绘制网格)。
问题是它绘制了初始网格,但一旦用户从JComboBox中选择网格大小并单击按钮,就什么也不会发生。我必须最小化窗体,然后再次恢复它才能看到更改。
有什么想法吗?代码如下。

该组件:

public class Board extends JPanel {
    ...

    protected void paintComponent(Graphics og) {
        super.paintComponent(og);
        ...
        }
    }    
}

主类


public class Main extends javax.swing.JFrame {
...

public Main() {                                   //This works great.
    board = new Board( ... );
    somePanel.add(board, BorderLayout.CENTER);

}

public void someButtonActionPerformed(Event e) { //This is not working

    somePanel.remove(board);
    board = new Board( ... );
    somePanel.add(board);
    somePanel.invalidate()
    board.repaint();
}
1个回答

20

尝试调用somePanel.revalidate()。这将告诉AWT您已更改了组件树。

编辑:从invalidate更改为revalidate


1
谢谢你的回答。我已经尝试过了,但不起作用 :( J. - Aerozeek
1
你可能想要更新你在问题中的代码来显示。someButtonActionPerformed 方法实际上是否被调用了?你是否添加了 System.out.println 进行检查? - Cameron Skinner
1
糟糕!我的意思是在我的答案中说“重新验证(revalidate)”,而不是“使无效(invalidate)”。那可能就是问题所在。 - Cameron Skinner
1
那正是问题所在!谢谢你,我的朋友,你非常有用。J. - Aerozeek
1
没问题。如果你还没有了解过invalidatevalidaterevalidate,我建议你先去看一下。它们很容易出错。 - Cameron Skinner
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接