2016-11-29 68 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

谢谢!重绘完成了这项工作。 –