Java DefaultTableModel上的getRowCount()出错

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

编辑

我已尝试将表模型更改回DefaultTableModel,但在编译代码时遇到异常,我不知道为什么

这是我的表格初始化:

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