2014-11-17 2 views
1

다음 표가 생성되었습니다.ArrayIndexOutOfBoundsException - columnHeaders를 설정할 때

다음
Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: 0 >= 0 
    at java.util.Vector.elementAt(Unknown Source) 
    at javax.swing.table.DefaultTableColumnModel.getColumn(Unknown Source) 
    at test.tableHeader.JTableRowHeader.<init>(JTableRowHeader.java:62) 
    at test.tableHeader.JTableRowHeader$6.run(JTableRowHeader.java:169) 
    at java.awt.event.InvocationEvent.dispatch(Unknown Source) 
    at java.awt.EventQueue.dispatchEventImpl(Unknown Source) 
    at java.awt.EventQueue.access$400(Unknown Source) 
    at java.awt.EventQueue$2.run(Unknown Source) 
    at java.awt.EventQueue$2.run(Unknown Source) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.security.AccessControlContext$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) 
com.passlogix.vgo.ho.WindowHandleException: null: javax.swing.JFrame[frame0,0,0,0x0,invalid,hidden,layout=java.awt.BorderLayout,title=JTable,resizable,normal,defaultCloseOperation=HIDE_ON_CLOSE,rootPane=javax.swing.JRootPane[,0,0,0x0,invalid,layout=javax.swing.JRootPane$RootLayout,alignmentX=0.0,alignmentY=0.0,[email protected],flags=16777609,maximumSize=,minimumSize=,preferredSize=],rootPaneCheckingEnabled=true] 
    at com.passlogix.vgo.ho.ApplicationWindow.nativeGetWindowHandle(Native Method) 
    at com.passlogix.vgo.ho.ApplicationWindowAccessJava1dot4.getHWnd(ApplicationWindowAccessJava1dot4.java:50) 
    at com.passlogix.vgo.ho.WindowScanner.run(WindowScanner.java:569) 

가 재현 샘플 프로그램입니다 : 라인 tcm.getColumn(0).setHeaderValue(columnNames[0]);에서 나는 다음과 같은 expection를 얻을 샘플 프로그램을 실행하는 경우 그러나, 나는 무슨 일을

import java.awt.Color; 
    import java.awt.Component; 
    import java.awt.Dimension; 
    import java.awt.EventQueue; 
    import java.awt.Font; 

    import javax.swing.JFrame; 
    import javax.swing.JLabel; 
    import javax.swing.JScrollPane; 
    import javax.swing.JTable; 
    import javax.swing.SwingConstants; 
    import javax.swing.UIManager; 
    import javax.swing.UnsupportedLookAndFeelException; 
    import javax.swing.event.ListSelectionEvent; 
    import javax.swing.event.ListSelectionListener; 
    import javax.swing.event.RowSorterEvent; 
    import javax.swing.event.RowSorterListener; 
    import javax.swing.table.DefaultTableModel; 
    import javax.swing.table.TableCellRenderer; 
    import javax.swing.table.TableColumnModel; 
    import javax.swing.table.TableModel; 
    import javax.swing.table.TableRowSorter; 

    public class JTableRowHeader { 

     private JFrame frame = new JFrame("JTable"); 
     private JScrollPane scrollPane; 
     private JTable tableAnalytics; 
     private DefaultTableModel model; 
     private DefaultTableModel model1; 
     private TableRowSorter<TableModel> sorter; 
     private JTable headerTable; 
     private String[] columnNames = {"AVERAGE", "2014", "2015", "2016", "2017", "2018", "2019", "2020", "2021", "2022", "2023"}; 
     private String[] rowNames = {"Production Costs", "Average Equity", "Debt Yield Percentage", "Sales Valuation"}; 


     public JTableRowHeader() { 

      model1 = new DefaultTableModel() { 
       /** 
       * UUID 
       */ 
       private static final long serialVersionUID = 8538648271391086030L; 

       @Override 
       public boolean isCellEditable(int row, int col) { 
        return false; 
       } 
      }; 

      tableAnalytics = new JTable(rowNames.length, columnNames.length); 
      tableAnalytics.setModel(model1); 
      for (int i = 0; i < model1.getRowCount(); i++) { 
       for (int ii = 0; ii < model1.getRowCount(); ii++) { 
        model1.setValueAt(i + ii, i, ii); 
       } 
      } 
      TableColumnModel tcm = tableAnalytics.getColumnModel();   
      tcm.getColumn(0).setHeaderValue(columnNames[0]);//here I get the expection! 
      tcm.getColumn(1).setHeaderValue(columnNames[1]); 
      tcm.getColumn(2).setHeaderValue(columnNames[2]); 
      tcm.getColumn(3).setHeaderValue(columnNames[3]); 
      tcm.getColumn(4).setHeaderValue(columnNames[4]); 
      tcm.getColumn(5).setHeaderValue(columnNames[5]); 
      tcm.getColumn(6).setHeaderValue(columnNames[6]); 
      tcm.getColumn(7).setHeaderValue(columnNames[7]); 
      tcm.getColumn(8).setHeaderValue(columnNames[8]); 
      tcm.getColumn(9).setHeaderValue(columnNames[9]); 

      sorter = new TableRowSorter<TableModel>(tableAnalytics.getModel()); 
      tableAnalytics.setRowSorter(sorter); 
      model = new DefaultTableModel() { 
       private static final long serialVersionUID = 12312432141L; 

       @Override 
       public int getColumnCount() { 
        return 1; 
       } 

       @Override 
       public boolean isCellEditable(int row, int col) { 
        return false; 
       } 

       @Override 
       public int getRowCount() { 
        return tableAnalytics.getRowCount(); 
       } 

       @Override 
       public Class<?> getColumnClass(int colNum) { 
        switch (colNum) { 
        case 0: 
         return String.class; 
        default: 
         return super.getColumnClass(colNum); 
        } 
       } 
      }; 
      headerTable = new JTable(model); 

      headerTable.setValueAt(rowNames[0], 0, 0); 
      headerTable.setValueAt(rowNames[1], 1, 0); 
      headerTable.setValueAt(rowNames[2], 2, 0); 
      headerTable.setValueAt(rowNames[3], 3, 0); 

      headerTable.setShowGrid(false); 
      headerTable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF); 
      headerTable.setPreferredScrollableViewportSize(new Dimension(50, 0)); 
      headerTable.getColumnModel().getColumn(0).setPreferredWidth(50); 
      headerTable.getColumnModel().getColumn(0).setCellRenderer(new TableCellRenderer() { 
       @Override 
       public Component getTableCellRendererComponent(JTable x, Object value, boolean isSelected, boolean hasFocus, int row, int column) { 

        boolean selected = tableAnalytics.getSelectionModel().isSelectedIndex(row); 
        Component component = tableAnalytics.getTableHeader().getDefaultRenderer().getTableCellRendererComponent(tableAnalytics, value, false, false, -1, -2); 
        ((JLabel) component).setHorizontalAlignment(SwingConstants.CENTER); 
        if (selected) { 
         component.setFont(component.getFont().deriveFont(Font.BOLD)); 
         component.setForeground(Color.red); 
        } else { 
         component.setFont(component.getFont().deriveFont(Font.PLAIN)); 
        } 
        return component; 
       } 
      }); 
      tableAnalytics.getRowSorter().addRowSorterListener(new RowSorterListener() { 
       @Override 
       public void sorterChanged(RowSorterEvent e) { 
        model.fireTableDataChanged(); 
       } 
      }); 
      tableAnalytics.getSelectionModel().addListSelectionListener(new ListSelectionListener() { 
       @Override 
       public void valueChanged(ListSelectionEvent e) { 
        model.fireTableRowsUpdated(0, model.getRowCount() - 1); 
       } 
      }); 
      scrollPane = new JScrollPane(tableAnalytics); 
      scrollPane.setRowHeaderView(headerTable); 
      tableAnalytics.setPreferredScrollableViewportSize(tableAnalytics.getPreferredSize()); 
      frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
      frame.add(scrollPane); 

      frame.pack(); 
      frame.setLocation(150, 150); 
      frame.setVisible(true); 
     } 

     public static void main(String[] args) { 
      try { 
       UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
      } catch (ClassNotFoundException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } catch (InstantiationException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } catch (IllegalAccessException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } catch (UnsupportedLookAndFeelException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
      EventQueue.invokeLater(new Runnable() { 
       @Override 
       public void run() { 
        @SuppressWarnings("unused") 
        JTableRowHeader TestTableRowHeader = new JTableRowHeader(); 
       } 
      }); 
     } 
    } 

