2013-08-29 99 views
2

我一直试图在JPanel中添加一组复杂的元素,根据返回的列数将它们展开 - 并将其显示在生成的新面板中点击一个按钮向JPanel添加元素,但它们不显示

我做错了什么,但无法弄清楚它是什么。 替换标题面板中的其他文本元素工作得很好,但看不出为什么我生成的代码只是没有被添加到面板(或者更可能 - 面板没有以可访问的方式显示)

  My JPanel output code - 
      private JPanel getOutput() throws BadIdent { 

    short[] HDformats = { HDformat, Audformat }; 
    short[] SDformats = { SDformat, Audformat }; 
    List poolInfo; 
    List freeSpaceHD = null; 
    List freeSpaceSD = null; 
    System.out.println(man.getZoneNumberName()); 
    // System.out.println(man.getPoolInfo()); 
    poolInfo = man.getPoolInfo(); 
    List poolSpace = man.getPoolSpace(); 
    if ((Short) HDformat != null) { 
     freeSpaceHD = man.getFreeSpace(HDformats); 
    } 
    if ((Short) SDformat != null) { 
     freeSpaceSD = man.getFreeSpace(SDformats); 
    } 
    JPanel content_panel = new JPanel(new GridLayout(poolInfo.size(), 4)); 
    JLabel[] PoolInfoLabel = new JLabel[poolInfo.size()]; 
    JLabel[] PoolSpaceLabel = new JLabel[poolInfo.size()]; 
    JLabel[] PoolSpaceHDLabel = new JLabel[poolInfo.size()]; 
    JLabel[] PoolSpaceSDLabel = new JLabel[poolInfo.size()]; 
    JPanel[] PoolInfo = new JPanel[poolInfo.size()]; 
    // GridBagConstraints gbc_lblPoolInfo[] = new 
    // GridBagConstraints[poolInfo 
    // .size()]; 
    // JLabel[] PoolInfoLabel = new JLabel[poolInfo.size()]; 
    for (int i = 0; i < poolInfo.size(); i++) { 
     PoolInfoLabel[i] = new JLabel(); 
     PoolSpaceLabel[i] = new JLabel(); 
     PoolSpaceHDLabel[i] = new JLabel(); 
     PoolSpaceSDLabel[i] = new JLabel(); 
     PoolInfoLabel[i].setText((String) poolInfo.get(i)); 
     System.out.println(poolInfo.get(i)); 
     PoolSpaceLabel[i].setText((String) poolSpace.get(i)); 
     PoolSpaceHDLabel[i].setText((String) freeSpaceHD.get(i)); 
     PoolSpaceSDLabel[i].setText((String) freeSpaceSD.get(i)); 

     // 
     // System.out.println(PoolInfoLabel[i].getText()); 

    } 
    for (int i = 0; i < PoolInfoLabel.length; i++) { 
     PoolInfo[i] = new JPanel(); 
     PoolInfo[i].add(PoolInfoLabel[i]); 
     PoolInfo[i].add(PoolSpaceLabel[i]); 
     PoolInfo[i].add(PoolSpaceHDLabel[i]); 
     PoolInfo[i].add(PoolSpaceSDLabel[i]); 
     System.out.println(PoolSpaceLabel[i].getText()); 
     System.out.println(PoolSpaceSDLabel[i].getText()); 
     System.out.println(PoolSpaceHDLabel[i].getText()); 
    } 
    for (int i = 0; i < PoolInfo.length; i++) { 
     content_panel.add(PoolInfo[i]); 
    } 
    return content_panel; 
} 

按钮码添加和改变在面板和框架元件(帧是主显示器面板是标题,位于北边界布局。加入并正确显示 三个组合框和I” m使用很多相同的机制来生成并显示它们,因为我在getOutput()函数中使用了它们

JButton ButtonSubmit = new JButton("Connect"); 
    ButtonSubmit.addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent e) { 
      try { 
       man.ManagerConnect(ISAHostName.getText(), null); 
       // System.out.println(man.getZoneNumberName()); 
       ZoneNumName.setText(man.getZoneNumberName()); 
       AudFormat = getAudCombo(); 
       HDVidFormat = getHDCombo(); 
       SDVidFormat = getSDCombo(); 
       panel.add(HDVidFormat, gbc_HDVidFormat); 
       panel.add(SDVidFormat, gbc_SDVidFormat); 
       panel.add(AudFormat, gbc_AudFormat); 
       btnFormatButton.setEnabled(true); 
       frame.repaint(); 

      } catch (Exception e1) { 
       // TODO Auto-generated catch block 
       e1.printStackTrace(); 
      } 
     } 

    }); 
    panel.add(ButtonSubmit, gbc_ButtonSubmit); 
    btnFormatButton.addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent e) { 
      try { 
       JPanel content_panel = getOutput(); 
       frame.getContentPane().add(content_panel, 
         BorderLayout.CENTER); 
      } catch (BadIdent e1) { 
       // TODO Auto-generated catch block 
       e1.printStackTrace(); 
      } 
     } 

    }); 
    panel.add(btnFormatButton, gbc_btnNewButton); 

仅供参考 - 获得高清格式组合框

private JPanel getHDCombo() { 
    JComboBox combo = new JComboBox(); 
    combo.setFont(new Font("Tahoma", Font.PLAIN, 10)); 
    combo.setMaximumRowCount(10); 
    final Map<String, Integer> map = man.HDVidFormats(); 
    Collection<String> keys = map.keySet(); 
    Iterator<String> it = keys.iterator(); 
    while (it.hasNext()) { 
     String key = it.next(); 
     combo.addItem(key); 
    } 
    combo.addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent e) { 
      JComboBox combo = (JComboBox) e.getSource(); 
      String key = (String) combo.getSelectedItem(); 
      int format = map.get(key); 
      System.out.println(format); 
      HDformat = (short) format; 
     } 
    }); 
    JPanel panel = new JPanel(); 
    panel.setBackground(new Color(0, 0, 0, 0)); 
    panel.add(combo); 
    return panel; 
} 

我敢肯定,这是简单的,但老实说,我看不出为什么面板没有被添加 道歉的代码 - 它已经有几年以来我写任何GUI代码从零开始Java中

+0

您是否对框架使用了'null'布局,我的意思是'frame.setLayout(null)'?并且您是否将面板添加到了构架中的框架中 – Azad

+1

考虑为[更好的帮助制作[SSCCE](http://www.sscce.org),代码太多 – nachokk

+0

尝试添加'frame.getContentPane()在frame.getContentPane()。add(content_panel,BorderLayout.CENTER)之后的'。,'和'frame.getContentPane()。repaint()'' – MadProgrammer

回答

0

设置您的布局frame.setLayout(null);

为空做什么MadProgrammer说

尝试添加frame.getContentPane()。invalidate(); frame.getContentPane()。validate();和frame.getContentPane()重绘()后frame.getContentPane()加(content_panel,BorderLayout.CENTER) - MadProgrammer 8月29日在0:42

和关于你的第二个问题,加上它像这样

frame.add(*jpanel here*, BorderLayout.CENTER); 
*jpanel*.setBounds(width,height,x,y); //check up on this one. i think the param might be backwards 

设置界限应该将您的jpanel移动到位置并根据高度和宽度设置其边界。