0

안녕하세요, 데이터베이스에서 데이터를 표시하기 위해 JTable을 사용하는 응용 프로그램을 작성 중이며 회화 중에 tableModel.getValueAt(row,col)에서 IndexOutOfBoundException을 계속받습니다. 코드를 디버깅했는데 데이터가 DefaultTableModels 데이터 벡터에 저장되지 않는 것 같습니다.페인트 도중 JTable throwing IndexOutOfBoundsException

이 내 코드는 ...

public class TableFrame extends JFrame{ 
     public static void main(String[] args){ 
      TableFrame frame = new TableFrame(); 

     } 

     private TablePanel tablePanel; 
     public TableFrame(){ 
      super(); 
      setSize(new Dimension(500,500)); 
      setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

      tablePanel = new TablePanel(); 
      add(tablePanel); 

      updateLabels(); 
      setVisible(true); 
     } 

     public void updateLabels() { 
      setTitle("Main Frame"); 

      tablePanel.updateLabels(); 
     } 

     private static class TablePanel extends JPanel{ 

      private DefaultTableModel tableModel; 
      private DefaultTableColumnModel colModel; 
      private JTable table; 

      private JPanel buttonPanel; 
      private JButton refreshButton; 

      public TablePanel(){ 
       setLayout(new BorderLayout()); 

     buttonPanel = new JPanel(new FlowLayout()); 
     refreshButton = new JButton(); 
     refreshButton.addActionListener(new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent arg0) { 
       refreshData(); 
      } 
     }); 
     buttonPanel.add(refreshButton); 
     add(buttonPanel,BorderLayout.NORTH); 

     //TODO:Set the column renderers and editors 
     colModel = new DefaultTableColumnModel(); 
     colModel.addColumn(new TableColumn(0,75)); 
     colModel.addColumn(new TableColumn(0,75)); 
     colModel.addColumn(new TableColumn(0,75)); 
     colModel.addColumn(new TableColumn(0,75)); 
     colModel.addColumn(new TableColumn(0,75)); 
     colModel.addColumn(new TableColumn(0,75)); 
     colModel.addColumn(new TableColumn(0,75)); 
     colModel.addColumn(new TableColumn(0,75)); 
     colModel.addColumn(new TableColumn(0,75)); 
     colModel.addColumn(new TableColumn(0,75)); 
     colModel.addColumn(new TableColumn(0,75)); 

     tableModel = new DefaultTableModel(); 

     table = new JTable(tableModel,colModel); 

     JScrollPane scrollPane = new JScrollPane(table); 
     add(scrollPane,BorderLayout.CENTER); 

     updateLabels(); 
    } 

    //This is going to query data from a database and populate the table 
    //problem occurs during painting 
    public void refreshData(){ 
     Random rand = new Random(); 

     for(int i=0;i<1000;i++){ 
      Vector<Object> fields = new Vector<Object>(); 
      for(int j=1;j<=11;j++){ 
       fields.add(rand.nextInt()); 
      } 
      tableModel.addRow(fields); 
     } 
    } 

    public void updateLabels() { 
     colModel.getColumn(0).setHeaderValue("Col 1"); 
     colModel.getColumn(1).setHeaderValue("Col 2"); 
     colModel.getColumn(2).setHeaderValue("Col 3"); 
     colModel.getColumn(3).setHeaderValue("Col 4"); 
     colModel.getColumn(4).setHeaderValue("Col 5"); 
     colModel.getColumn(5).setHeaderValue("Col 6"); 
     colModel.getColumn(6).setHeaderValue("Col 7"); 
     colModel.getColumn(7).setHeaderValue("Col 8"); 
     colModel.getColumn(8).setHeaderValue("Col 9"); 
     colModel.getColumn(9).setHeaderValue("Col 10"); 
     colModel.getColumn(10).setHeaderValue("Col 11"); 

       refreshButton.setText("Refresh"); 

       repaint(); 
      } 
     } 
    } 

