有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java使用在Jcombobox中选择的值填充JTable

我有一个JCombobox和JTable enter image description here


和数据库
enter image description here

jcombobox由数据库中学生表的first_name值填充。 每当我从数据库中选择一个名称时,我都希望在Jtable中显示来自课程的课程名称和来自数据库分数表的学生_分数的值。 基本上,我想在Jtable中显示JComboBox中选中的记录

import java.awt.BorderLayout;
import java.awt.EventQueue;    
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder; 
import net.proteanit.sql.DbUtils;  
import javax.swing.JLabel;
import java.awt.Font;
import javax.swing.JTable;
import javax.swing.JScrollPane;
import javax.swing.*;
import java.sql.*;
import javax.swing.event.PopupMenuListener;
import javax.swing.event.PopupMenuEvent;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;

public class ShowScore extends JFrame {

    private JPanel contentPane;
    private JTable table;
    private JComboBox comboBox;

    /**
     * Launch the application.
     */
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    ShowScore frame = new ShowScore();
                    frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }
    Connection con=null;
    Score s=new Score();

    public ShowScore() {
        con=MyConnection.getConnection();
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(100, 100, 1238, 761);
        contentPane = new JPanel();
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        setContentPane(contentPane);
        contentPane.setLayout(null);

        JLabel lblScoreSheet = new JLabel("Score Sheet");
        lblScoreSheet.setFont(new Font("Times New Roman", Font.BOLD, 28));
        lblScoreSheet.setBounds(500, 33, 155, 50);
        contentPane.add(lblScoreSheet);

        JPanel panel = new JPanel();
        panel.setBounds(24, 259, 720, 426);
        contentPane.add(panel);
        panel.setLayout(null);

        JScrollPane scrollPane = new JScrollPane();
        scrollPane.setBounds(12, 13, 675, 452);
        panel.add(scrollPane);

        comboBox = new JComboBox();
        comboBox.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {
                table = new JTable();
                scrollPane.setViewportView(table);
                try {
                    String n=(String)comboBox.getSelectedItem();
                    String sql="SELECT score.student_id, student.first_name, student.last_name,course.subject, score.student_score FROM ((score INNER JOIN student ON score.student_id=student.id)\r\n" + 
                            "                   INNER JOIN course ON score.course_id=course.cid WHERE student.first_name=n)";
                    PreparedStatement ps=con.prepareStatement(sql);
                    ResultSet rs=ps.executeQuery();
                    table.setModel(DbUtils.resultSetToTableModel(rs));

                    JLabel lblName = new JLabel("Name:");
                    lblName.setFont(new Font("Times New Roman", Font.PLAIN, 18));
                    lblName.setBounds(102, 107, 56, 16);
                    contentPane.add(lblName);

                } catch (Exception e1) {
                    e1.printStackTrace();
                }               
            }
        });
        s.fillScoreCombo(comboBox); 
        comboBox.setBounds(171, 105, 260, 27);
        contentPane.add(comboBox);

        table = new JTable();
        scrollPane.setViewportView(table);
        try {
            String n=(String)comboBox.getSelectedItem();
            String sql="SELECT score.student_id, student.first_name, student.last_name,course.subject, score.student_score FROM ((score INNER JOIN student ON score.student_id=student.id)\r\n" + 
                    "                   INNER JOIN course ON score.course_id=course.cid)";
            PreparedStatement ps=con.prepareStatement(sql);
            ResultSet rs=ps.executeQuery();
            table.setModel(DbUtils.resultSetToTableModel(rs));

            JLabel lblName = new JLabel("Name:");
            lblName.setFont(new Font("Times New Roman", Font.PLAIN, 18));
            lblName.setBounds(102, 107, 56, 16);
            contentPane.add(lblName);

        } catch (Exception e1) {
            e1.printStackTrace();
        }       
    }
}

共 (1) 个答案

  1. # 1 楼答案

    String n=(String)comboBox.getSelectedItem();
    String sql="SELECT .... WHERE student.first_name=n)";
    

    该代码对变量“n”没有任何作用。不能只将“n”作为字符串的一部分,因为所有的字符串都是字符“n”,而不是变量的值

    在上一个问题(Populate JTable with the value in JCombobox)中,您获得了一个关于使用PreparedStatement的教程链接

    那么你在哪里使用“?”这表示要为SQL语句提供动态值

    您的基本代码应该是:

    String sql="SELECT ..... where student.first_name = ?)";
    PreparedStatement ps = con.prepareStatement(sql);
    ps.setString(1, n);
    ResultSet rs = ps.executeQuery();
    

    现在,变量“n”的值将替换“?”在SQL字符串中

    假设SQL的其余部分是正确的,那么它应该可以工作