2012-07-10 68 views
0

是的,這可能看起來像一個重複的問題,但忍受着我。採取下面的代碼,即功能:如何動態更改JFrame內的JPanel引用?

private void setMainLayout(Container pane) { 

    String imagePath = Start.getProperty("IMAGE_DIR");  

    characters.add(char1); // pseudocode 
    characters.add(char2); 
    characters.add(char3); 
    characters.add(char4); 

    // "CharacterDisplay.getMainLayout()" returns a Box object: 
    for (CharacterDisplay character : characters) 
     character.getMainLayout().setBorder(BorderFactory.createMatteBorder(2, 2, 2, 2, Color.WHITE)); 

    // "mainFrame" is a JFrame: 
    mainFrame.setLayout(new GridBagLayout()); 
    GridBagConstraints gbc = new GridBagConstraints(); 

    /* do random gridbagconstraints stuff */ 

    pane.add(characters.get(0).getMainLayout(), gbc); 

    /* do random gridbagconstraints stuff */ 

    // "nonCharacterArea" is a JPanel:  
    nonCharacterArea.setOpaque(true); 
    nonCharacterArea.setBackground(Color.BLACK); 
    nonCharacterArea.setLayout(new GridBagLayout()); 
    GridBagConstraints constCenter = new GridBagConstraints(); 

    /* do random gridbagconstraints stuff */ 

    nonCharacterArea.add(actionPane, constCenter); // actionPane is a kind of JPanel 

    /* do random gridbagconstraints stuff */   

    nonCharacterArea.add(menuPane, constCenter); // menuPane is a kind of JPanel 
    pane.add(nonCharacterArea, gbc); 

    /* do random gridbagconstraints stuff */  

    pane.add(characters.get(1).getMainLayout(), gbc); 

    gbc.gridx = 0; 
    gbc.gridy = 2;  

    pane.add(characters.get(2).getMainLayout(), gbc); 

    gbc.gridx = 2; 
    gbc.gridy = 2;   

    pane.add(characters.get(3).getMainLayout(), gbc); 
} // setMainLayout 

我希望能夠在執行過程中動態地改變0​​對象。什麼是完成這個最好的方法?我專門編寫了這個僞代碼塊,以表明它不僅僅是人們在類似問題中發佈的其他示例一樣簡單 - 因爲它基於在屏幕上某個位置精確放置JPanel,並且此setMainLayout ()方法不應該在每次我只想改變actionPane對象時被調用。

有時它會是一個側面滾動的屏幕,有時它會是一個商店界面,它可以是許多不同種類的東西。

想法?謝謝。

回答

3

不要添加和刪除actionPane - 保留原來的位置,但將子組件添加/刪除到actionPane。由於actionPane只包含一個組件,因此這個任務變得相對簡單。

4

如果actionPane取自幾乎預定義的一小組面板,並且實時更新和更改次數相對較少,那麼最好選擇使用CardLayout,並根據需要在預定義的操作面板之間切換。

如果actionPane非常動態,並且您確實無法提前預測它可能是什麼,那麼@Greg Kopff會有一個合理的答案。