Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/345.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
Java JPanel没有正确刷新_Java_Swing - Fatal编程技术网

Java JPanel没有正确刷新

Java JPanel没有正确刷新,java,swing,Java,Swing,我的一个朋友给我发了一个项目,让我把它弄得更干净,这个项目是一个JFrame,有一个容器,容器中有一些标签,它们根据一些参数而变化,我试图做的是把所有标签放在JFrame中的一个JPanel中,问题是标签没有变化,当我填充面板来创建地图时,效果很好,但是当必须切换的图像不工作时,逻辑也很好,因为我与记录器(System.out.println stuff)进行了检查,并且工作正常。 我还要说,我创建的JPanel是使用NetBeans调色板(拖放)制作的 我试过myPanel.validate、

我的一个朋友给我发了一个项目,让我把它弄得更干净,这个项目是一个JFrame,有一个容器,容器中有一些标签,它们根据一些参数而变化,我试图做的是把所有标签放在JFrame中的一个JPanel中,问题是标签没有变化,当我填充面板来创建地图时,效果很好,但是当必须切换的图像不工作时,逻辑也很好,因为我与记录器(System.out.println stuff)进行了检查,并且工作正常。 我还要说,我创建的JPanel是使用NetBeans调色板(拖放)制作的

我试过myPanel.validate、.revalidate()和.repaint(),但都不起作用


欢迎任何帮助。提前感谢。

您可以通过直接从
JPanel
获取图标来更新该图标。在运行此代码之前,必须为每个
JLabel
命名

if(something) {
doSomething(myPanel);
}

public void doSomething(JPanel myPanel) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                Component[] components = myPanel.getComponents();
                Component component = null;
                for (int i = 0; i < components.length; i++) {
                    component = components[i];
                    if (component instanceof JLabel) {
                        JLabel label = (JLabel) component;
                        String name = label.getName();
                        if (name.equalsIgnoreCase("a")) {
                            label.setIcon(null);
                            label.setIcon(new javax.swing.ImageIcon(getClass().getResource("/ImageA.jpg")));
                            label.revalidate();
                            label.repaint();
                        }
                    }
                }

                myPanel.revalidate();
                myPanel.repaint();
            }
        });
    }
if(某物){
剂量测定法(myPanel);
}
公共无效剂量测定(JPanel myPanel){
SwingUtilities.invokeLater(新的Runnable(){
公开募捐{
Component[]components=myPanel.getComponents();
组件=空;
对于(int i=0;i
  • 在某些情况下,
    Icon/ImageIcon
    不起作用(从web或HDD上读取)

  • 解决方案非常简单,将所有Icon/ImageIcon作为局部变量加载,然后Swing JComponents就不会引起上午问题

考虑创建并发布一个。如果我们能重现您的问题,我们就能更好地帮助您解决它。也许这会对您有所帮助。试着使用
myPanel.revalidate()
和/或
myPanel.repaint()
@Blackmore:我们要求a的原因之一是有时我们需要更多的上下文;例如,是否在EDT中调用
play()
,这可能会导致更新UI组件时出现问题为您的程序创建新功能的方法,尤其是您还不太了解的方法,是在一个小的独立测试程序中创建它,因此,您可以解决其中的bug,而不必担心程序其他部分的影响。我建议你现在就这样做,这同时会给你一个sscce。失败了,我不知道我们会有多大的机会来帮助你,如果你不能做到这一点,考虑关闭这个问题。谢谢你的回应,但是它不起作用。然后将图标存储为局部变量。
if(something) {
doSomething(myPanel);
}

public void doSomething(JPanel myPanel) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                Component[] components = myPanel.getComponents();
                Component component = null;
                for (int i = 0; i < components.length; i++) {
                    component = components[i];
                    if (component instanceof JLabel) {
                        JLabel label = (JLabel) component;
                        String name = label.getName();
                        if (name.equalsIgnoreCase("a")) {
                            label.setIcon(null);
                            label.setIcon(new javax.swing.ImageIcon(getClass().getResource("/ImageA.jpg")));
                            label.revalidate();
                            label.repaint();
                        }
                    }
                }

                myPanel.revalidate();
                myPanel.repaint();
            }
        });
    }
     ImageIcon pictures = new ImageIcon("whatever");
     pictures.getImage().flush();
     myLabel[2][3].setIcon(pictures);