所以我有以下代码。
public class GraveyardFrame extends JDialog{
private List<JLabel> labelList = new ArrayList<>();
private List<Piece> pieces = new ArrayList<>();
public GraveyardFrame(final Player player) {
setSize(300,300);
setTitle("Graveyard Zone~ Watch out!!");
setResizable(false);
setModalityType(ModalityType.APPLICATION_MODAL);
setLocationRelativeTo(null);
setVisible(true);
createView(player); //here I add all the components
}
public void createView(Player player) {
JPanel mainPanel = new JPanel(new FlowLayout());
add(mainPanel);
mainPanel.setBackground(new Color(128,64,0));
createLabels(player ,mainPanel); //here I add the labels, that will take the icon of the dead pieces
this.pack();
}
private void createLabels(Player player , JPanel mainPanel) {
pieces.addAll(player.getPlayerGraveyard()); //pieces holds all the dead pieces
int sizeOfgraveyard = player.getPlayerGraveyard().size();
for (int i = 0 ; i < sizeOfgraveyard ; i++) {
JLabel label = new JLabel();
label.setSize(60, 60);
label.setIcon(pieces.get(i).getIcon());
labelList.add(label);
mainPanel.add(label);
mainPanel.validate();
mainPanel.repaint();
}
}
应该弹出一个JDialog,将棋手的所有尸体都显示出来。
首先,我使用了JFrame,但是我发现JFrame不能等待动作发生,只能继续使用主GUI。(在JDialog中,使用ModalityType就足够了)。
问题是它什么也没显示,只是一个空的JDialog框。我搜索了这个问题,并且here有人说您应该使用validate(),repaint()和pack()。我像上面的代码一样尝试了此操作,但仍然没有任何反应
这就是它的外观(与JFrame而不是JDialog一起使用):
这是实际的样子(使用上面的代码):
最佳答案
您在setVisible(true)
之前呼叫createView()
。但是由于它是模态的JDialog
,因此实际上调用setVisible()
会阻塞,直到关闭对话框为止。因此,仅在对话框关闭后才调用createView()
。
只需更改两个方法调用的顺序,第一个createView()
和下一个setVisible(true)
,它应该可以工作。