【问题标题】:Populate the JTable using JComboBox instead of a JButton使用 JComboBox 而不是 JButton 填充 JTable
【发布时间】:2012-03-02 03:40:20
【问题描述】:

我只是 Java 的初学者,如果你能帮助我,我会很高兴,我这里有一个 JTable,它使用 JButton 填充数据库中的数据。我有 3 个名为 studentsteachersdirectors 的表。 使用 3 个 JButtons(每个表一个)查看 JTable 中的这些字段时一切正常。但是每次我点击另一个JButton时,JTable并没有被清除,而是将数据添加到JTable上的现有信息中。

现在,我要做的是将 3 个 JButton 替换为一个 JComboBox,其中要选择的选项是表名并在 JTable 中显示它们的内容。我真的不知道如何做到这一点。 我希望您能帮助我,并且非常感谢您提供任何意见。

谢谢

以下是我使用的代码。我还添加了一些标题。

import java.sql.*;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.DefaultComboBoxModel;
import javax.swing.table.DefaultTableModel;

public class tests extends javax.swing.JFrame {

/**
 * Creates new form tests
 */
public tests() {
    initComponents();
}

@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">
private void initComponents() {

    jScrollPane1 = new javax.swing.JScrollPane();
    dataTable = new javax.swing.JTable();
    students = new javax.swing.JButton();
    teachers = new javax.swing.JButton();
    directors = new javax.swing.JButton();

    setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

    dataTable.setModel(new javax.swing.table.DefaultTableModel(
        new Object [][] {

        },
        new String [] {
            "ID", "Name", "Surname", "Age"
        }
    ));
    jScrollPane1.setViewportView(dataTable);

    students.setText("Students");
    students.addActionListener(new java.awt.event.ActionListener() {
        public void actionPerformed(java.awt.event.ActionEvent evt) {
            studentsActionPerformed(evt);
        }
    });

    teachers.setText("Teachers");
    teachers.addActionListener(new java.awt.event.ActionListener() {
        public void actionPerformed(java.awt.event.ActionEvent evt) {
            teachersActionPerformed(evt);
        }
    });

    directors.setText("Directors");
    directors.addActionListener(new java.awt.event.ActionListener() {
        public void actionPerformed(java.awt.event.ActionEvent evt) {
            directorsActionPerformed(evt);
        }
    });

    javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
    getContentPane().setLayout(layout);
    layout.setHorizontalGroup(
        layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
        .addGroup(layout.createSequentialGroup()
            .addContainerGap()
            .addComponent(students)
            .addGap(57, 57, 57)
            .addComponent(teachers)
            .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 66, Short.MAX_VALUE)
            .addComponent(directors)
            .addGap(40, 40, 40))
        .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 0, Short.MAX_VALUE)
    );
    layout.setVerticalGroup(
        layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
        .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
            .addContainerGap()
            .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                .addComponent(students)
                .addComponent(teachers)
                .addComponent(directors))
            .addGap(18, 18, 18)
            .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 274, Short.MAX_VALUE))
    );

    pack();
}// </editor-fold>

private void studentsActionPerformed(java.awt.event.ActionEvent evt) {
    DefaultTableModel model = (DefaultTableModel) dataTable.getModel();
    String sql = "select * from students";
    try {
        try {
            Class.forName("com.mysql.jdbc.Driver");
        } catch (ClassNotFoundException ex) {
            Logger.getLogger(tests.class.getName()).log(Level.SEVERE, null, ex);
        }
        Connection connect = (Connection) DriverManager.getConnection("jdbc:mysql://localhost:3306/datavisibility","root","");
        Statement statmnt = connect.createStatement();
        ResultSet rslt = statmnt.executeQuery(sql);
        while(rslt.next()){
            String id = rslt.getString("ID");
            String name = rslt.getString("Name");
            String surname = rslt.getString("Surname");
            String age = rslt.getString("Age");
            model.addRow(new Object[]{id,name,surname,age});
        }
    } catch(SQLException e){
        e.printStackTrace();
    }
}

private void teachersActionPerformed(java.awt.event.ActionEvent evt) {
    DefaultTableModel model = (DefaultTableModel) dataTable.getModel();
    String sql = "select * from teachers";
    try {
        try {
            Class.forName("com.mysql.jdbc.Driver");
        } catch (ClassNotFoundException ex) {
            Logger.getLogger(tests.class.getName()).log(Level.SEVERE, null, ex);
        }
        Connection connect = (Connection) DriverManager.getConnection("jdbc:mysql://localhost:3306/datavisibility","root","");
        Statement statmnt = connect.createStatement();
        ResultSet rslt = statmnt.executeQuery(sql);
        while(rslt.next()){
            String id = rslt.getString("ID");
            String name = rslt.getString("Name");
            String surname = rslt.getString("Surname");
            String age = rslt.getString("Age");
            model.addRow(new Object[]{id,name,surname,age});
        }
    } catch(SQLException e){
        e.printStackTrace();
    }
}

private void directorsActionPerformed(java.awt.event.ActionEvent evt) {
    DefaultTableModel model = (DefaultTableModel) dataTable.getModel();
    String sql = "select * from directors";
    try {
        try {
            Class.forName("com.mysql.jdbc.Driver");
        } catch (ClassNotFoundException ex) {
            Logger.getLogger(tests.class.getName()).log(Level.SEVERE, null, ex);
        }
        Connection connect = (Connection) DriverManager.getConnection("jdbc:mysql://localhost:3306/datavisibility","root","");
        Statement statmnt = connect.createStatement();
        ResultSet rslt = statmnt.executeQuery(sql);
        while(rslt.next()){
            String id = rslt.getString("ID");
            String name = rslt.getString("Name");
            String surname = rslt.getString("Surname");
            String age = rslt.getString("Age");
            model.addRow(new Object[]{id,name,surname,age});
        }
    } catch(SQLException e){
        e.printStackTrace();
    }
}

