[英]How do I update the JTable display when I have updated the JTable data?
我創建了一個帶復選框和按鈕的Default JTable。 我試圖能夠在另一個窗口關閉時更新/刷新表,但無法實現此操作(因為該窗口保持靜態)。 JFrame和JTable的構造函數如下:
public MedDetailsTable() {
super("Medication Details"); // Container title
setSize(1000, 350); // Container size
Container contentPane = getContentPane(); // Used to determine layout of components
lbl1.setText("Medication Owner: " + MedicationManager.medsowner);
MedicationManager.meds1.deleteTableArray(); // Remove any previous elements from array
int medsno = MedicationManager.meds1.getMedsNumber(); // Retrieve number of medications in medications array
MedicationManager.meds1.addArrayOutputs(medsno); // Create table output array
int arraysize = MedicationManager.meds1.getTableNumber(); // Table output array size
Object[][] rowData = new Object[medsno][9]; // print array in rectangular form 8 columns wide with rows = meds number
for (r = 0; r < rowData.length; r++) {
rowData[r][0] = MedicationManager.meds1.getTableArray((r * 6)); // Med details are retrieved from TableArray
rowData[r][1] = MedicationManager.meds1.getTableArray((r * 6) + 1); // * by no of columns, plus offset for initial column
rowData[r][2] = MedicationManager.meds1.getTableArray((r * 6) + 2);
rowData[r][3] = MedicationManager.meds1.getTableArray((r * 6) + 3);
rowData[r][4] = MedicationManager.meds1.getTableArray((r * 6) + 4);
rowData[r][5] = MedicationManager.meds1.getTableArray((r * 6) + 5);
rowData[r][6] = MedicationManager.meds1.getCheckbox(r); // Data for checkbox which will initialise as empty = false
final JButton button = new JButton("Meds Info");
button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) { // If button pressed
int selectedRowIndex = MedicationManager.listTable.getSelectedRow(); // Get column 0 row x selected text
String selectedObject = (String) MedicationManager.listTable.getModel().getValueAt(selectedRowIndex, 0);
InternetSearch IS = new InternetSearch(selectedObject); // Internet search with drug name
}
});
rowData[r][7] = button; // Med details button added
}
MedicationManager.listTableModel = new DefaultTableModel(rowData, columnNames) {
@Override
public Class<?> getColumnClass(int columnIndex) // get columnClass overridden so boolean column class is returned to produce Checkbox
{
return columnClass[columnIndex];
}
};
MedicationManager.listTable = new JTable(MedicationManager.listTableModel);
MedicationManager.listTable = new JTable(new JTableModel());
// Assign table model
MedicationManager.listTable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF); // Set up column widths
MedicationManager.listTable.getColumnModel().getColumn(0).setPreferredWidth(180);
MedicationManager.listTable.getColumnModel().getColumn(1).setPreferredWidth(100);
MedicationManager.listTable.getColumnModel().getColumn(2).setPreferredWidth(100);
MedicationManager.listTable.getColumnModel().getColumn(3).setPreferredWidth(150);
MedicationManager.listTable.getColumnModel().getColumn(4).setPreferredWidth(110);
MedicationManager.listTable.getColumnModel().getColumn(5).setPreferredWidth(100);
MedicationManager.listTable.getColumnModel().getColumn(6).setPreferredWidth(50);
MedicationManager.listTable.getColumnModel().getColumn(7).setPreferredWidth(100);
MedicationManager.listTable.getColumnModel().getColumn(8).setPreferredWidth(100);
JScrollPane pane2 = new JScrollPane(MedicationManager.listTable);
pane2.setPreferredSize(new Dimension(930, 200));
setDefaultCloseOperation(DISPOSE_ON_CLOSE); // Disposes on closing window
pane2.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
pnl2.add(lbl1);
Dimension d = new Dimension(70, 30); // Set dimensions for buttons
add.setPreferredSize(d);
chartb.setPreferredSize(d);
edit.setPreferredSize(d);
delete.setPreferredSize(d);
b1.setPreferredSize(d);
pnl.add(add);
pnl.add(edit);
pnl.add(delete);
pnl.add(chartb);
pnl.add(b1);
pnl3.add(pane2);
add(pnl2);
add(pnl);
add(pnl3);
contentPane.add("North", pnl2); // Set text fields at top
contentPane.add("South", pnl); // Set "OK" and "Cancel" at bottom
contentPane.add("Center", pnl3);
add.addActionListener(this);
chartb.addActionListener(this);
edit.addActionListener(this);
delete.addActionListener(this);
b1.addActionListener(this);
MedicationManager.listTable.getModel().addTableModelListener(this);
DefaultTableCellRenderer centerRenderer = new DefaultTableCellRenderer(); // Set data to center of columns
centerRenderer.setHorizontalAlignment(SwingConstants.CENTER);
for (int n = 0; n < 6; n++) { // Renderer does not extend to column 7 so checkbox used instead
MedicationManager.listTable.getColumnModel().getColumn(n).setCellRenderer(centerRenderer);
}
TableCellRenderer buttonRenderer = new JTableButtonRenderer();
MedicationManager.listTable.getColumn("Information").setCellRenderer(buttonRenderer);
MedicationManager.listTable.addMouseListener(new JTableButtonMouseListener(MedicationManager.listTable));
setLocationRelativeTo(null); // Centre window in screen
setVisible(true); // Make JPanel visibleclass ButtonListener implements ActionListener {
}
我一直使用的更新數據的方法如下。 首先刪除行數據,然后將其重新填充到用於填充JTable的數組中。 但是我目前無法刷新數據顯示。 這使用.repaint()
和.fireTableDataChanged()
。 :
public void addData(){
MedicationManager.listTableModel = (DefaultTableModel) MedicationManager.listTable.getModel();
MedicationManager.listTableModel.setRowCount(0);
int medsno = MedicationManager.meds1.getMedsNumber(); // Retrieve number of medications in medications array
MedicationManager.meds1.addArrayOutputs(medsno); // Create table output array
int arraysize = MedicationManager.meds1.getTableNumber(); // Table output array size
Object[][] rowData = new Object[medsno][9]; // print array in rectangular form 8 columns wide with rows = meds number
for (r = 0; r < rowData.length; r++) {
rowData[r][0] = MedicationManager.meds1.getTableArray((r * 6)); // Med details are retrieved from TableArray
rowData[r][1] = MedicationManager.meds1.getTableArray((r * 6) + 1); // * by no of columns, plus offset for initial column
rowData[r][2] = MedicationManager.meds1.getTableArray((r * 6) + 2);
rowData[r][3] = MedicationManager.meds1.getTableArray((r * 6) + 3);
rowData[r][4] = MedicationManager.meds1.getTableArray((r * 6) + 4);
rowData[r][5] = MedicationManager.meds1.getTableArray((r * 6) + 5);
rowData[r][6] = MedicationManager.meds1.getCheckbox(r);
final JButton button = new JButton("Meds Info");
button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) { // If button pressed
int selectedRowIndex = MedicationManager.listTable.getSelectedRow(); // Get column 0 row x selected text
String selectedObject = (String) MedicationManager.listTable.getModel().getValueAt(selectedRowIndex, 0);
InternetSearch IS = new InternetSearch(selectedObject); // Internet search with drug name
}
});
rowData[r][7] = button; // Med details button added
MedicationManager.listTableModel.addRow(rowData);
}
MedicationManager.listTable.setModel(MedicationManager.listTableModel);
MedicationManager.listTableModel.fireTableDataChanged();
this.repaint();
}
MedicationManager.listTableModel.addRow(rowData);
addRow(...)方法用於將單行數據添加到TableModel。 “ rowData”變量是一個二維數組。 您不應該使用2D陣列。
相反,您需要在for循環內創建一個一維數組。 然后將數據添加到數組。 然后,將數組添加到TableModel。
就像是:
DefaultTableModel listTableModel = (DefaultTableModel)MedicationManager.listTable.getModel();
listTableModel.setRowCount(0);
for (every row)
{
Object[] row = new Object[8];
row[0] = ...
row[1] = ...
listTableModel.addRow( row );
}
因此,要刷新現有JTable中的數據,您需要的是對原始表的引用:
當您將行添加到TableModel時,模型將通知表更改,並且表將重新繪制自身。
另外,您不能僅將JButton添加到TableModel。 一個JTable只使用渲染器,到實際的按鈕未顯示在表中。 您需要為按鈕創建自定義渲染器和編輯器。 請查看“ 表格按鈕列”中的解決方案。
由於您使用的是DefaultTableModel,因此我只能給出以下答案:
您應該使用新值重新創建模型並將其設置為JTable。
提示:請勿使用DEFAULTTABLEMODEL。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.