当前位置: 首页 > 面试题库 >

获取选定的JComboBox值并添加到SQL查询中以获取第二个JComboBox

宋朝
2023-03-14
问题内容

我正在设计一个简单的数据库应用程序,在GUI中具有2个jComboBoxes。第一个jComboBox填充有SQL查询的结果。我希望第二个jComboBox填充第二个查询的结果,该查询在第一个框中合并了用户选择的值,但是我无法完全使它起作用。

我创建了2个类,一个类绘制GUI并包含main方法,第二个类查询我的Oracle数据库。

我的GUI类:

public class TestUI extends javax.swing.JFrame {
     // Create new form TestUI
    public TestUI() {
        initComponents();
    }

    @SuppressWarnings("unchecked")

    private void initComponents() {

        jPanel1 = new javax.swing.JPanel();
        jComboBox1 = new javax.swing.JComboBox<>();
        jTextField1 = new javax.swing.JTextField();
        jComboBox2 = new javax.swing.JComboBox<>();
        jButton1 = new javax.swing.JButton();
        jButton2 = new javax.swing.JButton();
        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

        // Combo box 1 population

        jComboBox1.removeAllItems();
        createConnection c1 = new createConnection();
        c1.getEmployee().forEach((employee) -> {
            jComboBox1.addItem(employee);
        });
        jComboBox1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jComboBox1ActionPerformed(evt);
            }
        });

        // ComboBox 2 population

        jComboBox2.removeAllItems();


    }

    private void jComboBox1ActionPerformed(java.awt.event.ActionEvent evt) {                                           
        // TODO add handling code here:
    }

    public static void main(String args[]) {
        DRAW GUI
    }
}

和我的数据库类:

import java.util.List;
import java.util.ArrayList;
import java.sql.*;

public class createConnection {

    String empName;

    public Connection createConnection() {
        try {
            Class.forName(driver);
            java.sql.Connection conn = DriverManager.getConnection(DB_URL, DB_username, DB_password);
            return conn;
        } catch (ClassNotFoundException | SQLException e) {
            return null;
        }
    }

    // ComboBox 1
    public List<String> getEmployee() {
        List<String> list = new ArrayList();
        Connection conn = createConnection();
        try {
            Statement stmt = conn.createStatement();
            String query = "SELECT * FROM hr.employees ORDER BY last_name";
            ResultSet results = stmt.executeQuery(query);
            while (results.next()) {
                list.add(results.getString("last_name"));
            }
        } catch (Exception e) {
            System.out.println("Exception = " + e);
        }
        return list;
    }

    // Combo Box 2
    public List<String> getEmpLocation() {
        List<String> list = new ArrayList();
        Connection conn = createConnection();
        try {
            Statement stmt = conn.createStatement();
            String query = "SELECT country_id FROM hr.location WHERE hr.location.emp_name = " + empName;
            ResultSet results = stmt.executeQuery(query);
            while (results.next()) {
                list.add(results.getString("last_name"));
            }
        } catch (Exception e) {
            System.out.println("Exception = " + e);
        }
        return list;
    }    
}

我遗漏了不相关的代码,例如数据库连接变量和GUI坐标等。

我想知道如何在数据库类中正确获取getEmpLocation()方法来填充第二个ComboBox。这将涉及将代码添加到两个类中并传递变量值,但我无法弄清楚!任何帮助将不胜感激在这里。


问题答案:

我假设您想从第一个JComboBox中选择一个值,然后单击一个按钮来处理所选数据并将新数据加载到第二个JComboBox中。

在这种情况下,您需要JButton而不是JComboBox的ActionListener:

jButton1.addActionListener(new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent e) {
        selectedName = (String) jComboBox1.getSelectedItem();                
    }
});

您还需要将所选值存储在变量中。该getSelectedItem()方法返回一个Object,因此在您的情况下需要将其强制转换为String。

由于我们向按钮添加了ActionListener,因此您不需要此按钮:

jComboBox1.addActionListener(new java.awt.event.ActionListener() {
    public void actionPerformed(java.awt.event.ActionEvent evt) {
        jComboBox1ActionPerformed(evt);
    }
});

在您的 createConnection类中 (通过命名约定,类名应以大写字母开头):

如果不使用try-with-resources语句,则应在catch块之后关闭连接。

    } finally {
        if (conn != null) {
            try {
                conn.close();
            } catch (SQLException ex) {
                ex.printStackTrace();
            }

        }
    }

您需要将selectedName变量传递给getEmpLocation()方法:

