java - 更新 JComboBox

标签 java swing jdbc jcombobox

我有一个 JComboBox,它自动设置一个方法,在启动时从我的数据库中获取所有 Id,我还有一个删除功能,它将从数据库中删除选定的对象,但不会删除 id从列表中。有什么办法可以在执行删除方法时更新 JComboBox 吗?我的代码如下,如果有帮助的话。

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

import java.sql.*;

import java.util.ArrayList;

public class EditMember extends JFrame {

    String[] positions = {"", "Trainee", "Writer", "Moderator", "Administrator"};

    JComboBox _id = new JComboBox(getId());
    JComboBox _position = new JComboBox(positions);

    JTextField _name = new JTextField(10);
    JTextField _username = new JTextField(10);
    JPasswordField _password = new JPasswordField(10);

    JButton edit = new JButton("Edit Member");
    JButton delete = new JButton("Delete Member");
    JButton generate = new JButton("Generate Report");
    JButton exit = new JButton("Exit");
    JButton load = new JButton("Load in");

    Toolkit kit = Toolkit.getDefaultToolkit();
    Dimension screenSize = kit.getScreenSize();
    int screenHeight = (int)screenSize.getHeight();
    int screenWidth = (int)screenSize.getWidth();

    public EditMember() {
        super("Edit Member");
        setLayout(new GridLayout(7,1,1,1));

        add(_id);
        add(load);
        load.addActionListener(new LoadInListener());

        add(new JLabel("Name:"));
        add(_name);

        add(new JLabel("Username:"));
        add(_username);

        add(new JLabel("Password:"));
        add(_password);

        add(new JLabel("Position:"));
        add(_position);

        add(edit);
        add(delete);
        delete.addActionListener(new DeleteListener());
        add(generate);
        add(exit);
        exit.addActionListener(new ExitListener());

        setSize(406, 200);
        setResizable(false);
        setLocation(screenWidth/4, screenHeight/4);
        setDefaultCloseOperation(DISPOSE_ON_CLOSE);
        setVisible(true);
    }

    public static void main(String[] args) {
        new EditMember();
    }

    public Object[] getId() {
        Connection con;
        Statement stmt;
        ResultSet rs;

        //Object[] returnId;
        ArrayList<Object> returnId = new ArrayList<Object>();
        try {
            Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
            con = DriverManager.getConnection("jdbc:odbc:collegesys","root","0blivi0n");

            stmt =con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_READ_ONLY);
            rs = stmt.executeQuery("SELECT `id` FROM main");

            while(rs.next()) {
                returnId.add(rs.getObject("id"));
            }

            con.close();
        } catch(Exception e) {
            e.printStackTrace();
        }
        return returnId.toArray(new Object[returnId.size()]);
    }

    public class ExitListener implements ActionListener {
        public void actionPerformed(ActionEvent e) {
            dispose();
        }
    }

    public class LoadInListener implements ActionListener {
        public void actionPerformed(ActionEvent e) {
            String giveId = _id.getSelectedItem().toString();

            populate(giveId);
        }
    }

    public class DeleteListener implements ActionListener {
        public void actionPerformed(ActionEvent e) {
            delete();
        }
    }

    public void delete() {
        Connection con;
        Statement stmt;
        ResultSet rs;
        int idA;
        String name, username, password, position;

        try {
            Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
            con = DriverManager.getConnection("jdbc:odbc:collegesys","root","0blivi0n");

            stmt = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_READ_ONLY);
            PreparedStatement pstmt = con.prepareStatement("DELETE FROM `main` WHERE ID = ?");
            pstmt.setInt(1, (int)_id.getSelectedItem());
            pstmt.execute();
            // udpate JComboBox here
        } catch(Exception e) {
            e.printStackTrace();
        }
    }

    public void populate(String a) {
        Connection con;
        Statement stmt;
        ResultSet rs;
        int idA;
        String name, username, password, position;

        try {
            Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
            con = DriverManager.getConnection("jdbc:odbc:collegesys","root","0blivi0n");

            stmt = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_READ_ONLY);
            rs = stmt.executeQuery("SELECT * FROM main");

            while(rs.next()) {
                idA = rs.getInt("id");
                name = rs.getString("name");
                username = rs.getString("username");
                password = rs.getString("password");
                position = rs.getString("position");
                if(Integer.parseInt(a) == idA) {
                    _name.setText(name);
                    _username.setText(username);
                    _password.setText(password);
                    _position.setSelectedItem(position);
                }
            }
        } catch(Exception e) {
            e.printStackTrace();
        }
    }
}

最佳答案

如上所述here你可以这样做:

public void delete()
{
    ...
    SwingUtils.invokeLater(new Runnable()
    {
        @Override
        public void run()
        {
            DefaultComboBoxModel model = new DefaultComboBoxModel( yourStringArray );
            comboBox.setModel( model );
        }
    });
}

yourStringArray 是您想要在 JComboBox 中呈现的任何内容。我有一段时间没有使用 Swing,但通常您需要进行的任何 GUI 更改都需要您执行 SwingUtils.invokeLater(Runnable)。这将使您的更改通过事件调度程序线程 (EDT) 进行操作,该线程是负责 GUI 的线程。大多数在线示例都没有这样做,原因是它们中的大多数似乎在事件监听器中进行更改,而事件监听器本身在 EDT 中运行。

关于java - 更新 JComboBox,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10715024/

相关文章:

java - Jetty session 集群 ClassNotFoundException

java - 更新查询不起作用 oracle 和 jsp

java - 更改 JAXB 编码器生成的 XML header

java - Python 生成的 XML 中的错误

java - 您将要为 Java 应用程序中的按钮加载的图像放在哪里?

java - 动态更新jTable

java - 如何在 Java 中正确建模战舰游戏

java - 用于 Java 的 SQL 服务器 stub

java - 在 Java 代码中调用 @Canonical Groovy POGO 构造函数

java - 在 java8 中使用 Stream groupingby 按字符串集合分组