如何刷新JComboBox数据?

Jak*_*nds 3 java swing awt

我在刷新内部数据时遇到问题JComboBox.

有一个按钮" Create" ActionListener,它将项目添加到JComboBox.

但是这些变化并没有反映在GUI中:我仍然没有看到新添加的项目.

repaint() 没有帮助.

更新:这是一个(几乎)完整的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);
}
Run Code Online (Sandbox Code Playgroud)

解决方案:添加password1.setText(""); 刚刚"createUser"解决了问题!这很奇怪,也许它以某种方式刷新了GUI ......

mKo*_*bel 7

  • 你必须添加ComboBoxModelJComboBox,

  • 你可以在add/ remove/ modify值,

  • 在API中实现的事件刷新您的视图(JComboBox)而不需要代码行

  • 必须完成所有更新 Event Dispatch Thread

编辑

也许我想念你的问题,如果你想将JComboBox添加到已经可见的GUI,那么你必须调用(作为最后的代码行,并且只对一个Container成功一次)

myContainer.revalidate() // for JFrame up to Java7 is there only validate()
myContainer.repaint()
Run Code Online (Sandbox Code Playgroud)

(对不起@timaschew)

  • @timaschew:在这种情况下没有必要调用`revalidate()`. (2认同)
  • 无需重新验证任何内容.组件在需要时重新绘制. (2认同)