안녕하세요, 데이터베이스에서 데이터를 표시하기 위해 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
예외를 발생시킵니다. 나는 내가 한 일이 효과가 있다고 생각하지만 분명히 내가 빠진 것이있다.
예외가 발생하는 곳 (TableFrame.java의 108 행)에서 예외가 발생하지만 예외를 던지는 코드가 여기에 붙여 넣은 코드가 아니기 때문에 알려주지 않습니다.'refreshData()'는 결코 Vector를 호출하지 않습니다. .getElementAt()'. –
전체 스택 추적을 게시 할 수는 없지만 "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
에서 \t는 그냥 생각 아웃. tableModel이 알고있는 열 수만큼 데이터를 정렬 할 수 있도록 tableModel.setColumnCount()를 호출하지 않았습니다. tableModel에는 열 모델에 대한 지식이 있지만 분명히 그렇지 않습니다. 다음 2 시간 동안 답변을 게시 할 수 없지만 허용되는대로 최대한 기다려야합니다. JB에 대한 질문을 확인해 주셔서 감사합니다. – Marcipicus