我有一个简单的对象可以扩展JPanel
, 当。。。的时候update()
在此对象上调用方法,这意味着向面板添加一些标签,然后重新绘制。但是调用 update 方法后标签并没有显示,下面是 update 的代码:
public void update(){
GridBagConstraints constraints = new GridBagConstraints();
if(cardsHidden){
for(int i = 0; i < 2; i++){
constraints.gridx = i;
constraints.gridy = 0;
JLabel card = new JLabel(PlayingCards.cardImages[PlayingCards.CARD_BACK_INDEX]);
add(card, constraints);
}
}
else{
Card[] holeCards = player.getHoleCards();
for(int i = 0; i < holeCards.length; i++){
constraints.gridx = i;
constraints.gridy = 0;
JLabel card = new JLabel(holeCards[i].getImageIcon());
add(card, constraints);
}
}
validate();
repaint();
}
有任何想法吗?
Thanks
EDIT
solved:
事实证明,HoleCardsPanel
没有正确添加到其父框架。修复后添加新的JLabel
工作正常。我也:
- 将调用添加到
update()
事件调度线程的方法使用SwingUtillities.invokeLater
- 不得不打电话
validate()
从最上面的组件(在这种情况下JFrame
) 作为 Devon_C_Miller在他的回答中建议 https://stackoverflow.com/a/2157762/1048186.
这取决于您想要发生的情况以及使用的布局管理器,但基本规则是:
-
确保update
在 EDT 上调用。如果不是(SwingUtilities.isEventDispatchThread()
返回 false)你需要使用SwingUtilities.invokeLater
安排 EDT 上的更新。例如:
SwingUtilities.invokeLater(new Runnable() {
public void run() {
update();
}});
Call invalidate()
。大多数更改组件的操作都会为您完成此操作。因此,只有当以下内容无法单独工作时,您才需要调用它。
-
Call validate()
on the highest受影响的组件。这可能是 Java 渲染周期中最混乱的部分。致电给invalidate
标记该组件及其所有祖先由于需要布局。致电给validate
执行组件及其所有内容的布局后人。一个“向上”工作,另一个“向下”工作。你需要打电话validate
在树中将受您的更改影响的最高组件上。
另外,在顶级组件(JWindow、JDialog、JFrame)上调用 validate 不一定会调整该组件的大小。要实现这一点,您需要致电pack()
or setSize()
.
如果您的更改改变了容器的大小或位置,则调整大小的容器将重新绘制,但它们不会擦除容器的空间used to占据。呼唤repaint()
在容器的父级上将导致其重新绘制背景,纠正损坏。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)