我正在尝试跟踪存储在背包对象中的所有补给品,并创建一个使用观察者/可观察实现显示补给品更新的界面。由于某种原因,当我运行此代码时,背包中有 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 在容器更新(添加/删除)方面是惰性的,这允许您快速连续执行多个添加/删除,而不必担心系统在尝试更新整个容器时会停止运行每次调用的层次结构。
添加所有组件后,调用revalidate
和repaint
。另外,请确保您的 JPanel
使用能够支持多个子项的布局管理器。
您可以考虑使用 JList
或 JTable
代替
关于java - JPanel 没有更新我需要更新的两条数据之一,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29858418/