Обновить данные JScrollPane JTable на JPanel в JFrame

Я хочу заполнить свою таблицу новыми данными, которые я получаю с помощью моей базы данных (MySQL). Я получаю все данные и создаю с ними новую модель, но если я хочу обновить конкретную панель, она не будет перерисована.

public class PanelWest extends JPanel implements ActionListener {
private JButton but_selectBP;
private JButton but_selectBPAdr;
private JButton but_selectGerichte;
private GroupLayout layoutGroup;
private Connector stmtExecuter = new Connector();
//  private PanelCenter tableViewer = new PanelCenter();


public PanelWest() {
    layoutGroup = createLayout();
    this.setLayout(layoutGroup);
    createButtons();
}

private GroupLayout createLayout() {
    GroupLayout layout = new GroupLayout(this);
    layout.setAutoCreateGaps(true);
    layout.setAutoCreateContainerGaps(true);
    return layout;
}


void createButtons() {
    this.but_selectBP = new JButton("Kunden anzeigen");
    this.but_selectBP.addActionListener(this);
    this.but_selectBPAdr = new JButton("Gerichte anzeigen");
    this.but_selectBPAdr.addActionListener(this);
    this.but_selectGerichte = new JButton("Lieferanten anzeigen");
    this.but_selectGerichte.addActionListener(this);

    this.layoutGroup.setHorizontalGroup(layoutGroup.createParallelGroup().addComponent(but_selectBP).addComponent(but_selectBPAdr).addComponent(but_selectGerichte));
    this.layoutGroup.setVerticalGroup(layoutGroup.createSequentialGroup().addComponent(but_selectBP).addComponent(but_selectBPAdr).addComponent(but_selectGerichte));
}

@Override
public void actionPerformed(ActionEvent e) {
    Object src = e.getSource();

    if (src.equals(this.but_selectBP)) {
        String query = "SELECT * FROM Kunde";
        ResultSet rst = this.stmtExecuter.getResultDBData(query);
    //    this.tableViewer.setTableName("Kunde");
        new PanelCenter().createTable(fillHeader(rst), fillData(rst));
    }

    if (src.equals(this.but_selectBPAdr)) {
        String query = "SELECT * FROM Gericht";
        ResultSet rst = this.stmtExecuter.getResultDBData(query);
    //    this.tableViewer.createTable(fillHeader(rst), fillData(rst));
    }

    if (src.equals(this.but_selectGerichte)) {
        String query = "SELECT * FROM Lieferant";
        ResultSet rst = this.stmtExecuter.getResultDBData(query);
     //   this.tableViewer.createTable(fillHeader(rst), fillData(rst));
    }
}

private String[] fillHeader(ResultSet rst) {
    try {
        ResultSetMetaData rstMetaData = rst.getMetaData();
        String[] header = new String[rstMetaData.getColumnCount()];
        ArrayList<String> headerDetails = new ArrayList<>();
        for (int i = 1; i <= rstMetaData.getColumnCount(); i++) {
           headerDetails.add(rstMetaData.getColumnName(i));
        }
        int j = 0;
        for(String head : headerDetails){
            header[j] = head;
            j++;
        }
        return header;
    } catch (SQLException se) {
        se.printStackTrace();
    }
    return null;
}

private Object[][] fillData(ResultSet rst) {
    try {
        ResultSetMetaData rstMetaData = rst.getMetaData();
        int rowCount = 0;

        rst.last();
        rowCount = rst.getRow();
        System.out.println(rowCount + " Rows");
        rst.beforeFirst();

        Object[][] data = new Object[rowCount][rstMetaData.getColumnCount()];

        int row = 0;
        while (rst.next()) {
            for (int i = 0; i < rstMetaData.getColumnCount(); i++) {
                data[row][i] = rst.getObject(i + 1);
            }
            row++;
        }
        return data;
    } catch (SQLException se) {
        System.out.println("Hier bei Fill");
    }
    return null;
}
}

Я использую удаление, добавление, повторную проверку и перерисовку на моей jpanel.

 void createTable(String[] header, Object[][] data) {
    this.tableData = new JTable();
    this.tableData.setModel(new MyTableModel(header, data));
    this.tableData.setFillsViewportHeight(true);
    this.tableData.addKeyListener(this);
    this.scrollPaneTable = new JScrollPane(tableData);
    this.scrollPaneTable.setSize(500, 500);
    this.remove(this.scrollPaneTable);
    this.add(this.scrollPaneTable);
    this.revalidate();
    this.repaint();
}

person Reptain    schedule 03.07.2016    source источник


Ответы (2)


Вам не нужно повторно инициализировать таблицу, модель таблицы.

Поместите некоторые глобальные переменные вверху

private MyTableModel tableModel; //Your own table model
private JTable table;

Инициализировать их при инициализации

public PanelWest() {
    layoutGroup = createLayout();
    this.setLayout(layoutGroup);
    createButtons();
    tableModel = new MyTableModel(header, data); //Your own tablemodel
    table = new JTable(tableModel); //Hook the model to your table
    this.add(table)
    //...Do other things else to your table
}

Как только вы захотите обновить таблицу, просто удалите строки из модели таблицы и заполните новыми строками.

И попросите JTable обновить свои данные, позвонив

void createTable(String[] header, Object[][] data){
    int cols = header.length;
    int rows = data.length;

    //Remove all rows from model 
    tableModel.setRowCount(0); //(As said by HovercraftFullOfEels)

    Object[] row = new Object[cols];
    for (int j = 0; j < data.length; j++){
        for (int i = 0; i < cols; i++){
            row[i] = data[j][i];
        }
        tableModel.addRow(row);
    }
    tableModel.fireTableDataChanged();
}

Надеюсь, это поможет.

person mob41    schedule 03.07.2016
comment
Опять же, нет ни поля, ни переменной с именем mod. Если вы хотите очистить DefaultTableModel, просто вызовите setRowCount(0). Если это ваша собственная модель, основанная на AbstractTableModel, вам нужно написать собственный метод для этого, но использование цикла for таким образом может быть опасным. - person Hovercraft Full Of Eels; 03.07.2016
comment
Не вызывайте fireTabledataChange(...). Это задача TableModel, и метод addRow(...) вызовет соответствующий метод. - person camickr; 03.07.2016

Спасибо за вашу помощь. Я добавляю небольшой тест в свой метод createTable. Я создаю новое окно, чтобы показать новые данные таблицы, и это работает. я думаю, что моя панель jpanel неправильно перерисовывается из-за моего группового макета.

        this.tableData = new JTable();
    this.tableData.setModel(new MyTableModel(header, data));
    this.tableData.setFillsViewportHeight(true);
    this.tableData.addKeyListener(this);
    this.scrollPaneTable = new JScrollPane(tableData);
    this.scrollPaneTable.setSize(500, 500);

    this.layoutGroup.setVerticalGroup(layoutGroup.createSequentialGroup().addComponent(this.scrollPaneTable, 400, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE).addComponent(this.scrollPaneChanges).addComponent(this.but_user).addComponent(this.but_dataChange));


      //        JFrame fr = new JFrame("Hello");
      //        fr.setLayout(null);
     //        fr.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    //        fr.setVisible(true);
    //        fr.add(this.scrollPaneTable);
person Reptain    schedule 04.07.2016
comment
пожалуйста, игнорируйте одну строку с layoutgroup - person Reptain; 04.07.2016