어떤 생각을하고 있는가?

: 나는 여전히 오류가 발생, 그러나

tcm.getColumn(0).setHeaderValue(columnNames[0]); 
    tcm.getColumn(1).setHeaderValue(columnNames[1]); 
    tcm.getColumn(2).setHeaderValue(columnNames[2]); 
    tcm.getColumn(3).setHeaderValue(columnNames[3]); 
    tcm.getColumn(4).setHeaderValue(columnNames[4]); 
    tcm.getColumn(5).setHeaderValue(columnNames[5]); 
    tcm.getColumn(6).setHeaderValue(columnNames[6]); 
    tcm.getColumn(7).setHeaderValue(columnNames[7]); 
    tcm.getColumn(8).setHeaderValue(columnNames[8]); 
    tcm.getColumn(9).setHeaderValue(columnNames[9]); 

:

TableColumnModel tcm = tableAnalytics.getColumnModel(); 
    for (int k = 0; k < tcm.getColumnCount(); k++) { 
     tcm.getColumn(k).setHeaderValue(columnNames[k]); 
    } 

대신 :

UPDATE는 지금과 동적으로 내 열 헤더를 만들려고

Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: 0 >= 0 
그래서 rowNames[4] 아웃 오브 바운드,

private String[] rowNames = {"Production Costs", "Average Equity", "Debt Yield Percentage", "Sales Valuation"}; 

이 배열은 4 요소를 가지고 : 0

답변

3

3. 귀하의 문제이다

tableAnalytics = new JTable(rowNames.length, columnNames.length);

하지만 당신은 행 = 0/열 모델 tableAnalytics.setModel(model1);를 오버라이드 (override) = 0, 왜냐하면 당신은 ArrayIndexOutOfBoundsException을 얻습니다. 설명 된 오류를 수정 한 후 같아요,이 오류가 따를 것이다, 당신의 대답을

DefaultTableModel model1 = new DefaultTableModel(rowNames.length, columnNames.length) { 
     /** 
      * UUID 
      */ 
     private static final long serialVersionUID = 8538648271391086030L; 

     @Override 
     public boolean isCellEditable(int row, int col) { 
      return false; 
     } 
    }; 

    JTable tableAnalytics = new JTable(model1); 
+0

Thx 완벽하게 작동합니다! – mrquad

3

이것은 rowNames 당신의 초기화이다.

당신은 행/열이 JTable를 만들 : 유효한 인덱스는 다음에 0

+0

들으!

JTable 다음과 같은를 만듭니다. 설명 된 오류가 해결되지 않았으므로 이제는 제 질문으로 수정했습니다. 내 질문에 대한 귀하의 의견을 주셔서 감사합니다! – mrquad

관련 문제