[英]How do you empty JTable?
I'm trying to dynamically add rows to the JTable, but having hard time with the ArrayIndexOutOfBounds exception. 我正在尝试向JTable动态添加行,但是ArrayIndexOutOfBounds异常很难。 I'm confused because there is no specific explanation why the problem exists and where the problem occures.
我很困惑,因为没有具体解释为什么存在问题以及在何处发生问题。 See below for the code.
参见下面的代码。
ArrayList<ArrayList<String>> matrix = new ArrayList<ArrayList<String>>();
Object[][] data;
Random rand = new Random();
******************** WHEN PRESSING A BUTTON *****************************
matrix.add(new ArrayList<String>());
((ArrayList<String>)matrix.get(0)).add("row 0 col " + rand.nextInt(100) );
((ArrayList<String>)matrix.get(0)).add("row 0 col 1");
((ArrayList<String>)matrix.get(0)).add("row 0 col 2");
matrix.add(new ArrayList<String>());
((ArrayList<String>)matrix.get(1)).add("row 1 col 0");
((ArrayList<String>)matrix.get(1)).add("row 1 col 1");
((ArrayList<String>)matrix.get(1)).add("row 1 col 2");
data = new Object[matrix.size()][];
for(int i = 0; i < matrix.size(); i++){
data[i] = matrix.get(i).toArray();
}
table = new JTable(data, new String[]{"A", "B", "C"});
table.setFillsViewportHeight(true);
table.setForeground(Color.WHITE);
table.setBackground(Color.BLACK);
table.setBounds(0, 0, 423, 91);
pnlTable.add(table);
pnlTable.setLayout(null);
table.updateUI();
System.out.println("done");
The problem only occures after pressing 2 or more times on the button. 仅在按钮上按下2次或更多次后,才会出现此问题。 Can anyone help me how to dynamically empty table and add new data in it?
谁能帮助我如何动态清空表并在其中添加新数据?
Edit: Here is the Error Log: 编辑:这是错误日志:
Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: 0
at javax.swing.JTable$1.getValueAt(Unknown Source)
at javax.swing.JTable.getValueAt(Unknown Source)
at javax.swing.JTable.prepareRenderer(Unknown Source)
at javax.swing.plaf.basic.BasicTableUI.paintCell(Unknown Source)
at javax.swing.plaf.basic.BasicTableUI.paintCells(Unknown Source)
at javax.swing.plaf.basic.BasicTableUI.paint(Unknown Source)
at javax.swing.plaf.ComponentUI.update(Unknown Source)
at javax.swing.JComponent.paintComponent(Unknown Source)
at javax.swing.JComponent.paint(Unknown Source)
at javax.swing.JComponent.paintToOffscreen(Unknown Source)
at javax.swing.RepaintManager$PaintManager.paintDoubleBuffered(Unknown Source)
at javax.swing.RepaintManager$PaintManager.paint(Unknown Source)
at javax.swing.RepaintManager.paint(Unknown Source)
at javax.swing.JComponent._paintImmediately(Unknown Source)
at javax.swing.JComponent.paintImmediately(Unknown Source)
at javax.swing.RepaintManager.paintDirtyRegions(Unknown Source)
at javax.swing.RepaintManager.paintDirtyRegions(Unknown Source)
at javax.swing.RepaintManager.prePaintDirtyRegions(Unknown Source)
at javax.swing.RepaintManager.access$700(Unknown Source)
at javax.swing.RepaintManager$ProcessingRunnable.run(Unknown Source)
at java.awt.event.InvocationEvent.dispatch(Unknown Source)
at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
at java.awt.EventQueue.access$000(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)
To change a JTable's content, don't re-creating the JTable. 要更改JTable的内容,请不要重新创建JTable。 Simply create a new TableModel for it such as a DefaultTableModel object or an AbstractTableModel extended class object and set the table's model with your new model via
setModel()
. 只需为其创建一个新的TableModel(例如DefaultTableModel对象或AbstractTableModel扩展类对象),然后通过
setModel()
用新模型设置表的模型。
Also, you should avoid null layouts and should never call updateUI unless you're changing the GUI's look and feel. 另外,除非更改GUI的外观,否则应避免使用空布局,并且永远不要调用updateUI。
eg, 例如,
import java.awt.BorderLayout;
import java.awt.Color;
import java.util.Arrays;
import java.util.Vector;
import java.util.Random;
import javax.swing.*;
import javax.swing.table.DefaultTableModel;
@SuppressWarnings("serial")
public class TableFoo extends JPanel {
private static final Vector<String> COLUMN_NAME_VECTOR = new Vector<String>(
Arrays.asList(new String[] { "A", "B", "C" }));
private static final int COLUMN_COUNT = COLUMN_NAME_VECTOR.size();
private JTable table = new JTable();
private Random rand = new Random();
public TableFoo() {
table.setFillsViewportHeight(true);
table.setForeground(Color.WHITE);
table.setBackground(Color.BLACK);
JButton changeData = new JButton(new ChangeDataAction());
JPanel southPanel = new JPanel();
southPanel.setBackground(Color.black);
southPanel.add(changeData);
setLayout(new BorderLayout());
add(new JScrollPane(table), BorderLayout.CENTER);
add(southPanel, BorderLayout.PAGE_END);
}
public void changeTableData() {
Vector<Vector<String>> matrix = new Vector<Vector<String>>();
int rowCount = rand.nextInt(5) + 3;
for (int i = 0; i < rowCount ; i++) {
Vector<String> row = new Vector<String>();
for (int j = 0; j < COLUMN_COUNT; j++) {
String rowText = String.format("row %d col %d: %d", i, j, rand.nextInt(100));
row.add(rowText );
}
matrix.add(row);
}
DefaultTableModel model = new DefaultTableModel(matrix,
COLUMN_NAME_VECTOR);
table.setModel(model);
}
private class ChangeDataAction extends AbstractAction {
public ChangeDataAction() {
super("Change Action");
}
public void actionPerformed(java.awt.event.ActionEvent arg0) {
changeTableData();
};
}
private static void createAndShowGui() {
TableFoo mainPanel = new TableFoo();
JFrame frame = new JFrame("TableFoo");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(mainPanel);
frame.pack();
frame.setLocationByPlatform(true);
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGui();
}
});
}
}
second from options is remove all elements from XxxTableModel
, 第二个选项是从
XxxTableModel
删除所有元素,
notice in the case that you remove data from XxxTableModel per one element , then have to start to remove from last element back to the first 请注意,如果您从每个元素从XxxTableModel删除数据 ,则必须开始从最后一个元素删除到第一个元素
for (int i = model.getRowCount() - 1; i > -1; i--) {
XxxTableModel
XxxTableModel
The easiest way to do this is to use TableModel. 最简单的方法是使用TableModel。
DefaultTableModel model = (DefaultTableModel) this.yourTable.getModel();
model.setRowCount(0);
Good Luck! 祝好运!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.