设置JLabel以显示图像的正确方法是什么?

时间:2011-04-29 23:31:56

标签: java image swing set jlabel

下面是我创建ImageIcon和JLabel的片段:

ImageIcon armorShopIcon = new ImageIcon("/images/armorshop.png", "Armor Shop");
JLabel armorShopLabel = new JLabel("Armor Shop", armorShopIcon, JLabel.CENTER);

object.setArmorImage(armorShopLabel);

然后在我的对象类中我有一个setter:

public void setArmorImage(JLabel label) {
    this.jLabel1 = label;
}

当我测试我的应用程序时,这不显示图像,我想知道是否有人可以指出我的错误

修改

大部分源代码:

主:

public class Main extends javax.swing.JFrame {

    public Main() {

    initComponents();

    ImageIcon armorIcon = new ImageIcon("/images/armorshop.png", "Armor Shop");
    JLabel armorShopLabel = new JLabel("Armor Shop", armorShopIcon, JLabel.CENTER);

    ShopDisplay armorShop = new ShopDisplay();
    armorShop.setArmorImage(armorShopLabel);


        public initComponents() { /*more generated code here*/ }

    }
}

显示:

public class ShopDisplay extends javax.swing.JPanel {

    /** Creates new form ShopDisplay */
    public ShopDisplay() {
        initComponents();
    } 


    //generated by the gui builder
    //initComponents
    private void initComponents() {
    jLabel1 = new javax.swing.JLabel();
    jLabel1.setText("Shop Name");
        gridBagConstraints = new java.awt.GridBagConstraints();
        gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
        gridBagConstraints.weightx = 1.0;
        gridBagConstraints.weighty = 1.0;
        add(jLabel1, gridBagConstraints);
    }

    //Variable declarationg
    private javax.swing.JLabel jLabel1;


    //Setter for Shop Name
    public void setArmorImage(JLabel shopLabel) {
        this.jLabel1 = shopLabel;
    }

    //other setters for
    //multiple jLabels

}

4 个答案:

答案 0 :(得分:3)

public void setArmorImage(JLabel label)
{     
    this.jLabel1 = label; 
}

该代码什么都不做。为另一个变量分配标签引用不会影响GUI。您需要将标签“添加(...)”添加到GUI,以便看到标签。

阅读How to Use Icons上的Swing教程,了解工作示例。

如果您想更新GUI上的现有标签,那么您将使用:

label.setIcon(...);

如果您需要更多帮助,请发布显示问题的SSCCE

答案 1 :(得分:2)

您传递的标签未添加到GUI中,以下方法可能有所帮助 -

将另一个JPanel添加为jLabel1的容器,并仅替换其内容:

即:

    private javax.swing.JPanel containerPanel;
    private void initComponents() {
        jLabel1 = new javax.swing.JLabel();
        jLabel1.setText("Shop Name");
        gridBagConstraints = new java.awt.GridBagConstraints();
        gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
        gridBagConstraints.weightx = 1.0;
        gridBagConstraints.weighty = 1.0;
        containerPanel = new javax.swing.JPanel();
        containerPanel.add(jLabel1);
        add(containerPanel, gridBagConstraints);
    }

    //Variable declarationg
    private javax.swing.JLabel jLabel1;


    //Setter for Shop Name
    public void setArmorImage(JLabel shopLabel) {
        containerPanel.remove(jLabel1);
        containerPanel.add(shopLabel);
        jLabel1 = shopLabel;
        revalidate();
    }

,如果你想将它添加到gui,你可以执行以下操作之一:

  1. jLabel1的属性设置为shopLabel的属性,例如this.jLabel1.setText(shopLabel.getText());

  2. 或者 - 删除jLabel1,添加shopLabel并将this.jLabel1设置为shopLabel

  3. 例如:

    public void setArmorImage(JLabel shopLabel) {
        remove(jLabel1);
        add(shopLabel);
        jLabel1 = shopLabel;
        revalidate();
    }
    

    <击>

答案 2 :(得分:2)

您正在创建JLabel,然后将其传递给setArmorImage,然后将其分配给jLabel1。问题是你的价值发生变化之后你在jLabel1做了什么?我的猜测是你将jLabel1放在容器中的某个地方,然后调用setArmorImage来改变jLabel1指向的内容,但旧标签实例(先前由{{1}指向) })仍然在你的容器中。

要解决此问题,您需要删除旧标签实例并添加新标签实例。您可以使用旧容纳您的Label的容器(jLabel1)来简化此操作。然后你需要做的就是交换持有者的标签。

答案 3 :(得分:2)

  

GUI编辑器生​​成的唯一内容是jLabel1

折叠中没有代码?由于没有其他人可以看到您的计算机,因此请从每个人都能看到的工作example开始。解压缩,然后输入ant run。现在将src/components/LabelDemo.java与您的代码进行比较。