이 내가 코드를 디버깅 및 tableModel.getDataVector().getElementAt(0).getElementAt(0)tableModel.getRowCount()에 전화를 추가

Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: 0 >= 0 
at java.util.Vector.elementAt(Vector.java:447) 
at TableFrame$TablePanel.refreshData(TableFrame.java:108) 
at TableFrame$TablePanel$1.actionPerformed(TableFrame.java:64) 
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2012) 
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2335) 
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:404) 
at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259) 
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252) 
at java.awt.Component.processMouseEvent(Component.java:6268) 
at javax.swing.JComponent.processMouseEvent(JComponent.java:3267) 
at java.awt.Component.processEvent(Component.java:6033) 
at java.awt.Container.processEvent(Container.java:2045) 
at java.awt.Component.dispatchEventImpl(Component.java:4629) 
at java.awt.Container.dispatchEventImpl(Container.java:2103) 
at java.awt.Component.dispatchEvent(Component.java:4455) 
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4633) 
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4297) 
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4227) 
at java.awt.Container.dispatchEventImpl(Container.java:2089) 
at java.awt.Window.dispatchEventImpl(Window.java:2517) 
at java.awt.Component.dispatchEvent(Component.java:4455) 
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:649) 
at java.awt.EventQueue.access$000(EventQueue.java:96) 
at java.awt.EventQueue$1.run(EventQueue.java:608) 
at java.awt.EventQueue$1.run(EventQueue.java:606) 
at java.security.AccessController.doPrivileged(Native Method) 
at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:105) 
at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:116) 
at java.awt.EventQueue$2.run(EventQueue.java:622) 
at java.awt.EventQueue$2.run(EventQueue.java:620) 
at java.security.AccessController.doPrivileged(Native Method) 
at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:105) 
at java.awt.EventQueue.dispatchEvent(EventQueue.java:619) 
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:275) 
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:200) 
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:190) 
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:185) 
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:177) 
at java.awt.EventDispatchThread.run(EventDispatchThread.java:138) 

...의 예외입니다. getRowCount()1000을 반환하지만 getElementAt()은 awt 이벤트 대기열과 마찬가지로 IndexOutOfBounds 예외를 발생시킵니다. 나는 내가 한 일이 효과가 있다고 생각하지만 분명히 내가 빠진 것이있다.

+1

예외가 발생하는 곳 (TableFrame.java의 108 행)에서 예외가 발생하지만 예외를 던지는 코드가 여기에 붙여 넣은 코드가 아니기 때문에 알려주지 않습니다.'refreshData()'는 결코 Vector를 호출하지 않습니다. .getElementAt()'. –

+0

전체 스택 추적을 게시 할 수는 없지만 "AWT-EventQueue-0"스레드의 topException이 있습니다. java.lang.ArrayIndexOutOfBoundsException : 0> = 0 \t at java.util.Vector.elementAt (Vector.java:447)에 javax.swing.JTable.prepareRenderer javax.swing.JTable.getValueAt (JTable.java:2719) \t에서 javax.swing.table.DefaultTableModel.getValueAt (DefaultTableModel.java:650) \t (JTable로에서 \t. 자바 : 5719) javax.swing.plaf.basic.BasicTableUI.paintCell (BasicTableUI.java:2108) javax.swing.plaf.basic.BasicTableUI.paintCells에서 \t (BasicTableUI.java:2010) – Marcipicus

+0

에서 \t는 그냥 생각 아웃. tableModel이 알고있는 열 수만큼 데이터를 정렬 할 수 있도록 tableModel.setColumnCount()를 호출하지 않았습니다. tableModel에는 열 모델에 대한 지식이 있지만 분명히 그렇지 않습니다. 다음 2 시간 동안 답변을 게시 할 수 없지만 허용되는대로 최대한 기다려야합니다. JB에 대한 질문을 확인해 주셔서 감사합니다. – Marcipicus

답변

1

TableModel은 을 사용하여 설정해야하는 열 수를 얻기 위해 ColumnModel을 참조하지 않습니다. 그렇지 않으면 defaultTableModel은 데이터를 양쪽 정렬하고 행을 getColumnCount()에 의해 검색된 번호로 절단합니다.