-1

我的一个朋友给我发了一个项目并要求我让它更干净,该项目是一个带有容器的 JFrame,其中有一些由图像放置的标签,它们根据一些参数而变化,我试图做的是将所有标签放入JFrame中的JPanel,问题是标签没有改变,当我填充面板以创建地图时工作正常但是当图像必须切换时不起作用,逻辑很好,因为我用记录器检查了它(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() 并且没有任何工作。

欢迎任何帮助。先感谢您。

4

2 回答 2

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

.

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

.

  • 解决方案很简单,将所有 Icon/ImageIcon 加载为局部变量,然后 Swing JComponents 永远不会引起问题
于 2013-05-23T07:29:39.080 回答
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();
            }
        });
    }
于 2013-05-23T05:16:02.040 回答