Java JDialog组件赢得';我没有出现

Java JDialog组件赢得';我没有出现,java,jdialog,Java,Jdialog,所以我有下面的代码 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);

所以我有下面的代码

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();
    }
}
public类GraveyardFrame扩展JDialog{
私有列表标签列表=新的ArrayList();
私有列表项=新的ArrayList();
公共墓地框架(最终玩家){
设置大小(300300);
片名(“墓地区域~小心!!”;
可设置大小(假);
setModalityType(ModalityType.APPLICATION_MODAL);
setLocationRelativeTo(空);
setVisible(真);
createView(player);//这里我添加了所有组件
}
公共无效createView(播放器){
JPanel mainPanel=newjpanel(newflowlayout());
添加(主面板);
主面板.立根背景(新颜色(128,64,0));
createLabels(player,mainPanel);//在这里我添加了标签,它将获取死角的图标
这个包();
}
私有void createLabels(播放器,JPanel主面板){
pieces.addAll(player.getPlayerGraveyard());//pieces保存所有的死碎片
int sizeOfgraveyard=player.getPlayerGraveyard().size();
对于(int i=0;i
它应该弹出一个JDialog,其中包含一个棋手的所有死亡棋子并显示它们。 首先,我使用了JFrame,但我发现JFrame不能等待操作发生,只能在主GUI上继续(在JDialog中,使用ModalityType就足够了)

问题是它没有显示任何内容,只是一个空的JDialog框。我搜索了这个问题,有人说应该使用validate()、repaint()和pack()。我尝试了这个方法,就像上面的代码一样,但仍然没有任何效果

它应该是这样的(使用JFrame而不是JDialog): 这就是它的实际外观(使用上面的代码):

您在
createView()
之前调用
setVisible(true)
。但由于它是一个模式的
JDialog
,调用
setVisible()
实际上会一直阻塞,直到对话框被取消。因此,
createView()
仅在对话框关闭后调用

只需更改两个方法调用的顺序,第一个是
createView()
,第二个是
setVisible(true)
,它应该可以工作