动态更改JLabel图标

时间:2015-10-07 21:58:17

标签: java swing jlabel imageicon

有许多类似的主题,但是没有一个建议的解决方案适合我。

所以,我有一个空的JLabel,并且在执行期间的某个时候我想在其上添加一个图标。

String imageLocation = "/home/........" 
jLabel1.setIcon(new ImageIcon(imageLocation)); 

无效。

图片的位置很好 - >

System.out.println(new java.io.File(imageLocation).exists());

true

2 个答案:

答案 0 :(得分:3)

由于图标是JLabel的绑定属性,setIcon()就足够了,如下所示。使用示例获取图标位置,并参阅以了解常见问题的示例。

image

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import javax.swing.AbstractAction;
import javax.swing.Icon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.UIManager;

/**
 * @see http://stackoverflow.com/a/33003415/230513
 */
public class Test {

    private void display() {
        Icon icon = (Icon) UIManager.getIcon("OptionPane.errorIcon");
        JFrame f = new JFrame("Test");
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        JLabel label = new JLabel("Test", JLabel.CENTER){

            @Override
            public Dimension getPreferredSize() {
                return new Dimension(2 * icon.getIconWidth(), 2 * icon.getIconHeight());
            }
        };
        f.add(label);
        f.add(new JButton(new AbstractAction("Add icon") {

            @Override
            public void actionPerformed(ActionEvent e) {
                label.setIcon(icon);
            }
        }), BorderLayout.SOUTH);
        f.pack();
        f.setLocationRelativeTo(null);
        f.setVisible(true);
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Test()::display);
    }
}

答案 1 :(得分:-1)

您需要重新验证并重新标记包含此标签的面板的标签,您可以通过以下方式执行此操作:

String imageLocation = "/home/........" 
jLabel1.setIcon(new ImageIcon(imageLocation));
//Add this : 
jLabel1.revalidate();
jLabel1.repaint();

//if it does not work try to do the same for the panel which contain this label