java - JPanel 没有更新我需要更新的两条数据之一

标签 java swing

我正在尝试跟踪存储在背包对象中的所有补给品,并创建一个使用观察者/可观察实现显示补给品更新的界面。由于某种原因,当我运行此代码时,背包中有 2 个项目,第二个项目会更新并显示到期日期随着时间更改的触发而减少。第一个根本没有改变,就好像它是一个静态标签一样。请有人让我知道我做错了什么?非常感谢您提前的帮助!另外,我对 Java 编程非常陌生,所以请提供额外的信息/解释,我们将不胜感激。

这是我的代码:

package view;
import java.util.Observable;
import java.util.Observer;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

import supplies.Supplies;
import model.Adventure;
import model.Knapsack;

public class InventoryView extends JPanel implements Observer{
	private Knapsack knapsack;
	private Adventure adventure;
	private JLabel b;

	public InventoryView(Adventure adventure) {
		this.adventure=adventure;
		this.knapsack=adventure.getSquad().getKnapsack();
		for (Supplies supply : knapsack.getSupplies()) {
			b=new JLabel(supply.toString());
			add(b);
		}
		knapsack.addObserver(this);
	}
	@Override
	public void update(Observable arg0, Object arg1) {
		SwingUtilities.invokeLater(new Runnable() {
			public void run() {
				for (Supplies supply : knapsack.getSupplies()) {
					b.setText(supply.toString());
					add(b);
				}				
			}
		});
	}
}

最佳答案

Swing 在容器更新(添加/删除)方面是惰性的,这允许您快速连续执行多个添加/删除,而不必担心系统在尝试更新整个容器时会停止运行每次调用的层次结构。

添加所有组件后,调用revalidaterepaint。另外,请确保您的 JPanel 使用能够支持多个子项的布局管理器。

您可以考虑使用 JListJTable 代替

关于java - JPanel 没有更新我需要更新的两条数据之一,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29858418/

相关文章:

java - 尝试和理解大型 Java Swing 代码库的最佳方法是什么。

java - HashMap 作为 HashMap 中的值

java - 如何避免 arraylist 中的索引 out p 绑定(bind)异常

java - 通过 gradle 为 spring boot 应用构建 docker 镜像时的最佳实践

java - 在几个JLabel中设置相同的gif作为图标

java - 更改文本区域的文本

java - 如何使用按钮操作将字符串传递给类

java - 使用 log4j-web.jar 在 Web 应用程序中配置 Log4j2

java - 使用 if 语句求 3 个变量中的最小值

java - [JAVA]如何调用方法 "itemStateChanged"