2016-11-29 33 views
-1

我正在爲學生註冊寫一個GUI Java程序,它將從數據庫中檢索可用的類,給用戶選擇類然後將其存儲在數據庫中的選項。在Java Swing中的複選框的動態Arraylist

我試圖做的,迄今已取得了部分成功,是這樣的 - 我創建了一個組合框與現有的專業(得到了來自DB),檢索到的可用類爲主要和顯示覆選框這些類。

此代碼有兩個問題。

  1. 從組合框中選擇專業後,複選框不顯示。只有當我懸停我的光標時,它們纔會一個接一個地出現。
  2. 一旦我在組合框中更改主菜單,即使eclipse中的控制檯顯示新創建的主選項的複選框已經創建,複選框也不會更新。

ArrayList<JCheckBox> checkBoxes=new ArrayList<JCheckBox>(); 
    //combox action listener below 
    public void actionPerformed(ActionEvent e) 
    { 
     //get all available classes for the selected major 
     avail_class = new String[count_class]; 

     //get all available class ids 
     avail_classid = new String[count_class]; 

     JCheckBox checkbox; 
     int xdim = 75; 
     for (int i = 0; i < count_class; i++) 
      { 
       checkbox = new JCheckBox(avail_classid[i] + "-" + avail_class[i]); 
       checkbox.setBackground(new Color(0, 255, 255)); 
       checkbox.setBounds(183, xdim, 289, 23); 
       contentPane.add(checkbox); 
       checkBoxes.add(checkbox); 
       checkbox.setEnabled(true); 

       xdim = xdim + 50; 
      } 
    } 

編輯

對於我的第二個問題,我稱之爲重繪()和它的工作。對於第一個,我做了以下內容:

if(flag < 0) 

//flag will be raised whenever there is a change in the selected major. For ex, from web dev to data analytics 

     for(int i = 0; i < checkBoxes.size(); i++) 
      { 
       checkBoxes.get(i).setVisible(false); 
       System.out.println("old Checkboxes invisible!" + i); 
      } 
+0

你在做什麼使無效框架或面板的新複選框?你需要告訴容器佈置和顯示孩子,每當你改變他們。 – sprinter

+0

'checkbox.setBounds(183,xdim,289,23);'1)Java GUI必須在不同的語言環境中使用不同的PLAF來使用不同的OS',屏幕大小,屏幕分辨率等。因此,它們不利於像素的完美佈局。請使用佈局管理器或[它們的組合](http://stackoverflow.com/a/5630271/418556)以及[white space]的佈局填充和邊框(http://stackoverflow.com/a/17874718/ 418556)。 2)爲了更快地獲得更好的幫助,請發佈[MCVE]或[簡短,獨立,正確的示例](http://www.sscce.org/)。 –

回答

1

你需要調用重繪和重新驗證功能來保存你的複選框,用新的複選框來重新繪製容器。

+0

你需要調用'revalidate()'和'repaint()'。由於組件的大小仍然爲(0,0),因此首先執行repaint()將無濟於事。 'revalidate()'調用佈局管理器在繪製之前給組件一個大小。 – camickr

+0

謝謝!重繪完成了這項工作。 –