1

我是创建 GUI 的新手,我无法刷新 JLabel 上的图像。我读过有同样问题的人提出的其他问题,但没有一个答案对我有帮助。我有一个程序,每次单击 JButton 时都会掷骰子,如果结果是一个,我希望 JLabel 的图像发生变化。这是我的 GUI 类的构造函数:

private Panel panel;
private Label label;
private TextField text;
private JButton roll;
private ArrayList<ImageIcon> deck;
private ArrayList<ImageIcon> discard;
private JLabel pic;
private JFrame f;
private ImageIcon now;
public Planechase()
{
    f = new JFrame("Planechase");
    deck = new ArrayList<ImageIcon>();
    populate();
    Collections.shuffle(deck);
    discard = new ArrayList<ImageIcon>();
    label = new Label("Planechase");
    text = new TextField(":)",8);
    text.setEditable(false);
    roll = new JButton("Roll");
    roll.addActionListener(
        new ActionListener() {
            public void actionPerformed(ActionEvent e)
            {
                int i = (int)(Math.random()*6)+1;
                System.out.println(i);
                if(i==1)
                {
                    text.setText("Planeswalk");
                    discard.add(now);
                    now = deck.remove(0);
                    pic = new JLabel(now);
                    pic.updateUI();
                }
                else if(i==6)
                {
                    text.setText("Chaos");
                }
                else
                {
                    text.setText("Blank");
                }
            }
        });
    now = deck.remove(0);
    pic = new JLabel(now);
    f.getContentPane().setLayout(new FlowLayout());
    f.getContentPane().add(pic);
    f.getContentPane().add(text);
    f.getContentPane().add(roll);
}

正如类似问题中所建议的那样,我尝试使用上面的 updateUI() ,但图片没有改变。我还应该尝试什么?

4

1 回答 1

2

您正在创建一个新JlabelActionListener,但没有将其添加到容器中。您可以更新Icon使用setIcon

pic.setIcon(now);

一些旁注:

  • 当您删除Icons以在您的 中使用时JLabel,您最终将用完可用的图标,从而导致IndexOutOfBoundsException如果未重新添加。
  • 通常混合 AWT 和 Swing 组件并不是一个好主意。较旧的 AWT 组件通常不尊重组件的z 顺序,并且经常隐藏它们的轻量级邻居。见这里
于 2013-03-24T01:58:41.690 回答