我正在尝试跟踪存储在背包对象中的所有耗材,并使用观察者/可观察的实现创建一个显示耗材更新的界面。出于某种原因,当我运行此代码时,背包中有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);
}
}
});
}
}

答案 0 :(得分:3)
Swing在容器更新(添加/删除)方面很懒,这允许您快速连续执行一些添加/删除操作,而不必担心系统在尝试更新整个容器时会停止运行每次通话时的层次结构。
添加完所有组件后,请致电revalidate
和repaint
。另外,请确保您的JPanel
正在使用能够支持多个孩子的布局管理器。
您可以考虑使用JList
或JTable
代替