public List<String> getEmpLocation(String name) {

您应该使用PreparedStatement而不是Statement:

String query = "SELECT first_name FROM employees WHERE last_name = ?";
PreparedStatement ps = conn.prepareStatement(query);
ps.setString(1, name);            
ResultSet results = ps.executeQuery();

老实说,我不知道您要通过选择查询实现什么。首先,此选择查询将不起作用。表名是LOCATIONS而不是位置,并且它没有称为emp_name的列。

"SELECT country_id FROM hr.location WHERE hr.location.emp_name = ?"

如果您想获取位置,则应使用如下查询:

"SELECT dep.department_name, loc.city, cou.country_name
 FROM employees emp, departments dep, locations loc, countries cou
 WHERE emp.last_name = ?
 AND emp.department_id = dep.department_id 
 AND dep.location_id = loc.location_id
 AND loc.country_id = cou.country_id"

您可以选择要使用部门,城市或国家/地区名称的位置。但是我的主要问题是,如果您首先选择姓氏并将其放在JComboBox中,则很可能只会获得一行数据,因此使用第二个JComboBox毫无意义。让我们从另一侧解决这个问题。如果先选择位置然后再选择员工该怎么办。那可以解决这个问题。

快速示例: 您从数据库中选择所有名字,然后可以选择适当的名字。

从数据库中选择所有名字:

    public List<String> getEmpFirstName() {
        List<String> list = new ArrayList();
        Connection conn = createConnection();

        try {
            Statement stmt = conn.createStatement();
            String query = "SELECT DISTINCT first_name "
                            + "FROM hr.employees "
                            + "ORDER BY first_name";
            ResultSet results = stmt.executeQuery(query);

            while (results.next()) {
                list.add(results.getString("first_name"));
            }
        } catch (Exception e) {
            System.out.println("Exception = " + e);
        } finally {
            if (conn != null) {
                try {
                    conn.close();
                } catch (SQLException ex) {
                    ex.printStackTrace();
                }                    
            }
        }
        return list;
    }

使用PreparedStatement根据名字选择姓氏:

    public List<String> getEmpLastName(String name) {
        List<String> list = new ArrayList();
        Connection conn = createConnection();

        try {
            String query = "SELECT last_name "
                            + "FROM employees "
                            + "WHERE first_name = ?";
            PreparedStatement ps = conn.prepareStatement(query);
            ps.setString(1, name);            
            ResultSet results = ps.executeQuery();

            while (results.next()) {
                list.add(results.getString("last_name"));
            }
        } catch (Exception e) {
            System.out.println("Exception = " + e);
        } finally {
            if (conn != null) {
                try {
                    conn.close();
                } catch (SQLException ex) {
                    ex.printStackTrace();
                }                    
            }
        }
        return list;
    }

更新您的ActionListener:

    jButton1.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                // Store selected value
                selectedName = (String) jComboBox1.getSelectedItem();

                // Create Connection and pass selected value to getEmpLastName
                createConnection c1 = new createConnection();
                names = c1.getEmpLastName(selectedName);

                // Clear your second comboBox and fill with data
                jComboBox2.removeAllItems();                
                for (String lastName : names) {
                    jComboBox2.addItem(lastName);
                }              
            }
        });

尝试选择常用名称,例如Alexander,David,James,John,Julia等。



 类似资料:
  • 我有一个JComboBox,其中的项是查询的结果。我在这里要做的是为每个项目设置一个标签和一个值。问题是,当我想要获取所选项目的值以创建新对象时,我无法。如你所见,我可以使用proveedorCombo获得标签。getSelectedItem()方法,但我不需要它,我需要ID,如何才能让它创建对象“a”?我试图将其放入“for bucle”中,如您所见,我显示了de-label和值,但我无法将该变

  • 我有一个简单的Select语句,它从2个MySQL表返回数据,运行良好。我现在需要从第三个相关表返回一些数据,但不确定如何做到这一点。 这是我当前的SQL查询 现在需要从wp_postmeta表中获取值,其中wp_postmeta表中的_thumbnail_id的值与wp_postmeta表中的post_id值匹配,并且meta_key值=_wp_attached_file。 下面是wp_post

  • 问题内容: 我想从NTEXT列中获取一个xml节点值,该列包含基于在另一个xml节点值上查询的where子句的xml。 RDBMS类型:Microsoft SQL Server T-SQL 这里:我想基于StoreId where子句值获取Code节点值。我如何得到它?输入:100输出:ABCDE 例如: 问题答案: 如果您使用的是SQL Server 2005或2008,则可以使用XQuery,

  • 本文向大家介绍MongoDB中查询数组以获取特定值,包括了MongoDB中查询数组以获取特定值的使用技巧和注意事项,需要的朋友参考一下 要从数组中获取特定值,请使用aggregate()和$project。让我们创建一个包含文档的集合- 在find()方法的帮助下显示集合中的所有文档- 这将产生以下输出- 以下是如何在MongoDB中查询数组- 这将产生以下输出-

  • 我有一个JComboBox选择项目的问题,有人能帮我吗?我已经实现了一个图形用户界面窗口,其中有各种文本字段和一个JComboBox。当我点击按钮,代码必须创建一个对象与字符串的文本字段和字符串的ComboBox,但我有一个在...获取的代码是: 我也试过: 但是不要工作!我不知道我是否需要一个ActionListener,但我认为这不是必需的。

  • 我创建了一个带有JComboBox CellEditor列的JTable。很好。然而,当我试图通过组合框检索所选值时,我只得到鼠标在特定行中选择的值。我似乎无法按每行获取所选值。这是我的代码: