Очистить JTable с извлечением данных из базы данных с использованием JComboBox - PullRequest
1 голос
/ 02 марта 2012

только начинаю свои руки на Java и очень нуждается в вашей помощи. У меня есть JComboBox, который извлекает данные из базы данных и отображает их в JTable. Моя проблема в том, что когда я выбираю Студенты , он отображает данные о Студентах, а при выборе другого варианта, например Учитель , он также отображает данные об Учителе, но он добавляется данные отображаются студентами. Интересно, как я могу отобразить данные Только для студентов и то же самое с другими.

Ниже приведен код, который я использовал. Может быть, я что-то упустил.

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


public class VisibilityTool extends javax.swing.JFrame {

public VisibilityTool() {
    initComponents();
}


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

    eMail = new javax.swing.JLabel();
    comBox = new javax.swing.JComboBox();
    emailText = new javax.swing.JTextField();
    buttonGenerate = new javax.swing.JButton();
    progressBar = new javax.swing.JProgressBar();
    selectEnvironment = new javax.swing.JLabel();
    jScrollPane1 = new javax.swing.JScrollPane();
    dataTable = new javax.swing.JTable();
    jMenuBar1 = new javax.swing.JMenuBar();
    file = new javax.swing.JMenu();
    exit = new javax.swing.JMenuItem();
    help = new javax.swing.JMenu();
    about = new javax.swing.JMenuItem();

    setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
    setTitle("[Trax] Data Visibility Tool");
    setCursor(new java.awt.Cursor(java.awt.Cursor.DEFAULT_CURSOR));
    setFocusCycleRoot(false);
    setForeground(java.awt.Color.black);

    eMail.setBackground(new java.awt.Color(51, 51, 51));
    eMail.setFont(new java.awt.Font("Lucida Bright", 1, 12)); // NOI18N
    eMail.setText("E - mail address :");

    comBox.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "Select . . .", "Students", "Teachers", "Directors" }));
    comBox.setToolTipText("'Choose the database to query'");
    comBox.addActionListener(new java.awt.event.ActionListener() {
        public void actionPerformed(java.awt.event.ActionEvent evt) {
            comBoxActionPerformed(evt);
        }
    });

    emailText.setToolTipText("'Put you e-mail address here'");
    emailText.addActionListener(new java.awt.event.ActionListener() {
        public void actionPerformed(java.awt.event.ActionEvent evt) {
            emailTextActionPerformed(evt);
        }
    });

    buttonGenerate.setText("GENERATE");
    buttonGenerate.setToolTipText("'GENERATE'");
    buttonGenerate.addActionListener(new java.awt.event.ActionListener() {
        public void actionPerformed(java.awt.event.ActionEvent evt) {
            buttonGenerateActionPerformed(evt);
        }
    });

    selectEnvironment.setBackground(new java.awt.Color(51, 51, 51));
    selectEnvironment.setFont(new java.awt.Font("Lucida Bright", 1, 12)); // NOI18N
    selectEnvironment.setText("Select Environment :");

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

        },
        new String [] {
            "ID", "Name", "Surname", "Age"
        }
    ) {
        boolean[] canEdit = new boolean [] {
            false, false, false, false
        };

        public boolean isCellEditable(int rowIndex, int columnIndex) {
            return canEdit [columnIndex];
        }
    });
    dataTable.getTableHeader().setReorderingAllowed(false);
    jScrollPane1.setViewportView(dataTable);
    dataTable.getColumnModel().getColumn(0).setResizable(false);
    dataTable.getColumnModel().getColumn(1).setResizable(false);
    dataTable.getColumnModel().getColumn(2).setResizable(false);
    dataTable.getColumnModel().getColumn(3).setResizable(false);

    file.setText("File");
    file.addActionListener(new java.awt.event.ActionListener() {
        public void actionPerformed(java.awt.event.ActionEvent evt) {
            fileActionPerformed(evt);
        }
    });

    exit.setText("Exit");
    exit.addActionListener(new java.awt.event.ActionListener() {
        public void actionPerformed(java.awt.event.ActionEvent evt) {
            exitActionPerformed(evt);
        }
    });
    file.add(exit);

    jMenuBar1.add(file);

    help.setText("Help");
    help.addActionListener(new java.awt.event.ActionListener() {
        public void actionPerformed(java.awt.event.ActionEvent evt) {
            helpActionPerformed(evt);
        }
    });

    about.setText("About");
    about.addActionListener(new java.awt.event.ActionListener() {
        public void actionPerformed(java.awt.event.ActionEvent evt) {
            aboutActionPerformed(evt);
        }
    });
    help.add(about);

    jMenuBar1.add(help);

    setJMenuBar(jMenuBar1);

    javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
    getContentPane().setLayout(layout);
    layout.setHorizontalGroup(
        layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
        .addGroup(layout.createSequentialGroup()
            .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 483, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                        .addComponent(buttonGenerate)
                        .addGroup(layout.createSequentialGroup()
                            .addContainerGap()
                            .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                .addComponent(progressBar, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addGroup(layout.createSequentialGroup()
                                    .addComponent(eMail, javax.swing.GroupLayout.PREFERRED_SIZE, 111, javax.swing.GroupLayout.PREFERRED_SIZE)
                                    .addGap(43, 43, 43)
                                    .addComponent(emailText, javax.swing.GroupLayout.PREFERRED_SIZE, 325, javax.swing.GroupLayout.PREFERRED_SIZE)))))
                    .addGroup(layout.createSequentialGroup()
                        .addContainerGap()
                        .addComponent(selectEnvironment, javax.swing.GroupLayout.PREFERRED_SIZE, 140, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addGap(18, 18, 18)
                        .addComponent(comBox, javax.swing.GroupLayout.PREFERRED_SIZE, 325, javax.swing.GroupLayout.PREFERRED_SIZE))))
            .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
    );
    layout.setVerticalGroup(
        layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
        .addGroup(layout.createSequentialGroup()
            .addContainerGap()
            .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                .addComponent(selectEnvironment, javax.swing.GroupLayout.PREFERRED_SIZE, 26, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addComponent(comBox, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
            .addGap(27, 27, 27)
            .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
            .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
            .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                .addComponent(eMail, javax.swing.GroupLayout.PREFERRED_SIZE, 26, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addComponent(emailText, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
            .addGap(30, 30, 30)
            .addComponent(buttonGenerate)
            .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
            .addComponent(progressBar, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
            .addContainerGap(19, Short.MAX_VALUE))
    );

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

private void comBoxActionPerformed(java.awt.event.ActionEvent evt) {                                         
    if (comBox.getSelectedItem() == "Select . . .") {


    } else if (comBox.getSelectedItem() == "Students") {
    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();
    }
    } else if (comBox.getSelectedItem() == "Teachers"){
    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();
    }
    } else if (comBox.getSelectedItem() == "Directors") {
    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();
    }
    }
}        

Большое спасибо за вашу помощь.

Ответы [ 3 ]

3 голосов
/ 02 марта 2012

Перед добавлением удалите все старые значения (строки?) Из модели.Используйте public void removeRow(int row) метод модели.

3 голосов
/ 02 марта 2012

1) определить TableModel только один раз (имеется в виду строки кода)

DefaultTableModel model = (DefaultTableModel) dataTable.getModel();

2) убрать всю строку из TableModel путем обращения

