刷新JLabel - Java

时间:2018-05-12 14:10:24

标签: java user-interface jlabel

我在使用JLabel和Frames时遇到了一些问题..

我有以下代码:

 list.addListSelectionListener(
            new ListSelectionListener() {

                @Override
                public void valueChanged(ListSelectionEvent e) {
                    //System.out.println(e.getFirstIndex());


                    String selectedFile = list.getSelectedValue().toString();
                    System.out.println("Selected file " + selectedFile);
                    JLabel label;
                    ImageIcon icon = new ImageIcon("C:\\Users\\danie\\Pictures\\" + selectedFile);
                    // frame.setSize(1047, 680);
                     label = new JLabel(icon);
                     //label.setSize(100,100);
                     frame.getContentPane().add(label, BorderLayout.CENTER);
                     frame.revalidate();
                     frame.repaint();

                }

    });

如果选择了JList中的项目,我想刷新borderlayout中心的标签。但是使用此代码,旧图像将进一步显示,新图像仅在现有图像后面绘制。

有人能帮帮我吗? :)

3 个答案:

答案 0 :(得分:2)

首先,您要创建一个新的JLabel实例,而不是处理现有实例。你真正想做的是:

labe.setIcon(icon);

这将自动刷新元素。

答案 1 :(得分:2)

建议:

  1. 不要创建新的JLabel,给它一个ImageIcon并期望现有的JLabel改变。两个JLabel,原始的和在这里创建的一个,是两个完全不同的对象,改变一个状态(它显示的图标)不会神奇地改变另一个的状态。
  2. 确保原始JLabel在类(不在您的侦听器类中)中有一个实例变量,一个字段,引用它,然后在您的侦听器代码中,更改中显示的图标 JLabel调用其setIcon(...)方法
  3. 无需在此处调用revalidate()repaint(),因为如果更改容器中保留的组件,则应执行此操作,例如,如果您从JFrame的contentPane中删除了原始JLabel并换入了新的一。请注意,我建议您执行此操作,因为它过分复杂应该是一件简单的事情 - 交换图标。
  4. 为简化起见,我建议您在程序启动时阅读所有图像,然后创建ImageIcons,然后将它们放入数组或集合(例如ArrayList<Icon>或{{1} }),然后在您的侦听器代码中,提取正确的图标,并将其放入现有的 JLabel。

答案 2 :(得分:1)

您似乎没有使用相同的JLabel。您应该更改已有的标签,而不是创建新的标签。