Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/359.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java GUI-删除所有组件并重新绘制_Java_Swing_User Interface_Jpanel_Grid Layout - Fatal编程技术网

Java GUI-删除所有组件并重新绘制

Java GUI-删除所有组件并重新绘制,java,swing,user-interface,jpanel,grid-layout,Java,Swing,User Interface,Jpanel,Grid Layout,我有一个网格布局JPanel,上面画了许多图标。我需要在玩家移动后更改图标,因为地图会更改。下面是我想出的方法: public void initGridIcons(JPanel pnl, String map) { pnl.removeAll(); char[] tiles = map.toCharArray(); for (char ch : tiles) { JLabel label = new JLabel(""); String

我有一个网格布局JPanel,上面画了许多图标。我需要在玩家移动后更改图标,因为地图会更改。下面是我想出的方法:

public void initGridIcons(JPanel pnl, String map) {
    pnl.removeAll();
    char[] tiles = map.toCharArray();
    for (char ch : tiles) {
        JLabel label = new JLabel("");
        String icon = "";
        switch (ch) { // lots of cases irrelevant to problem
        }
        label.setIcon(new ImageIcon(ClientGUI.class
                .getResource("/resources/" + icon)));
        pnl.add(label);
    }
}
这在最初是有效的,因为它确实正确地绘制了玩家和地图。然而,每转一圈后它都不会改变


我已经尝试过用迭代器计数器(对偶数进行更改)来使用此方法,以确保它不是任何其他代码,并且不起作用,因此我确信它是这样的。

在应用程序的容器
JFrame
可见之前,此方法最初可能会起作用,但是在
JPanel
上需要调用
revalidate
repaint
,以使其在运行时工作

for (char ch : tiles) {
   ...
   pnl.add(label);
}

pnl.revalidate();
pnl.repaint();

如果要设置的
图标的数量是一个固定的数字,则只需调用
JLabel#setIcon
即可更改图标。

这可能在应用程序的容器
JFrame
可见之前开始起作用,但是在
JPanel
上需要调用
revalidate
repaint
,以使其在运行时工作

for (char ch : tiles) {
   ...
   pnl.add(label);
}

pnl.revalidate();
pnl.repaint();
如果要设置的
图标
的数量是固定的,则只需调用
JLabel#setIcon
即可更改图标