所以我有以下代码。

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一起使用):java - JDialog组件不会显示-LMLPHP
这是实际的样子(使用上面的代码):java - JDialog组件不会显示-LMLPHP

最佳答案

您在setVisible(true)之前呼叫createView()。但是由于它是模态的JDialog,因此实际上调用setVisible()会阻塞,直到关闭对话框为止。因此,仅在对话框关闭后才调用createView()

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

07-28 03:24
查看更多