2017-10-16 7 views
0

次のコードがあります。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); 
    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()を使うべきだと言った人がいました。上記のコードのようにこれを試しましたが、何も起こりません。

これは、JDialogではなくJFrameで動作します。fine これは実際に(上のコードで)次のようになります。 not fine

答えて

1

createView()の前にsetVisible(true)と呼んでください。しかし、それはモーダルであるJDialogであるため、setVisible()を呼び出すと、ダイアログが閉じられるまで実際にブロックされます。したがって、createView()は、ダイアログが閉じられると呼び出されます。

最初にcreateView()と次のsetVisible(true)の2つのメソッド呼び出しの順序を変更しても問題ありません。

+0

です。ありがとう! – Tudor

関連する問題