2012-06-05 2 views
3

У меня возникли проблемы с обновлением данных внутри JComboBox.Как обновить данные JComboBox?

У вас есть Create, у которого есть ActionListener, что добавляет предмет в JComboBox.

Но изменения не отражаются в графическом интерфейсе: я все еще не вижу новый добавленный элемент.

repaint() не помогает.

Update: Вот (почти) полный код GUI:

public class Main extends JFrame implements ActionListener 
{ 
    static Connection conn; 
    static PreparedStatement ps = null; 
    static ResultSet res; 

    static Statement sta; 

private final static int ITERATION_NUMBER = 1000; 

public void GUI() throws SQLException { 
    setBounds(0, 0, 320, 240); 
    addWindowListener(new WindowAdapter(){ 
    public void windowClosing(WindowEvent we){ 
     close(ps); 
     close(res); 
     close(conn); 
     System.exit(0); 
     } 
    }); 
    setMinimumSize(new Dimension(320, 240)); 
    setResizable(false); 

    this.setTitle("Accounts"); 

    JPanel panel = new JPanel(); 
    GridLayout2 GL = new GridLayout2(4,3); 
    GL.setHgap(10); 
    panel.setLayout(GL); 

    Font font = new Font("Serif", Font.BOLD, 20); 
    Font font2 = new Font("Courier New", Font.BOLD, 16); 

    JLabel label1 = new JLabel("Username"); 
    JLabel label2 = new JLabel("Password"); 
    JLabel label3 = new JLabel("Controls"); 

    label1.setFont(font2); 
    label2.setFont(font2); 
    label3.setFont(font2); 

    final JTextField username = new JTextField(); 
    final JTextField password1 = new JPasswordField(); 
    final JTextField password2 = new JPasswordField(); 

    final JComboBox userBox1 = new JComboBox(); 
    final JComboBox userBox2 = new JComboBox(); 

    JButton create = new JButton("CREATE"); 

    create.addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent e) 
     { 
      try { 
       createUser(conn, username.getText(), password1.getText()); 
userBox1.addItem(username.getText()); 
       userBox2.addItem(username.getText()); 
      } catch (NoSuchAlgorithmException 
        | UnsupportedEncodingException | SQLException e1) { 
       // TODO Auto-generated catch block 
       e1.printStackTrace(); 
      } 
     } 
    }); 



    userBox1.removeAllItems(); 
    userBox2.removeAllItems(); 

    res = (ResultSet) sta.executeQuery("SELECT LOGIN FROM ACCOUNTS"); 

    String temp; 

    for (int i=0; res.next(); i++) { 
     temp = (String)res.getString("LOGIN"); 
     userBox1.addItem(temp); 
     userBox2.addItem(temp); 
    } 

    panel.add(label1); 
    panel.add(label2); 
    panel.add(label3); 

    panel.add(username); 
    panel.add(password1); 
    panel.add(create); 

    panel.add(userBox1); 
    panel.add(password2); 
    panel.add(modify); 

    panel.add(userBox2); 
    panel.add(new JLabel("")); 
    panel.add(delete); 

    add(panel); 

    setVisible(true); 
} 

РЕШЕНИЕ: Добавление password1.setText (""); сразу после того, как «createUser» решил проблему! Это странно, может быть, это как-то освежил GUI ...

+2

Не могли бы вы предоставить код? – Jack

+1

Вы 'refesh'' 'панель или фрейм, для которого' JComboBox' является контейнером. – Subs

+1

Перекраска почти не нужна. Компоненты знают, когда им приходится перекрашивать себя. –

ответ

7
  • вы должны добавить ComboBoxModel к JComboBox,

  • там вы можете add/remove/modify значение,

  • события, реализованные в API, обновляющие ваш вид (JComboBox) без кода кода

  • все обновления должны быть сделаны на Event Dispatch Thread

EDIT

может быть, я missread ваш вопрос, если вы хотите добавить JComboBox к уже видимым GUI, то вы должны вызвать (как последние строки кода и успех только один раз контейнер)

myContainer.revalidate() // for JFrame up to Java7 is there only validate() 
myContainer.repaint() 

(извините @timaschew)

+1

и обновления, которые он может сделать с revalidate() или? – timaschew

+2

@timaschew: в этой ситуации нет необходимости вызывать 'revalidate()'. –

+2

Не нужно ничего проверять. Компоненты перекрашиваются, когда им нужно. –

3
static class TestFrame extends JFrame implements ActionListener 
{ 
    private JComboBox testBox = new JComboBox(); 
    private JButton testButton = new JButton(); 
    int c = 0; 

    public TestFrame() 
    { 
     testBox = new JComboBox(); 
     testButton = new JButton("Click Me!"); 
     testButton.addActionListener(this); 

     JPanel panel = new JPanel(new GridLayout(2,1)); 
     panel.add(testBox); 
     panel.add(testButton); 
     this.add(panel); 
     pack(); 
     setVisible(true); 
    } 

    public void actionPerformed(ActionEvent e) 
    { 
     testBox.addItem("test" + c++); 
    } 
} 

Этот тестовый пример работает, вы уверены, что добавили слушателя к компоненту, который нажал?

+0

Когда кнопка нажата, элемент добавляется в ComboBox. Слушатель принадлежит кнопке. –

-3

Этот код является событием нажатия кнопки, чтобы обновить jframeform в событии нажатия кнопки.

new room().show(); //room() is a jframeform 
new room().setVisible(false); 
0

Насколько мне известно, ComboBox не может не быть обновлен с ".removeAllItems()", ".removeAll()", или ".repaint()".

Если вы хотите обновить его, вам нужно каждый раз создавать новый ComboBox, а затем добавлять к нему элементы. С приведенным выше кодом в качестве примера:

userBox1 = new JComboBox(); // to replace userBox1.removeAllItems(); 
    userBox2 = new JComboBox(); // to replace userBox2.removeAllItems(); 

    res = (ResultSet) sta.executeQuery("SELECT LOGIN FROM ACCOUNTS"); 

    String temp; 

    for (int i=0; res.next(); i++) { 
     temp = (String)res.getString("LOGIN"); 
     userBox1.addItem(temp); 
     userBox2.addItem(temp); 
    } 

У меня были подобные проблемы, но я решил их таким образом.

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