java.lang.IllegalArgumentException:列必须有效,是-1

问题描述:

我想向JXTreeTable添加一组值,但在运行程序时出现这组错误。java.lang.IllegalArgumentException:列必须有效,是-1

Exception in thread "AWT-EventQueue-0" java.lang.IllegalArgumentException: column must be valid, was-1 
    at org.jdesktop.swingx.JXTreeTable.isHierarchical(JXTreeTable.java:1760) 
    at org.jdesktop.swingx.JXTreeTable.getToolTipText(JXTreeTable.java:1197) 
    at javax.swing.ToolTipManager$insideTimerAction.actionPerformed(ToolTipManager.java:629) 
    at javax.swing.Timer.fireActionPerformed(Timer.java:312) 
    at javax.swing.Timer$DoPostEvent.run(Timer.java:244) 
    at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:251) 
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:705) 
    at java.awt.EventQueue.access$000(EventQueue.java:101) 
    at java.awt.EventQueue$3.run(EventQueue.java:666) 
    at java.awt.EventQueue$3.run(EventQueue.java:664) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76) 
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:675) 
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:211) 
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:128) 
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:117) 
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:113) 
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:105) 
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:90) 

请帮我解决这个错误。

这是我的代码:

final Date doj = Calendar.getInstance().getTime();   
    List<Department> departmentList = new ArrayList<Department>(); 

    List<Employee> empList = new ArrayList<Employee>(); 
    empList.add(new Employee(1, "Ram", doj, "emp1.jpg")); 
    empList.add(new Employee(2, "Krishna", doj, "emp2.jpg")); 
    departmentList.add(new Department(1, "Sales", empList)); 

    List<Employee> empList2 = new ArrayList<Employee>(); 
    empList2.add(new Employee(3, "Govind", doj, "emp1.jpg")); 
    empList2.add(new Employee(4, "Kiran", doj, "emp2.jpg")); 
    empList2.add(new Employee(5, "Prabhu", doj, "emp1.jpg")); 
    departmentList.add(new Department(2, "Marketing", empList2)); 

    //we use a no root model 
    NoRootTreeTableModel noRootTreeTableModel = new NoRootTreeTableModel(departmentList); 
    treeTable = new JXTreeTable(noRootTreeTableModel); 
    treeTable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF); 
    treeTable.setRootVisible(false); 
    // treeTable.getColumnModel().getColumn(3).setCellRenderer(new PhotoRenderer()); 
    treeTable.setRowHeight(50); 

    add(new JScrollPane(treeTable)); 

    setTitle("JXTreeTable Example"); 
    setDefaultCloseOperation(EXIT_ON_CLOSE); 
    pack(); 
    setVisible(true); 

class NoRootTreeTableModel extends AbstractTreeTableModel{ 
private final static String[] COLUMN_NAMES = {"Id", "Name", "Doj", "Photo"}; 

    private List<Department> departmentList; 

    public NoRootTreeTableModel(List<Department> departmentList) { 
     super(new Object()); 
     this.departmentList = departmentList; 
    } 


    public int getColumnCount() { 
     return COLUMN_NAMES.length; 
    } 


    public String getColumnName(int column) { 
     return COLUMN_NAMES[column]; 
    } 


    public boolean isCellEditable(Object node, int column) { 
     if (node instanceof Department && column == 2) { 
      return false; 
     } 
     return true; 
    } 


    public boolean isLeaf(Object node) { 
     return node instanceof Employee; 
    } 


    public int getChildCount(Object parent) { 
     if (parent instanceof Department) { 
      Department dept = (Department) parent; 
      return dept.getEmployeeList().size(); 
     } 
     return departmentList.size(); 
    } 


    public Object getChild(Object parent, int index) { 
     if (parent instanceof Department) { 
      Department dept = (Department) parent; 
      return dept.getEmployeeList().get(index); 
     } 
     return departmentList.get(index); 
    } 


    public int getIndexOfChild(Object parent, Object child) { 
     Department dept = (Department) parent; 
     Employee emp = (Employee) child; 
     return dept.getEmployeeList().indexOf(emp); 
    } 


    public Object getValueAt(Object node, int column) { 
     if (node instanceof Department) { 
      Department dept = (Department) node; 
      switch (column) { 
       case 0: 
        return dept.getId(); 
       case 1: 
        return dept.getName(); 
      } 
     } else if (node instanceof Employee) { 
      Employee emp = (Employee) node; 
      switch (column) { 
       case 0: 
        return emp.getId(); 
       case 1: 
        return emp.getName(); 
       case 2: 
        return emp.getDoj(); 
       case 3: 
        return emp.getPhoto(); 
      } 
     } 
     return null; 
    } 


    public void setValueAt(Object value, Object node, int column) { 
     String strValue = (String) value; 
     if (node instanceof Department) { 
      Department dept = (Department) node; 
      switch (column) { 
       case 0: 
        dept.setId(Integer.valueOf(strValue)); 
        break; 
       case 1: 
        dept.setName(strValue); 
        break; 
      } 
     } else if (node instanceof Employee) { 
      Employee emp = (Employee) node; 
      switch (column) { 
       case 0: 
        emp.setId(Integer.valueOf(strValue)); 
        break; 
       case 1: 
        emp.setName(strValue); 
        break; 
      } 
     } 
    } 
} 
+5

寻求调试帮助的问题(“**为什么不是这个代码工作?”)必须包含所需的行为,特定的问题或错误以及在问题本身中重现**的最短代码** 。没有**明确问题陈述**的问题对其他读者没有用处。请参见[如何创建最小,完整和可验证示例](http://stackoverflow.com/help/mcve)。 – DavidPostill 2014-10-29 07:25:16

+0

你能提供你的代码片段吗? – 2014-10-29 07:26:21

columnAtPoint返回-1,因为现在还没有结束的JXTreeTable 所以一列中,添加一个检查为column == -1,同时增加值JXTreeTable并跳过只要条件发生增值。