【问题标题】:Replacing a imageIcon替换 imageIcon
【发布时间】:2010-11-28 20:31:52
【问题描述】:

我有一个名为 'AmountWrongGuessed' 的值,它给出了用户在猜测一个单词时的错误猜测数量。
每次在数组列表中找不到单词时,AmountWrongGuessed 都会变为 ++。 (用 println 测试过,它工作正常)

现在的问题是,每次 AmountWrongGuessed 上升 1 时,它应该显示一个 ImageIcon。
但实际上它始终显示最后一个图像图标,并跳过其他图标。 p>

我没有使用布局管理器(它设置为 null,如果这对整个图片 setLayout = null 有任何影响)

在初始化这个游戏时,amountwrongguessed 默认为 0,但它也不显示第一个图像图标。 (我之前使用不同的标签将每个图标添加到同一位置,但后来我遇到了问题,只显示了第一张图片,没有任何改变)。

public HrView(Hrgame hg) {
    this.hg = hg;

    CreateComponents();
    SetLayoutComponents();
    UpdateComponents();
    AddListeners();
}

图像的创建:

 private void CreateComponents() {

    hang0 = new ImageIcon("hang0.gif");
    lblHang = new JLabel(hang0);
    lblHang.setLocation(60, -10);
    lblHang.setSize(200, 200);       

    hang1 = new ImageIcon("hang1.gif");
    lblHang = new JLabel(hang1);
    lblHang.setLocation(60, -10);
    lblHang.setSize(200, 200);

    hang2 = new ImageIcon("hang2.gif");
    lblHang = new JLabel(hang2);
    lblHang.setLocation(60, -10);
    lblHang.setSize(200, 200);
}

  private void AddListeners()
{
    btnCheck.addActionListener(new ActionListener()
    {
        public void actionPerformed(ActionEvent e)
        {

            hg.Input(tfToGuessInput.getText().toLowerCase());
            Pictures();
            lblHang.updateUI();

        }
    });
}


private void Pictures()
{
    //works, does increment
    System.out.println(hg.getAmountWrongGuessed());

    if (hg.getAmountWrongGuessed() == 0) {
        add(lblHang);
    }
    if (hg.getAmountWrongGuessed() == 1) {
        add(lblHang);
    }
    if (hg.getAmountWrongGuessed() == 2) {
        add(lblHang);
    }
}

【问题讨论】:

    标签: java


    【解决方案1】:

    CreateComponents() 之后,您的属性lblHang 引用了您最后创建的标签(包含图像hang2 的标签。)为了以后使用这3 个标签,您需要有3 个标签属性,然后您可以使用它们在Pictures()

    顺便说一句,在 Java 中,命名约定是方法名称以小写字符开头。

    【讨论】:

    • 现在已经通过在相同位置添加一个新的 jlabel 为每个图像尝试了一个 Jlabel,但现在我根本没有显示任何图像。
    • @Tonz,您可以尝试使用setVisible() 来确定显示哪个图标,或者使用1 个标签并使用setIcon() 来切换其图像。在后一种情况下,您不需要在 CreateComponents() 中构造 3 个 JLabel 对象
    【解决方案2】:
    import javax.swing.*;
    import javax.swing.JLabel;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.ImageIcon;
    import java.awt.BorderLayout;
    import java.awt.*;
    import java.awt.event.*;
    
    public class testgui{
    
    private static int flag = 1;
    
    public static void main(String[] args){
    
    final JLabel label = new JLabel("",new ImageIcon("0.jpg"),JLabel.CENTER);
    final JLabel label1 = new JLabel("",new ImageIcon("1.jpg"),JLabel.CENTER);
    final JLabel label2 = new JLabel("",new ImageIcon("2.jpg"),JLabel.CENTER);
    
    final JFrame frame = new JFrame();
    
    final JPanel panel = new JPanel();
    
    frame.add(panel,BorderLayout.CENTER);
    
    frame.setVisible(true);
    
    final JButton button = new JButton("Next");
    
    frame.add(button,BorderLayout.SOUTH);
    
    panel.add(label);
    
    frame.pack();
    
    button.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e){
            if(flag==0){
            System.out.println("0.jpg");
            //label image, flag increment
                flag = flag+1;
                panel.removeAll();
                panel.add(label);
                frame.pack();
    
            } else if(flag==1){
            System.out.println("1.jpg");
            //label1 image, flag increment
                flag = flag+1;
                panel.removeAll();
                panel.add(label1);
                frame.pack();
            } else if (flag==2){
            System.out.println("2.jpg");
            //label2 image, reset flag to 0
                flag = 0;
                panel.removeAll();
                panel.add(label2);
                frame.pack();
            }
            else{
                System.out.println("Wrong flag number !");
            }
            panel.validate();
            panel.updateUI();
            }
        });
    }
        }
    

    我认为如果您想使用 jlabels 切换图像,上述代码会有所帮助。旋转包含图像的 jlabel 会有所帮助,但此代码未优化。

    【讨论】:

    • 使用标签实际上是最好的解决方案,比如说在同一位置旋转 7 张图像?很不清楚这个问题最好、最简单的解决方案是什么。问候
    • 你是对的。标签不是旋转图像的最佳方式。您可以在不创建实例的情况下拥有标签。例如。 “JLabel 标签 = 空;”然后,当您需要新图像时,您可以使用“label = new JLabel("",new ImageIcon("0.jpg"),JLabel.CENTER);"。确保正确更新图像的文件名。您将只使用 1 个标签,它只会根据需要不断循环图像。
    猜你喜欢
    • 2019-03-12
    • 2012-11-27
    • 2013-02-09
    • 1970-01-01
    • 2014-03-01
    • 1970-01-01
    • 2011-06-20
    • 2020-07-21
    • 1970-01-01
    相关资源
    最近更新 更多