JPanel没有正确刷新

时间:2013-05-23 03:52:51

标签: java swing

我的一个朋友给我发了一个项目并要求我让它更干净,项目是一个带有容器的JFrame,它有一些标签放置的图像,它们根据一些参数改变,我试图做的是放置所有标签都放入JFrame中的JPanel,问题是标签没有变化,当我填充Panel创建地图工作正常但是当图像必须切换不起作用时,逻辑很好,因为我检查了它使用记录器(System.out.println东西)并正常工作。 此外,我不得不说我创建的JPanel是使用NetBeans的调色板(拖放)制作的。

public final void createMap(int map[][]) {
myGrid = new GridLayout(13, 16, 0, 0);
myLabel = new JLabel[13][16];
myPanel.setLayout(myGrid);

//Start doing some stuff to fill my JPanel with labels placing images on them.
//This works fine

 for(int i = 0; ...) {
  for(int j = 0; ...) {
   if(map[i][j]==0) {
    myLabel[i][j].setIcon(new javax.swing.ImageIcon(getClass().getResource("/ImageA.jpg")));
   }

   if (map[i][j]==1) {
    myLabel[i][j].setIcon(new javax.swing.ImageIcon(getClass().getResource("/ImageB.jpg")));
   }
   .
   .
   .
   myPanel.add(myLabel[i][j]);
   myPanel.revalidate();
  }
 }
//End doing some stuff
}

//The problem comes here when I try to switch images

public final void play() {

if(something) {
  //The position 2,3 "switches" its image with the position 2,4
  myLabel[2][3].setIcon(new javax.swing.ImageIcon(getClass().getResource("/ImageA.jpg")));
  myLabel[2][4].setIcon(new javax.swing.ImageIcon(getClass().getResource("/ImageB.jpg")));
 }
//THIS IS NOT WORKING
myPanel.validate();
}

我尝试了myPanel.validate,.revalidate(),. repaint(),但没有效果。

欢迎任何帮助。提前谢谢。

2 个答案:

答案 0 :(得分:4)

  • 在某些情况下Icon/ImageIcon不起作用(从网络或硬盘驱动器中吸取)

     ImageIcon pictures = new ImageIcon("whatever");
     pictures.getImage().flush();
     myLabel[2][3].setIcon(pictures);

  • 解决方案非常简单,将所有Icon / ImageIcon加载为局部变量,然后Swing JComponents从未导致a.m.问题

答案 1 :(得分:2)

您可以直接从JLabel获取JPanel图标。在运行此代码之前,您必须为每个JLabel命名。

if(something) {
doSomething(myPanel);
}

public void doSomething(JPanel myPanel) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                Component[] components = myPanel.getComponents();
                Component component = null;
                for (int i = 0; i < components.length; i++) {
                    component = components[i];
                    if (component instanceof JLabel) {
                        JLabel label = (JLabel) component;
                        String name = label.getName();
                        if (name.equalsIgnoreCase("a")) {
                            label.setIcon(null);
                            label.setIcon(new javax.swing.ImageIcon(getClass().getResource("/ImageA.jpg")));
                            label.revalidate();
                            label.repaint();
                        }
                    }
                }

                myPanel.revalidate();
                myPanel.repaint();
            }
        });
    }