Java JLabel图标抵制更改

Java JLabel图标抵制更改,java,swing,jpanel,jlabel,Java,Swing,Jpanel,Jlabel,我有一个JLabel图标,我只能看到一次更改。为空时,以下代码的新设置图像将正常工作。但在那之后,图像被卡住了。没有新的图像可以取代它。当我在没有重新验证()的情况下在PanelPaint上使用“重新绘制”时,我根本看不到任何图片。这也很奇怪 这是代码,(panelMain房屋PanelPaint) 编辑:我仔细检查了图像是否每次都会更改。 使用JLabel.setIcon()作为标准方式,那么就没有理由在运行时删除、修改和添加新的JComponents 在某些情况下,在JLabel中重新绘制图

我有一个JLabel图标,我只能看到一次更改。为空时,以下代码的新设置图像将正常工作。但在那之后,图像被卡住了。没有新的图像可以取代它。当我在没有重新验证()的情况下在PanelPaint上使用“重新绘制”时,我根本看不到任何图片。这也很奇怪

这是代码,(panelMain房屋PanelPaint)

编辑:我仔细检查了图像是否每次都会更改。

  • 使用
    JLabel.setIcon()
    作为标准方式,那么就没有理由在运行时删除、修改和添加新的
    JComponents

  • 在某些情况下,在
    JLabel
    中重新绘制
    图标出现问题(来自外部来源、www网站等),然后您必须致电

  • 在几个视图中使用CardLayout,则任何操作都只是在卡片之间切换
否则

  • 在所有更改完成后,必须调用
    container.revalidate()
    container.repaint()
    ,作为最后一行代码

  • 为了获得更好的帮助,请尽快发布一个简短、可运行、可编译的JFrame,其中包含JLabel

      • 使用
        JLabel.setIcon()
        作为标准方式,那么就没有理由在运行时删除、修改和添加新的
        JComponents

      • 在某些情况下,在
        JLabel
        中重新绘制
        图标出现问题(来自外部来源、www网站等),然后您必须致电

      • 在几个视图中使用CardLayout,则任何操作都只是在卡片之间切换
      否则

      • 在所有更改完成后,必须调用
        container.revalidate()
        container.repaint()
        ,作为最后一行代码

      • 为了获得更好的帮助,请尽快发布一个简短、可运行、可编译的JFrame,其中包含JLabel


      我在尝试你的建议,但我注意到有些尴尬。新的图像终究在那里,但彼此紧挨着。它只是并排添加图像,而不是替换…1。然后container.revalidate()和container.repaint()在所有情况下都有效,2。最终结果取决于JPanel使用的LayoutManager,3。可能用于JList,修改jcombox中的代码示例,以及Oracle教程中的图像渲染器,您的答案为您指明了方向。显然,PanelPaints添加了标签组件,但从未替换它们。面板主体。移除(面板涂漆);也没有必要。谢谢。我在尝试你的建议,但我注意到了一些尴尬的事情。新的图像终究在那里,但彼此紧挨着。它只是并排添加图像,而不是替换…1。然后container.revalidate()和container.repaint()在所有情况下都有效,2。最终结果取决于JPanel使用的LayoutManager,3。可能用于JList,修改jcombox中的代码示例,以及Oracle教程中的图像渲染器,您的答案为您指明了方向。显然,PanelPaints添加了标签组件,但从未替换它们。面板主体。移除(面板涂漆);也没有必要。非常感谢。
      //get image from somewhere
      JLabel imageLabel = new JLabel();
      Icon imageIcon = new ImageIcon(image);
      imageLabel.setIcon(imageIcon);
      
      panelPainting.setAlignmentX(JLabel.CENTER);
      panelPainting.add(imageLabel);  // default center section
      
      //my insanity starts here
      panelPainting.revalidate();
      
      panelMain.remove(panelPainting);
      panelMain.revalidate();
      
      myIcon.getImage().flush();
      myLabel.setIcon(myIcon);