Java JPanel没有正确刷新
我的一个朋友给我发了一个项目,让我把它弄得更干净,这个项目是一个JFrame,有一个容器,容器中有一些标签,它们根据一些参数而变化,我试图做的是把所有标签放在JFrame中的一个JPanel中,问题是标签没有变化,当我填充面板来创建地图时,效果很好,但是当必须切换的图像不工作时,逻辑也很好,因为我与记录器(System.out.println stuff)进行了检查,并且工作正常。 我还要说,我创建的JPanel是使用NetBeans调色板(拖放)制作的 我试过myPanel.validate、.revalidate()和.repaint(),但都不起作用Java JPanel没有正确刷新,java,swing,Java,Swing,我的一个朋友给我发了一个项目,让我把它弄得更干净,这个项目是一个JFrame,有一个容器,容器中有一些标签,它们根据一些参数而变化,我试图做的是把所有标签放在JFrame中的一个JPanel中,问题是标签没有变化,当我填充面板来创建地图时,效果很好,但是当必须切换的图像不工作时,逻辑也很好,因为我与记录器(System.out.println stuff)进行了检查,并且工作正常。 我还要说,我创建的JPanel是使用NetBeans调色板(拖放)制作的 我试过myPanel.validate、
欢迎任何帮助。提前感谢。您可以通过直接从
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
- 在某些情况下,
不起作用(从web或HDD上读取)Icon/ImageIcon
- 解决方案非常简单,将所有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);