2015-07-07 3 views
1

Я работаю над небольшой программой для копирования файлов в буфер обмена. Комбобокс заполняется на основе папок/файлов в указанной директории. Первый comboBox заполнен соответствующим образом. Теперь, когда добавлен второй comboBox, первый ящик больше не отображается, а поле, которое отображается, не загружено.Combo Box не отображает данные

Обновлено: Я переписал код и теперь вижу второй comboBox. Данные, которые хранятся в Object [] субфайлах не передаются во вторую ComboBox

public class s2 extends JPanel implements ActionListener, Runnable{ 

    public static File folder = new File("u:/response"); 
    static String temp = ""; 

    final JComboBox t1 = new JComboBox(); 
    final JComboBox t2 = new JComboBox(); 
    final Object [] files; 
    Object [] subFiles; 

    List<String> list1 = new ArrayList<String>(); 
    static List<File> list2 = new ArrayList<File>(); 

    public s2() {  

    List<String> list1 = new ArrayList<String>(); 
    List<File> list2 = new ArrayList<File>(); 

    for (File fl : folder.listFiles()) 
    { 
     list1.add(fl.getName().toUpperCase()); 
    } 

    files = list1.toArray(); 
    t1.setModel(new DefaultComboBoxModel(files)); 

    } 


    public class tier1 implements ActionListener 
    { 
     @Override 
     public void actionPerformed(ActionEvent e) { 
      int i = t1.getSelectedIndex(); 

      File node = new File(folder.getAbsoluteFile() + "\\" + list1.get(i)); 
      listFiles(node); 

      subFiles = list2.toArray(); 
      t2.setModel(new DefaultComboBoxModel(subFiles)); 
    }  

    } 

    public class tier2 implements ActionListener 
    { 
     @Override 
     public void actionPerformed(ActionEvent e2){  

      } 
     } 

    public static void listFiles (File folder){ 
      for (final File fileEntry : folder.listFiles()){ 
      if (fileEntry.isFile()){ 
       temp = fileEntry.getAbsolutePath(); 
       list2.add(fileEntry); 
       System.out.println(temp); 

      } 
      } 
     } 

    @Override 
    public void run() { 

     JFrame f = new JFrame("Response Library"); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     UtilityBar ub = new UtilityBar(); 
     f.setJMenuBar(ub.menuBar); 

     f.add(this); 
     f.add(t1); 
     f.add(t2, BorderLayout.SOUTH); 

     f.pack(); 
     f.setLocationRelativeTo(null); 
     f.setVisible(true); 
     f.setPreferredSize(new Dimension (75,300)); 

    } 

    public static void main(String[] args) { 
     EventQueue.invokeLater(new s2()); 
    } 

ответ

2

JFrame использует BorderLayout в качестве менеджера компоновки по умолчанию. Когда вы делаете

f.add(t1); 
f.add(t2); 

оба комбинированные окна расположены в том же положении (BorderLayout.CENTER), и менеджер компоновки поддерживает только один компонент в каждой позиции.

f.add(t1); 
f.add(t2, BorderLayout.SOUTH); 

Поместите второй под первым, так что оба комбинированных поля должны быть видны.

Кроме того, вы должны создать и получить доступ к компонентам поворота только в event dispatch thread.

+0

спасибо @kiheru. Ваши предложения помогли мне получить видимость второго блока comboBox. Я переписал код тому, что, как я думаю, имел в виду в вашем комментарии, относящемся к потоку событий. – Elle