【问题标题】:Refresh JScrollPane JTable Data on JPanel in JFrame刷新 JFrame 中 JPanel 上的 JScrollPane JTable 数据
【发布时间】:2016-07-03 15:05:05
【问题描述】:

我想用我的数据库(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();
}

【问题讨论】:

    标签: java swing jtable jpanel abstracttablemodel


    【解决方案1】:

    你不需要重新初始化表,表模型。

    把一些全局变量放在最上面

    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();
    }
    

    希望它会有所帮助。

    【讨论】:

    • 同样,没有名为 mod 的字段或变量。如果要清除 DefaultTableModel,只需调用 setRowCount(0)。如果它是您自己的基于 AbstractTableModel 的模型,那么您将需要编写自己的方法来执行此操作,但是以这种方式使用 for 循环可能很危险。
    • 不要调用fireTabledataChange(...)。这样做是 TableModel 的工作,addRow(...) 方法将调用适当的方法。
    【解决方案2】:

    感谢您的帮助。 我在我的 createTable 方法中添加了一个小测试。我创建了一个新窗口来显示新的表数据并且它可以工作。我认为我的 jpanel 没有正确重绘导致我的 grouplayout。

            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);
    

    【讨论】:

    • 请忽略带有layoutgroup的那一行
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-12
    相关资源
    最近更新 更多