Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
刷新JLabel-Java_Java_User Interface_Jlabel - Fatal编程技术网

刷新JLabel-Java

刷新JLabel-Java,java,user-interface,jlabel,Java,User Interface,Jlabel,我对JLabel和帧有一些问题 我有以下代码: list.addListSelectionListener( new ListSelectionListener() { @Override public void valueChanged(ListSelectionEvent e) { //System.out.println(e.getFirstIndex());

我对JLabel和帧有一些问题

我有以下代码:

 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中心的标签。但使用此代码,旧图像将进一步显示,而新图像仅绘制在现有图像的后面


有人能帮我吗?:)

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

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

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

labe.setIcon(icon);

这将自动刷新元素。

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

labe.setIcon(icon);
这将自动刷新元素。

建议:

  • 不要创建新的JLabel,给它一个ImageIcon,并期望现有的JLabel会改变。两个jlabel(原始的和在这里创建的)是两个完全不同的对象,更改其中一个的状态(它显示的图标)不会神奇地更改另一个的状态
  • 确保原始JLabel在类(而不是侦听器类)中有一个实例变量,一个字段,引用它,然后在侦听器代码中,通过调用其
    setIcon(…)
    方法更改该JLabel中显示的图标
  • 无需在此处调用
    revalidate()
    repaint()
    ,因为如果您更改容器中保存的组件,例如从JFrame的contentPane中删除原始JLabel并替换为新组件,则应执行此操作。请注意,我不建议您这样做,因为这会使本来应该是一件简单的事情——交换图标——变得过于复杂
  • 为了简化操作,我建议您在程序启动时读取所有图像,创建图像图标,然后将它们放入数组或集合(例如
    ArrayList
    HashMap
    ),然后在侦听器代码中提取正确的图标,并将其放入现有的JLabel中
  • 建议:

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

  • 只需更改标签的图标,不要在选择时创建新标签您的问题是一个神奇的想法。创建一个新的JLabel并给它一个ImageIcon不会神奇地改变GUI,也不会改变它当前可能持有的JLabel对象中可能显示的内容。具有指向代码的链接,这些代码几乎与您正试图执行的操作完全相同--当选择组合框中的某个项目时,更改JLabel显示的图像。我建议您学习本教程和代码,因为在JList的上下文中很容易使用本代码和教程中的概念。只需更改标签的图标,不要在选择时创建新标签您的问题是一个神奇的想法。创建一个新的JLabel并给它一个ImageIcon不会神奇地改变GUI,也不会改变它当前可能持有的JLabel对象中可能显示的内容。具有指向代码的链接,这些代码几乎与您正试图执行的操作完全相同--当选择组合框中的某个项目时,更改JLabel显示的图像。我建议您学习本教程和代码,因为在JList的上下文中使用本代码和教程中的概念很容易。谢谢您的快速回答。你能告诉我,它应该是如何工作的吗@dankoe:您没有发布有效的标签,因此没有人可以告诉您在当前代码中如何执行。这完全取决于代码的其他部分,比如标签变量位于何处?谢谢您的快速回答。你能告诉我,它应该是如何工作的吗@dankoe:您没有发布有效的标签,因此没有人可以告诉您在当前代码中如何执行。这完全取决于代码的其余部分,比如标签变量位于何处?