if (model.getRowCount() > 0) {
    for (int i = model.getRowCount() - 1; i > 0; i--) {
        model.removeRow(i);
    }
}

3) затем добавьте новые строки из ResultSet

4) этот код имеет проблему с Concurency в Swing , и весь GUI не отвечает до ResultSet закончилась, на Exceptions только с ResultSet Mouse hover_over JTable's строки обновляют GUI Лучше было бы вызвать ResultSet из SwingWorker или Runnable#Thread

5) пожалуйста, напишите код своими руками, потому что для 90% потенциальных ответчиков (включая меня) невозможно запустить сгенерированный код из некоторой IDE и без определения локальных переменных

0 голосов
/ 02 марта 2012

За день до того, как я написал TableModel, вот оно:

public class MovieSearchResultTableModel extends AbstractTableModel {

    private static final long serialVersionUID = 46L;

    private List<MovieSearchModel> movieSearchModels;
    private ComponentConstant.ColumnName[] columns = ComponentConstant.Column.MOVIE_SEARCH_RESULT_TABLE;

    public int getRowCount() {
        return movieSearchModels.size();
    }

    public int getColumnCount() {
        return columns.length;
    }

    @Override
    public String getColumnName(int columnIndex) {
        return columns[columnIndex].getName();
    }

    @Override
    public Class<?> getColumnClass(int columnIndex) {
        return columns[columnIndex].getClass();
    }

    public Object getValueAt(int rowIndex, int columnIndex) {
        Object returnValue = new Object();
        switch(columnIndex) {
            case 0: 
                returnValue = movieSearchModels.get(rowIndex).getName();
                break;
            case 1: 
                returnValue = movieSearchModels.get(rowIndex).getReleased();
                break;
            case 2: 
                returnValue = movieSearchModels.get(rowIndex).getLanguage();
                break;
            case 3: 
                returnValue = movieSearchModels.get(rowIndex).getRating();
                break;
            case 4: 
                returnValue = movieSearchModels.get(rowIndex).getCertification();
                break;
            case 5: 
                returnValue = movieSearchModels.get(rowIndex).getImdb_id();
                break;
        }       
        return returnValue;
    }

    public List<MovieSearchModel> getMovieSearchModels() {
        return movieSearchModels;
    }

    public void setMovieSearchModels(List<MovieSearchModel> movieSearchModels) {
        this.movieSearchModels = movieSearchModels;
    }
}

Это сложно. Но основная логика в том, что у него есть список объектов movieSearchModels. Его тип MovieSearchModel и метод getValueAt() заполняют таблицу. Когда мне нужно изменить TableModel, я извлекаю модель из таблицы и устанавливаю новое значение movieSearchModels, а затем запускаю fireTableDataChanged с помощью TableModel. Как:

List<MovieSearchModel> movieSearchModels = ModelUtils.getMovieSearchModels(movieSearchResults);
MovieSearchResultTableModel movieSearchResultTableModel = (MovieSearchResultTableModel) ModelFactory.getMovieSearchResultTableModel();
movieSearchResultTableModel.setMovieSearchModels(movieSearchModels);
movieSearchResultTableModel.fireTableDataChanged();

Если у вас есть какие-либо сомнения, вы можете спросить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...