/**
 * @param args the command line arguments
 */
public static void main(String args[]) {
    /*
     * Set the Nimbus look and feel
     */
    //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
    /*
     * If Nimbus (introduced in Java SE 6) is not available, stay with the
     * default look and feel. For details see
     * http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html
     */
    try {
        for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
            if ("Nimbus".equals(info.getName())) {
                javax.swing.UIManager.setLookAndFeel(info.getClassName());
                break;
            }
        }
    } catch (ClassNotFoundException ex) {
        java.util.logging.Logger.getLogger(tests.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
    } catch (InstantiationException ex) {
        java.util.logging.Logger.getLogger(tests.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
    } catch (IllegalAccessException ex) {
        java.util.logging.Logger.getLogger(tests.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
    } catch (javax.swing.UnsupportedLookAndFeelException ex) {
        java.util.logging.Logger.getLogger(tests.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
    }
    //</editor-fold>

    /*
     * Create and display the form
     */
    java.awt.EventQueue.invokeLater(new Runnable() {

        public void run() {
            new tests().setVisible(true);
        }
    });
}
// Variables declaration - do not modify
private javax.swing.JTable dataTable;
private javax.swing.JButton directors;
private javax.swing.JScrollPane jScrollPane1;
private javax.swing.JButton students;
private javax.swing.JButton teachers;
// End of variables declaration
}

见标题here.

提前致谢。

【问题讨论】:

  • But everytime I clicked to another JButton, the JTable is not cleared but instead adding the data to the existing information on the JTable. -- 这不应该让你感到惊讶,因为程序只会按照你的指示去做。您的按钮的 ActionListener 仅将行添加到表模型中。我相信您可以弄清楚要替换数据,首先您必须删除旧数据或用新数据替换模型,对吗? DefaultTableModel API 有你可以使用的方法。
  • 另外,我看不到你的代码,你试图用 JComboBox 做你想做的事。如果您忘记发布代码,请编辑您的问题并发布,否则我们将不知道您做错了什么。
  • @HovercraftFullOfEels:先生,请指教,我完全迷失了这一点。我刚接触Java,所以请帮助我。谢谢!
  • 我看不出 HFOE 能如何更好地帮助您。不过,您可以通过回答他们的问题并遵循他们的建议来帮助自己。
  • @HovercraftFullOfEels 先生,我已经完成了 ComboBox 部分,它将显示在 JTable 上。我的问题是如何让 JTable 只显示数据库的内容,而不是附加在 JTable 上的现有数据上。谢谢!

标签: java mysql swing


【解决方案1】:

只需添加 JComboBox 而不是像这样的 JButtons,

String[] items = {"students", "teachers", "directors"};
JComboBox cb = new JComboBox(items);
cb.setEditable(true);

像这样将监听器类添加到组合框,

ActionListener actionListener = new ActionListener() {
  public void actionPerformed(ActionEvent actionEvent) {
    //System.out.println("Selected: " + cb.getSelectedItem());
     if(cb.getSelectedItem() == "student"){

       //Perform the action for student

     } 

      //Repeat this for all items

  }
};
cb.addActionListener(actionListener);

这将满足您的期望......

【讨论】:

  • private void comBoxActionPerformed(java.awt.event.ActionEvent evt) { DefaultTableModel model = (DefaultTableModel) dataTable.getModel(); String sql = "SELECT * FROM students"; Connection connect = (Connection) DriverManager.getConnection("jdbc:mysql://localhost:3306/datavisibility","root",""); Statement statmnt = connect.createStatement(); ResultSet rslt = statmnt.executeQuery(sql); --> 我仍然无法使用 JComboBox 从我的数据库中检索数据,您认为我的代码有什么问题?谢谢!
  • 您是否测试过 actionListener 是否适用于您的组合框更改事件?
  • 是的,我已经这样做了。其实,不是很确定。你认为缺少什么? ` private void comBoxActionPerformed(java.awt.event.ActionEvent evt) { if (comBox.getSelectedItem() == "Students"){ JComboBox comBox = (JComboBox)evt.getSource();字符串选择 = (String)comBox.getSelectedItem(); }` 非常感谢
  • 我认为你有点困惑,只需添加 if (comBox.getSelectedItem() == "students") { //add action code what you have done for student button } 这样,否则如果(comBox.getSelectedItem() == "teachers"){ // 添加动作代码尊重教师按钮}
  • 工作!!! 非常感谢 Vinesh 先生。最后我得到了它!我知道这很简单,但对于像我这样的初学者来说意义重大。但是每次我选择另一个数据库时,它只会添加到现有表中。我应该怎么做才能让它只显示自己的数据库?非常感谢!
【解决方案2】:

您需要做的就是为您的 JCombobox 添加一个 ActionListener。在actionListener中,根据getSelectedItem()返回的值改变表中的数据。

如果您需要更多帮助,请尝试编写并发布您的代码

【讨论】:

  • 我真的不明白你所说的“添加”ActionListener 是什么意思,因为我刚接触它。也许如果你能提供一个样本我可以理解它。非常感谢。
  • 我所说的“添加”是 Vinesh 在他的帖子中所说的。
  • 是的,谢谢先生。我已经解决了关于JComboBox的问题,我现在的问题是当我从JComboBox中选择时如何只显示某个数据库的数据并且不附加到JTable上的现有数据上。如果您感到困惑,请参阅标题here。非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-03
  • 2014-01-24
  • 1970-01-01
  • 1970-01-01
  • 2010-11-20
相关资源
最近更新 更多