在添加到GUI后动态更改JLabel图标?

时间:2013-05-21 13:20:08

标签: java swing icons jpanel jlabel

我无法使用Swing组件更改GUI中的图标。我正在创建一个用Java游戏的国际象棋游戏,并希望GUI的右侧通过在网格中显示所拍摄的片段来响应。我的问题是,每当我使用新图片调用setIcon()中的JLabel函数并将其添加到相应的JPanel时,它就不会更新。它在第一次setIcon()时有效,但在将其添加到GUI后,我无法按照我一直尝试的方式进行更改。这是截图,所以你知道我得到了什么:

Initial State

After

正如你所知,已经采取了一个典当,但正确的小组并没有反映这一点,尽管我付出了努力。

我做了一些研究,以下问题类似:Relevant Question

Camickr回应说,这可能是我试图更新的JLabel的两个实例,我认为这是我的情况。在将GUI设置为初始状态时,我最初将右侧面板上的所有图标设置为null。以下是执行此操作的代码:

for (int i = 0; i < 16; i++)
{
    piece1Labels[i] = new JLabel();
    piece2Labels[i] = new JLabel();
    piece1Panels[i] = new ChessSpace(playerDeadPieceTile);
    piece2Panels[i] = new ChessSpace(playerDeadPieceTile);
    piece1Labels[i].setPreferredSize(new Dimension(67,66));
    piece2Labels[i].setPreferredSize(new Dimension(67,66));
    piece1Labels[i].setIcon(null);
    piece2Labels[i].setIcon(null);
    piece1Panels[i].add(piece1Labels[i]);
    piece2Panels[i].add(piece2Labels[i]);
    player1PiecePanel.add(piece1Panels[i]);
    player2PiecePanel.add(piece2Panels[i]);
}

这是我尝试在ChessSpace的{​​{1}}的piece1Panels数组中的第一个面板上调用初始化后尝试更改其中一个面板:{/ 1}}:

JPanel

piece1Labels和piece1Panel是扩展//Try to change right panel icon after GUI setup piece1Labels[0] = new JLabel(); piece1Panels[0] = new ChessSpace(playerDeadPieceTile); piece1Labels[0].setPreferredSize(new Dimension(67,66)); piece1Labels[0].setIcon(new ImageIcon("C:/Users/Shasta/workspacejava/chess/images/terranpawn.jpg")); piece1Panels[0].add(piece1Labels[0]); 的类的变量。我认为问题在于我只是更新类变量而不是更新添加到GUI的实例。

编辑: 正如Alican Ozgoren&amp; Hovercraft Full Of Eels指出我不应该声明JFrame的新实例,它们是多余的。

以下代码行似乎符合我的要求:

JLabel

2 个答案:

答案 0 :(得分:1)

正如我们所提到的,只需设置JLabel的Icon。但还有一件事 - 不要像在这里一样继续阅读图标:

piece1Labels[0].setIcon(new ImageIcon(
         "C:/Users/Shasta/workspacejava/chess/images/terranpawn.jpg"));

而是在程序开头读取一次图标,并将它们存储在变量中,以便获得:

piece1Labels[0].setIcon(terranpawnIcon);

我还会将它们作为资源而非文件读取,以便您以后可以将图像存储在jar文件中并使用它们。

答案 1 :(得分:0)

只需创建一个更新JLable Icone的线程,请参阅下面的代码

package self.wing.practice.image; import javax.swing。*;

/ **  *  * @author ASHISH KUMAR MISHRA  *  * / 公共类ImageDemo {

public ImageDemo() {
    JFrame jfrm = new JFrame("Image Demo");
    jfrm.setSize(200, 150);
    jfrm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    JLabel label = new JLabel();
    jfrm.add(label);
    new ImageUpdator(label).start();
    jfrm.setVisible(true);

}

public static void main(String[] args) {
    SwingUtilities.invokeLater(new Runnable() {

        public void run() {
            // TODO Auto-generated method stub
            new ImageDemo();
        }
    });
}

}

我创建了一个线程,我在Constructur中传递了一个Jlabel。看下面我的主题在做什么

包self.wing.practice.image;

import java.io.File;

import javax.swing.ImageIcon; import javax.swing.JLabel;

/ **  *  * @author ASHISH KUMAR MISHRA  *  * / public class ImageUpdator扩展Thread {

String imagePath = "C:\\Users\\Public\\Pictures\\Sample Pictures";
File imageDir = new File(imagePath);
JLabel label = null;

ImageUpdator(JLabel label) {
    this.label = label;
}

public void run() {

    ImageIcon imageIcon = null;

    if (imageDir.isDirectory()) {
        File[] files = imageDir.listFiles();
        for (int i = 0;; i++) {
            i = i % files.length;
            File currentFile = files[i];
            if (currentFile.getName().endsWith(".jpg"))
                ;
            {
                imageIcon = new ImageIcon(currentFile.getAbsolutePath());
                label.setName(currentFile.getName().substring(0,
                        currentFile.getName().indexOf('.')));
                label.setIcon(imageIcon);
                label.setHorizontalAlignment(JLabel.CENTER);
                try {
                    Thread.sleep(700);
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }

            }

        }
    }
}

}

标题

相关问题