gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 07:37:12 25 4
gpt4 key购买 nike

我在使用 Swing 组件更改 GUI 深处的图标时遇到问题。我正在使用 Java 创建一个国际象棋游戏,并希望 GUI 的右侧能够在棋子被拿走时做出响应,并在网格中显示所拿走的棋子。我的问题是,每当我使用新图像调用 JLabel 中的 setIcon() 函数并将其添加到相应的 JPanel 时,它都不会更新。当我第一次 setIcon() 时它可以工作,但是在将其添加到 GUI 后,我无法按照我一直尝试的方式更改它。以下是屏幕截图,以便您了解我的意思:

Initial State

After

如您所知,棋子已被拿走,但尽管我付出了努力,右侧面板并未反射(reflect)出这一点。

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

Camickr 回应称,这可能是我正在尝试更新的 JLabel 的两个实例,我相信这就是我的情况。当将 GUI 设置为初始状态时,我最初将右侧面板上的所有图标设置为空。这是执行此操作的代码:

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]);
}

这是我在扩展JPanelChessSpace的piece1Panels数组中的第一个面板上调用初始化后尝试更改其中一个面板:

//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]);

piece1Labels 和piece1Panels 是扩展JFrame 的类的变量。我认为问题在于我只是更新类变量而不是更新添加到 GUI 的实例。

编辑:正如 Alican Ozgoren 和 Hovercraft Full Of Eels 指出的那样,我不应该声明 JLabel 的新实例,它们是多余的。

以下代码行似乎可以满足我的要求:

//Try to change right panel icon after GUI setup
piece1Labels[0].setIcon(new ImageIcon("C:/Users/Shasta/workspacejava/chess/images/terranpawn.jpg"));

最佳答案

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

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

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

piece1Labels[0].setIcon(terranpawnIcon);

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

关于java - 添加到 GUI 后动态更改 JLabel 图标?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16671126/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com