我的一个朋友给我发了一个项目并要求我让它更干净,项目是一个带有容器的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(),但没有效果。
欢迎任何帮助。提前谢谢。
答案 0 :(得分:4)
Icon/ImageIcon
不起作用(从网络或硬盘驱动器中吸取)
ImageIcon pictures = new ImageIcon("whatever");
pictures.getImage().flush();
myLabel[2][3].setIcon(pictures);
答案 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();
}
});
}