Java DefaultTableModel上的getRowCount()出错
编辑 我已尝试将表模型更改回DefaultTableModel,但在编译代码时遇到异常,我不知道为什么 这是我的表格初始化:Java DefaultTableModel上的getRowCount()出错,java,swing,jtable,abstracttablemodel,defaulttablemodel,Java,Swing,Jtable,Abstracttablemodel,Defaulttablemodel,编辑 我已尝试将表模型更改回DefaultTableModel,但在编译代码时遇到异常,我不知道为什么 这是我的表格初始化: jTable1.setModel(new Table1Model()); jTable1.setDefaultRenderer(Color.class,new ColorRenderer(true)); jTable1.getColumnModel().getColumn(5).setCellEditor(new ColorEditor()); 我的类扩展模型: cla
jTable1.setModel(new Table1Model());
jTable1.setDefaultRenderer(Color.class,new ColorRenderer(true));
jTable1.getColumnModel().getColumn(5).setCellEditor(new ColorEditor());
我的类扩展模型:
class Table1Model extends DefaultTableModel {
//private String[] columnNames = {"Station #",
private Object[] columnNames = {"Station #",
"Name",
"avg Time",
"Buffer",
"Buffer Parts",
"Color"};
private Object[][] data = {
{"1", "Station 1",
new Integer(10), false, new Integer(0), Color.red},
{"2", "Station 2",
new Integer(10), false, new Integer(0), Color.blue},
{"3", "Station 3",
new Integer(10), false, new Integer(0), Color.green},
{"4", "Station 4",
new Integer(10), false, new Integer(0), Color.orange},
{"5", "Station 5",
new Integer(10), false, new Integer(0), Color.black}
};
@Override
public int getColumnCount() {
return columnNames.length;
}
@Override
public int getRowCount() {
//int length = data.length;
//int datalength = Integer.parseInt(length);
return data.length;
}
@Override
public String getColumnName(int col) {
return columnNames[col].toString();
}
@Override
public Object getValueAt(int row, int col) {
return data[row][col];
}
/*
* JTable uses this method to determine the default renderer/
* editor for each cell. If we didn't implement this method,
* then the last column would contain text ("true"/"false"),
* rather than a check box.
*/
@Override
public Class getColumnClass(int c) {
return getValueAt(0, c).getClass();
}
/*
* Don't need to implement this method unless your table's
* editable.
*/
@Override
public boolean isCellEditable(int row, int col) {
//Note that the data/cell address is constant,
//no matter where the cell appears onscreen.
if (col == 0) { return false; }
else if (col == 4) {
boolean di = (Boolean) getValueAt(row,(col-1));
if (!di) { return false; }
else { return true; }
}
else { return true; }
}
/*
* Don't need to implement this method unless your table's
* data can change.
*/
@Override
public void setValueAt(Object value, int row, int col) {
data[row][col] = value;
fireTableCellUpdated(row, col);
}
/*public void removeRow(int row) {
data.removeRow(row);
}*/
private void printDebugData() {
int numRows = getRowCount();
int numCols = getColumnCount();
for (int i=0; i < numRows; i++) {
System.out.print(" row " + i + ":");
for (int j=0; j < numCols; j++) {
System.out.print(" " + data[i][j]);
}
System.out.println();
}
System.out.println("--------------------------");
}
}
class Table1Model扩展了DefaultTableModel{
//私有字符串[]columnNames={“Station#”,
私有对象[]columnNames={“Station#”,
“姓名”,
“平均时间”,
“缓冲区”,
“缓冲部件”,
“颜色”};
私有对象[][]数据={
{“1”,“1号站”,
新整数(10),false,新整数(0),Color.red},
{“2”,“2号站”,
新整数(10),false,新整数(0),Color.blue},
{“3”,“3号站”,
新整数(10),false,新整数(0),Color.green},
{“4”,“4号站”,
新整数(10),false,新整数(0),Color.orange},
{“5”,“5号站”,
新整数(10),false,新整数(0),Color.black}
};
@凌驾
public int getColumnCount(){
返回columnNames.length;
}
@凌驾
public int getRowCount(){
//int length=data.length;
//int datalength=Integer.parseInt(长度);
返回数据长度;
}
@凌驾
公共字符串getColumnName(int-col){
返回columnNames[col].toString();
}
@凌驾
公共对象getValueAt(整数行,整数列){
返回数据[行][col];
}
/*
*JTable使用此方法确定默认渲染器/
*每个单元格的编辑器。如果我们没有实现此方法,
*最后一列将包含文本(“真”/“假”),
*而不是复选框。
*/
@凌驾
公共类getColumnClass(int c){
返回getValueAt(0,c).getClass();
}
/*
*不需要实现此方法,除非您的表
*可编辑。
*/
@凌驾
公共布尔值可编辑(int行,int列){
//请注意,数据/单元地址是恒定的,
//无论单元格出现在屏幕上的何处。
如果(col==0){return false;}
如果(col==4){
布尔di=(布尔)getValueAt(行,(列-1));
如果(!di){return false;}
else{return true;}
}
else{return true;}
}
/*
*不需要实现此方法,除非您的表
*数据可以改变。
*/
@凌驾
public void setValueAt(对象值、整行、整列){
数据[行][列]=值;
FireTableCell更新(行、列);
}
/*公共无效清除器OW(int行){
数据流(世界其他地区);
}*/
私有void printDebugData(){
int numRows=getRowCount();
int numCols=getColumnCount();
对于(int i=0;i
这将生成以下错误:
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at SimGui$Table1Model.getRowCount(SimGui.java:863)
at javax.swing.table.DefaultTableModel.setDataVector(DefaultTableModel.java:224)
at javax.swing.table.DefaultTableModel.<init>(DefaultTableModel.java:124)
at javax.swing.table.DefaultTableModel.<init>(DefaultTableModel.java:106)
at javax.swing.table.DefaultTableModel.<init>(DefaultTableModel.java:86)
at SimGui$Table1Model.<init>(SimGui.java:832)
at SimGui.initComponents(SimGui.java:265)
at SimGui.<init>(SimGui.java:34)
at SimGui$16.run(SimGui.java:789)
at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:251)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:701)
at java.awt.EventQueue.access$000(EventQueue.java:102)
at java.awt.EventQueue$3.run(EventQueue.java:662)
at java.awt.EventQueue$3.run(EventQueue.java:660)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:671)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:244)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:163)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:151)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:147)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:139)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:97)
线程“AWT-EventQueue-0”java.lang.NullPointerException中的异常
在SimGui$Table1Model.getRowCount(SimGui.java:863)
位于javax.swing.table.DefaultTableModel.setDataVector(DefaultTableModel.java:224)
位于javax.swing.table.DefaultTableModel。(DefaultTableModel.java:124)
位于javax.swing.table.DefaultTableModel。(DefaultTableModel.java:106)
位于javax.swing.table.DefaultTableModel。(DefaultTableModel.java:86)
在SimGui$Table1Model(SimGui.java:832)
位于SimGui.initComponents(SimGui.java:265)
在SimGui。(SimGui.java:34)
SimGui$16.run(SimGui.java:789)
在java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:251)中
位于java.awt.EventQueue.dispatchEventImpl(EventQueue.java:701)
在java.awt.EventQueue.access$000(EventQueue.java:102)
在java.awt.EventQueue$3.run(EventQueue.java:662)
在java.awt.EventQueue$3.run(EventQueue.java:660)
位于java.security.AccessController.doPrivileged(本机方法)
位于java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
位于java.awt.EventQueue.dispatchEvent(EventQueue.java:671)
位于java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:244)
在java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:163)中
位于java.awt.EventDispatchThread.PumpeEventsforHierarchy(EventDispatchThread.java:151)
位于java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:147)
位于java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:139)
位于java.awt.EventDispatchThread.run(EventDispatchThread.java:97)
你能帮我弄清楚怎么了吗?
另外,我是否能够将ColorEditor与DefaultTableModel一起使用?这里有两个明显的选择:要么给类a
getVectorData()
method,或者为它提供另一个类似的有用方法,允许您从模型中提取数据核心。不过,您可能不应该使用AbstractTableModel变量,而应该使用您自己的自定义类型的变量,该变量扩展AbstractTableModel以允许您调用模型的自定义方法
i、 e
此外,本声明:
我最近创建了自己的类来扩展AbstractTableModel,以便能够在isCellEditable和setValueAt上插入一些逻辑
这对我来说没有意义,因为您可以始终使用DefaultTableModel并简单地重写这两个方法。但是,如果您使用DefaultTableModel,请不要让它像您试图做的那样保存对象的2D数组。而是通过适当的构造函数或通过其addRow(…)将数据馈送到其内部数据中
方法。否则您将失去DefaultTableModel提供的所有功能
编辑如果要使用DefaultTableModel来利用
MyTableModel model = (MyTableModel)jTable1.getModel();
SomeCollection myKeyData = model.getMyKeyData();
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import javax.swing.*;
import javax.swing.table.*;
public class TableModelTest extends JPanel {
private static final Object[][] DATA = {
{ "1", "Station 1", new Integer(10), false, new Integer(0), Color.red },
{ "2", "Station 2", new Integer(10), false, new Integer(0), Color.blue },
{ "3", "Station 3", new Integer(10), false, new Integer(0),
Color.green },
{ "4", "Station 4", new Integer(10), false, new Integer(0),
Color.orange },
{ "5", "Station 5", new Integer(10), false, new Integer(0),
Color.black } };
private MyTableModel myTableModel = new MyTableModel(DATA);
private JTable table = new JTable(myTableModel);
public TableModelTest() {
setLayout(new BorderLayout());
add(new JScrollPane(table), BorderLayout.CENTER);
table.getColumnModel().getColumn(5)
.setCellRenderer(new ColorCellRenderer());
table.getColumnModel().getColumn(5).setCellEditor(new ColorCellEditor());
}
private static void createAndShowGui() {
TableModelTest mainPanel = new TableModelTest();
JFrame frame = new JFrame("TableModelTest");
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();
}
});
}
}
class ColorCellEditor extends AbstractCellEditor implements TableCellEditor {
Color currentColor;
JButton button;
JColorChooser colorChooser;
JDialog dialog;
protected static final String EDIT = "edit";
public ColorCellEditor() {
ActionListener actionListener = new MyActionListener();
button = new JButton();
button.setActionCommand(EDIT);
button.addActionListener(actionListener);
button.setBorderPainted(false);
colorChooser = new JColorChooser();
dialog = JColorChooser.createDialog(button, "Pick a Color", true,
colorChooser, actionListener, null);
}
private class MyActionListener implements ActionListener {
public void actionPerformed(ActionEvent e) {
if (EDIT.equals(e.getActionCommand())) {
button.setBackground(currentColor);
colorChooser.setColor(currentColor);
dialog.setVisible(true);
fireEditingStopped();
} else {
currentColor = colorChooser.getColor();
}
}
}
public Object getCellEditorValue() {
return currentColor;
}
public Component getTableCellEditorComponent(JTable table, Object value,
boolean isSelected, int row, int column) {
currentColor = (Color) value;
return button;
}
}
class ColorCellRenderer implements TableCellRenderer {
private static final int IMG_WIDTH = 70;
private static final int IMG_HEIGHT = 20;
private JLabel label = new JLabel();
@Override
public Component getTableCellRendererComponent(JTable table, Object value,
boolean arg2, boolean arg3, int arg4, int arg5) {
Color color = (Color) value;
BufferedImage img = new BufferedImage(IMG_WIDTH, IMG_HEIGHT,
BufferedImage.TYPE_INT_RGB);
Graphics g = img.getGraphics();
g.setColor(color);
g.fillRect(0, 0, IMG_WIDTH, IMG_HEIGHT);
g.dispose();
ImageIcon icon = new ImageIcon(img);
label.setIcon(icon);
return label;
}
}
class MyTableModel extends DefaultTableModel {
private static final String[] COLUMN_NAMES = { "Station #", "Name",
"avg Time", "Buffer", "Buffer Parts", "Color" };
public MyTableModel(Object[][] data) {
super(data, COLUMN_NAMES);
}
@Override
public boolean isCellEditable(int row, int col) {
if (col == 0) {
return false;
} else if (col == 4) {
boolean di = (Boolean) getValueAt(row, (col - 1));
if (!di) {
return false;
} else {
return true;
}
} else {
return true;
}
}
public void printDebugData() {
int numRows = getRowCount();
int numCols = getColumnCount();
for (int i = 0; i < numRows; i++) {
System.out.print(" row " + i + ":");
for (int j = 0; j < numCols; j++) {
Object datum = getValueAt(i, j);
// System.out.print(" " + data[i][j]);
System.out.print(" " + datum);
}
System.out.println();
}
System.out.println("--------------------------");
}
}