2015-02-01 4 views
0

Я везде (here и here), чтобы найти ответ на мою проблему. Я пытаюсь добавить неизвестное число JButton в JScrollPane в зависимости от выбора JComboBox. Я знаю, что вам нужно добавить элемент в JPanel, чтобы получить их в графическом интерфейсе.Добавление неизвестного числа JButton в JScrollPane

Вот пример кода: (Это does'nt работа), это пример)

public class test { 

ArrayList<JButton> button = new ArrayList<JButton>(); 
String[] stringArray = {"Goat", "Cow", "Dog", "Cat", "Human"}; 
JComboBox comboBox = new JComboBox(stringArray); 
JPanel containerPanel = new JPanel(); 
JScrollPane scroller = new JScrollPane(containerPanel); 

public void addButton(String btnName) { 
    button.add(new JButton(btnName)); 
    containerPanel.add(button.get(button.size() - 1)); 
} 

public class Action implements ActionListener { 
    @Override 
    public void actionPerformed(ActionEvent e) { 
     addButton(comboBox.getSelectedItem().toString()); 
    } 
} 

}

Я хочу добавить столько JButton, как пользователь хочет.

Если я просто добавить их следующим образом:

containerPanel.add(new JButton("test")); 

Это работает, но это не то, что я хочу достичь.

Вы можете мне помочь?

EDIT: ___________________________________________________________________________

Вот код, который компилировать и является упрощенной копией того, что я пытаюсь сделать:

public class Frame extends JFrame { 

String[] list = {"Human", "Goat", "Dog", "Cat", "Duck"}; 
ArrayList<JButton> button = new ArrayList<JButton>(); 
JComboBox cBox = new JComboBox(list); 
JPanel container = new JPanel(); 
JScrollPane scroller = new JScrollPane(container); 

public Frame() { 
    cBox.addActionListener(new Action()); 
    this.setLayout(new BorderLayout()); 
    this.setSize(200, 200); 
    this.add(cBox, BorderLayout.SOUTH); 
    this.add(scroller, BorderLayout.CENTER); 
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    this.setVisible(true);  
} 

public void createBtn(String s) { 
    System.out.println("Button's label : " + s); 
    button.add(new JButton(s)); 
    System.out.println("Button's index : " + (button.size() - 1)); 
    container.add(button.get(button.size() - 1)); 
} 

public class Action implements ActionListener { 
    @Override 
    public void actionPerformed(ActionEvent e) { 
     System.out.println("Action made"); 
     JComboBox temp = (JComboBox) e.getSource(); 
     createBtn(temp.getSelectedItem().toString()); 
    } 
} 
} 
+0

Вы указываете [этот вопрос] (http://stackoverflow.com/questions/22268958/how-to-add-jbutton-on-jscrollpane), и все же вы необъяснимо игнорируете ответ на использование подходящего макета, такого как GridLayout - почему? Почему бы не установить макет containerPanel в GridLayout и добавить к нему свои кнопки? –

+1

Ehm просто используйте цикл, чтобы добавить столько кнопок, сколько хотите? –

+0

@HovercraftFullOfEels Я попытался использовать «BoxLayout», а также «FlowLayout», но никто не работает. – Chax

ответ

1

Так что я просто discored очень аккуратным функцию, которая обновить a JPanel: validate(). Он скрывался почти прямо здесь, в StackOverflow here.

После некоторого чтения о разнице между validate(), revalidate() и invalidate() (Это не полезно) here, я решил, что validate() это один я нужен.

Просто добавив эту функцию в createBtn(String s), я смог сделать все мое JButton.

Новый код выглядеть следующим образом:

public class Frame extends JFrame { 

    String[] list = {"Human", "Goat", "Dog", "Cat", "Duck"}; 
    ArrayList<JButton> button = new ArrayList<JButton>(); 
    JComboBox cBox = new JComboBox(list); 
    JPanel container = new JPanel(); 
    JScrollPane scroller = new JScrollPane(container); 

    public Frame() { 
     cBox.addActionListener(new Action()); 
     this.setLayout(new BorderLayout()); 
     this.setSize(200, 200); 
     this.add(cBox, BorderLayout.SOUTH); 
     this.add(scroller, BorderLayout.CENTER); 
     this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     this.setVisible(true);  
    } 

    public void createBtn(String s) { 
     System.out.println("Button's label : " + s); 
     button.add(new JButton(s)); 
     System.out.println("Button's index : " + (button.size() - 1)); 
     container.add(button.get(button.size() - 1)); 

     //Note the new addition 
     container.validate(); 
    } 

    public class Action implements ActionListener { 
     @Override 
     public void actionPerformed(ActionEvent e) { 
      System.out.println("Action made"); 
      JComboBox temp = (JComboBox) e.getSource(); 
      createBtn(temp.getSelectedItem().toString()); 
     } 
    } 
} 

Из того, что я понял, validate() задать все дочерние их размер и такие вещи, как, что и подтвердить, что они в порядке, чтобы продолжить. Единственная проблема заключается в том, что это может занять много времени. Другими словами, это может вызвать проблемы с производительностью.

Исправьте меня, если у вас есть лучший ответ.

Смежные вопросы