Как правильно настроить JLabel для показа изображения? - PullRequest
0 голосов
/ 30 апреля 2011

Ниже приведен фрагмент, где я создаю свой ImageIcon и JLabel:

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

object.setArmorImage(armorShopLabel);

Тогда в моем классе объектов у меня есть сеттер:

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

Это изображение не отображается, когда я тестирую свое приложение, и мне было интересно, если кто-то может указать на мою ошибку

EDIT

Большая часть исходного кода:

Main:

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 ]

3 голосов
/ 30 апреля 2011
public void setArmorImage(JLabel label)
{     
    this.jLabel1 = label; 
}

Этот код ничего не делает.Присвоение ссылки на метку другой переменной не влияет на GUI.Вам нужно «добавить (...)» метку в GUI, чтобы метка была видна.

Прочитайте учебник Swing на Как использовать значки для рабочих примеров.

Если вы хотите обновить существующий ярлык в графическом интерфейсе, вы должны использовать:

label.setIcon(...);

Если вам нужна дополнительная помощь, опубликуйте SSCCE с указанием проблемы.

2 голосов
/ 30 апреля 2011

Вы создаете JLabel и затем передаете его в setArmorImage, который затем присваивает его jLabel1.Вопрос в том, что вы делаете с jLabel1 после того, как его значение изменилось?Я предполагаю, что вы помещаете jLabel1 в свой контейнер где-то, тогда setArmorImage называется изменением того, на что указывает jLabel1, но старый экземпляр метки (ранее указанный jLabel1) все еще находится в вашем контейнере.

Чтобы это исправить, вам нужно удалить старый экземпляр метки и вставить новый.Вы могли бы сделать это проще, используя контейнер (JPanel), который старый содержит вашу метку.Тогда все, что вам нужно сделать, это заменить этикетки с держателя.

2 голосов
/ 30 апреля 2011

Единственное, что сгенерировал графический редактор, было jLabel1.

Что нет кода в сгибе? Поскольку никто не может видеть ваш компьютер, начните с рабочего примера , который все могут видеть. Распакуйте его и введите ant run. Теперь сравните src/components/LabelDemo.java с вашим кодом.

2 голосов
/ 30 апреля 2011

Метка, которую вы передаете, не добавляется в 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();
    }

, если вы хотите добавить его в графический интерфейс, вы можете сделать одно из следующих действий:

  1. установить свойства jLabel1 как свойства shopLabel, что-то вроде this.jLabel1.setText(shopLabel.getText());

  2. ИЛИ - удалите jLabel1, добавьте shopLabel и установите this.jLabel1 в shopLabel:

Например:

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

...