2013-12-08 91 views
1

我想將多個組件添加到JPanel,但只顯示最近添加的組件。如何將多個JComponents添加到JPanel?

看起來問題是佈局一次只能處理1個組件,但我對如何實際修復它不知所措。我嘗試將組件添加到單獨的面板,然後將其添加到主面板,並嘗試了幾種不同的佈局,但無濟於事。

下面是相關的代碼,我目前正試圖只拿到兩個TextRects,其擴展JComponent的,面板上:

public class ProjectView extends JFrame implements IProjectView, Observer { 

private IProjectModel model; 
private ProjectController controller; 
private JPanel panel; 

public ProjectView(IProjectModel model){ 
    this.model = model; 
    ((Observable) this.model).addObserver(this); 

    controller = new ProjectController(this.model, this); 

    addWindowListener(controller); 
    getContentPane().setLayout(new BorderLayout()); 

    populateMenuBar(); 

    panel = new JPanel(new BorderLayout()); 

    getContentPane().add(panel); 
    pack(); 
    setMinimumSize(getSize()); 

    setExtendedState(JFrame.MAXIMIZED_BOTH); 
} 

public void generateUML(ArrayList<ArrayList<String>> content){ 
    panel.add(new TextRect(content.get(0), 10, 10)); 
    panel.add(new TextRect(content.get(0), 100, 100)); 

    panel.revalidate(); 
} 

任何幫助,將不勝感激。

編輯:

generateUML從控制器一個ActionListener稱爲當用戶按下 「生成UML」 按鈕:

private void generateUML(){ 
    ArrayList<IClassModel> classes = new ArrayList<IClassModel>(); 
    classes = model.getClasses(); 
    ArrayList<ArrayList<String>> allClasses = new ArrayList<ArrayList<String>>  (); 
    for(int i = 0 ; i < classes.size() ; i++){ 
     classContent = new ArrayList<String>(); 
     classContent.add(classes.get(i).getClassName()); 
     classContent.addAll(classes.get(i).getMethodNames()); 
     classContent.addAll(classes.get(i).getObjectClasses()); 
     allClasses.add(classContent); 
    } 

    System.out.println("1: " + allClasses.get(0)); 
    System.out.println("2: " + allClasses.get(1)); 
    view.generateUML(allClasses); 
} 
+0

'看起來,當我將其更改爲FlowLayout中沒有顯示在all'一樣 - 這可能是因爲你的TextRect組件不會覆蓋的getPreferredSize()方法返回一個適當的尺寸。 – camickr

回答

1

試試這個

panel.add(new TextRect(content.get(0), 10, 10), BorderLayout.SOUTH); 
panel.add(new TextRect(content.get(0), 100, 100), BorderLayout.CENTER); 

panel.revalidate(); 
panel.reapint() 

如果設置了BorderLayout的,你應該使用它的屬性。另外,在調用revalidate()之後,你應該調用repaint();

另一種選擇是一個網格佈局

panel = new JPanel(new GridLayout(1, 2)); // or 2, 1 depending if you want them 
              // laid out vertically or horizontally 

panel.add(new TextRect(content.get(0), 10, 10)); 
panel.add(new TextRect(content.get(0), 100, 100)); 
+0

感謝您的建議,它看起來像只放置在中心的組件正在顯示。由於我期望根據源代碼中類的數量動態添加組件,因此指定面板的哪一部分來添加每個組件不太可行 – SkinnyMc

+0

GridLayout的工作原理!非常感謝 – SkinnyMc

+2

@ user3080715的幫助,「看起來只有放置在Center中的組件正在顯示」 - 這可能是因爲您的TextRect組件不覆蓋getPreferredSize()方法以返回適當的大小。 GridLayout的工作原理是因爲它忽略了首選大小。 – camickr

0

您正在使用的BorderLayout爲您面板。添加方法將添加到面板的中心,並將擴大未被北,南,東,西用盡的尺寸。也許您正在尋找只將組件放在一起的FlowLayout。 只有一個組件可以出現在BorderLayout的任何部分中。所以,如果您將兩個組件添加到中心,只有最後一個可見。

+0

感謝您的回覆,不幸的是,它看起來像當我將其更改爲FlowLayout時根本沒有任何顯示 – SkinnyMc

+0

您調用generateUML的代碼是什麼? – rabz100

+0

Woops,不能在這裏添加所有的代碼,我將它編輯到主要問題 – SkinnyMc