【问题标题】:How to refresh the JComboBox data?如何刷新 JComboBox 数据?
【发布时间】:2012-06-05 20:44:02
【问题描述】:

我无法刷新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);
}

解决方案: 添加密码1.setText("");就在“createUser”解决问题之后!这很奇怪,也许它以某种方式刷新了 GUI...

【问题讨论】:

  • 您是 refesh panel 还是 JComboBox 是容器的框架。
  • 几乎不需要重绘。组件知道何时必须重新绘制自己。
  • 添加声明、初始化和添加组合到框架的代码。我的猜测是您将项目添加到与显示的组合不同的组合中。
  • 1) 一般只需将其添加到model即可。 2) 为了尽快获得更好的帮助,请发帖SSCCE
  • 如果这是您的实际代码,那么它有两个问题: 1. 它使用了事件调度线程之外的组件。 2. 由于 userBox 是 GUI 方法的本地,我不知道侦听器如何引用它。所以我仍然猜测您正在修改与显示的组合不同的组合。发布真实代码,甚至更好:SSCCE。

标签: java swing awt


【解决方案1】:
  • 您必须将ComboBoxModel 添加到JComboBox

  • 那里可以add/remove/modify的值,

  • 在 API 中实现的事件刷新您的视图 (JComboBox),无需额外的代码行

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

编辑

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

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

(对不起@timaschew)

【讨论】:

  • @timaschew:在这种情况下没有必要打电话给revalidate()
  • 无需重新验证任何内容。组件在需要时自行重绘。
  • @timaschew revalidate???,不要为复合 JComponent better would be to test for why reasons is there validate & revalidate 调用它,这是关于 LayoutManager 并在已经可见的容器中添加/删除/修改 JComponent
【解决方案2】:
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++);
    }
}

这个测试用例有效,你确定你在被点击的组件中添加了监听器吗?

【讨论】:

  • 当按钮被点击时,项目被添加到 ComboBox。监听器属于按钮。
【解决方案3】:

据我所知,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);
    }

我也有类似的问题,但我是这样解决的。

【讨论】:

    【解决方案4】:

    这段代码是按钮点击事件中刷新jframeform的按钮点击事件。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-10
      • 1970-01-01
      • 1970-01-01
      • 2014-12-13
      • 1970-01-01
      相关资源
      最近更新 更多