Java 在JFrame中刷新JPanel上的JScrollPane JTable数据
我想用我的数据库(MySQL)得到的新数据填充我的表。我获取所有数据并用它们创建一个新模型,但是如果我想刷新特定的面板,那么它就不会被重新绘制Java 在JFrame中刷新JPanel上的JScrollPane JTable数据,java,swing,jtable,jpanel,abstracttablemodel,Java,Swing,Jtable,Jpanel,Abstracttablemodel,我想用我的数据库(MySQL)得到的新数据填充我的表。我获取所有数据并用它们创建一个新模型,但是如果我想刷新特定的面板,那么它就不会被重新绘制 public class PanelWest extends JPanel implements ActionListener { private JButton but_selectBP; private JButton but_selectBPAdr; private JButton but_selectGerichte; private Group
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;
}
}
您不需要重新初始化表、表模型 在顶部放置一些全局变量
private MyTableModel tableModel; //Your own table model
private JTable table;
在init上初始化它们
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();
}
void createTable(字符串[]头,对象[]数据){
int cols=标题长度;
int rows=data.length;
//从模型中删除所有行
tableModel.setRowCount(0);/(如HovercraftFullOfEels所说)
Object[]行=新对象[cols];
对于(int j=0;j
希望能有所帮助。您不需要重新初始化表格,表格模型 在顶部放置一些全局变量
private MyTableModel tableModel; //Your own table model
private JTable table;
在init上初始化它们
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();
}
void createTable(字符串[]头,对象[]数据){
int cols=标题长度;
int rows=data.length;
//从模型中删除所有行
tableModel.setRowCount(0);/(如HovercraftFullOfEels所说)
Object[]行=新对象[cols];
对于(int j=0;j
希望能有所帮助。谢谢你的帮助。
我在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);
谢谢你的帮助。
我在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);
同样,没有名为
mod
的字段或变量。如果要清除DefaultTableModel,只需调用setRowCount(0)
。如果它是基于AbstractTableModel的您自己的模型,那么您将希望编写自己的方法来完成此操作,但是以这种方式使用for循环可能会很危险。不要调用fireTabledataChange(…)
。这是TableModel的工作,addRow(…)方法将调用相应的方法。同样,没有名为mod
的字段或变量。如果要清除DefaultTableModel,只需调用setRowCount(0)
。如果它是基于AbstractTableModel的您自己的模型,那么您将希望编写自己的方法来完成此操作,但是以这种方式使用for循环可能会很危险。不要调用fireTabledataChange(…)
。这是TableModel的工作,addRow(…)方法将调用相应的方法。请忽略带有layoutgroup的一行请忽略带有layoutgroup的一行