2017-10-16 62 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()。我想這一點,因爲在上面的代碼,但還是沒有任何反應

這是應該的樣子(可與JFrame的替代的JDialog):fine 這是它的實際樣子(與上面的代碼): not fine

回答

1

createView()之前調用setVisible(true)。但是因爲它是模態的JDialog,所以調用setVisible()實際上阻塞,直到對話被解除。所以,createView()只有在對話框關閉後纔會被調用。

只要改變這兩個方法調用,第一createView()和未來setVisible(true)的秩序,它應該工作。

+0

它的工作原理。謝謝 ! – Tudor