JTable update in Swing gives an exception

So, I'm essentially trying to update the JTable every time I press a key or when updating part of the observer. Sometimes I get a frozen application and this stack trace ...

Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: 5> = 5 at java.util.Vector.elementAt (Unknown source) at javax.swing.table.DefaultTableColumnModel.getColumn (Unknown source) in javax. .plaf.synth.SynthTableUI.paintCells (Unknown source) in javax.swing.plaf.synth.SynthTableUI.paint (Unknown source) in javax.swing.plaf.synth.SynthTableUI.update (Unknown source) in javaxswing .paintComponent (Unknown source) in javax.swing.JComponent.paint (Unknown source) on javax.swing.JComponent.paintToOffscreen (Unknown source) in javax.swing.RepaintManager $ PaintManager.paintDoubleBuffered (Unknown sourceManager jager) $ PaintManager.paint (Unknown source) in javax.swing.RepaintManager.paint (Unknown source) in javax.swing.JComponent._paintImmediately (unknown source) in javax.swing.JComponent.paintImmediately (Unknown source) in javax.swing.RepaintManager.paintDirtyRegions (Unknown source) in javax.swanRepions.epagerRepions. Unknown source) in javax.swing.RepaintManager.seqPaintDirtyRegions (Unknown source) in javax.swing.SystemEventQueueUtilities $ ComponentWorkRequest.run (Unknown source) on java.awt.event.InvocationEvent.dispatch (Unknown source). dispatchEvent (Unknown source) in java.awt.EventDispatchThread.pumpEventsForFilter (Unknown source) in java.awt.EventDispatchThread.pumpOneEventForFilters (Unknown source) in java.awt.EventDispatchThread.pumpEventsFor Javaawt.EventDispatchThread.pumpEvents (Unknown source) in java.awt.EventDispatchThread.pumpEvents (Unknown source) in java.awt.EventDispatchThread.run (Unknown source) Exception in thread "AWT-EventQueue-0" javaxOutOutOutray 4. > = 4 at java.util.Vector.elementAt (Unknown source) at javax.swing.table.DefaultTableColumnModel.getColumn (Unknown source) at sun.swing.SwingUtilities2.convertColumnIndexToModel (Unknown source) in javax.swingCTolMentableTolTemolumnToTlumnDollTjTableTolTable Unknown source) in javax.swing.JTable.getColumnClass (Unknown source) in javax.swing.plaf.synth.SynthTableUI $ SynthTableCellRenderer.getTableCellRendererComponent (Unknown source) in javax.swing.JRenableprep. plaf.synth.SynthTableUI.paintCell (Unknown source) in javax.swing.plaf.synth.SynthTableUI.paintCells (Unknown source) in javax.swing.plaf.synth.SynthTableUI.paint (Unknown source) in javax.swing.plafhntable. update (Unknown source) in javax.swing.JComponent.paintComponent (Unknown source) in javax.swing.JComponent.paint (Unknown source) at javax.swing.JComponent.paintToOffscreen (Unknown source) in javax.swing.RepaintManager $. paintDoubleBuffered (Unknown source) in javax.swing.RepaintManager $ PaintManager.paint (Unknown source) in javax.swing.RepaintManager.paint (Unknown source) in javax.swing.JComponent._paintImmediately (Unknown source) in javax.swing. paintImmediately (Unknown source) in javax.swing.RepaintManager.paintDirtyRegions (Unknown source) in javax.swing.RepaintManager.paintDirtyRegions (Unknown source) in javax.swing.RepaintManager.seqPaintDirtyRegions (Unknown source) in javax.swing.SystemEventQueueUtilities $ ComponentWunRequest unknown ComponentrunquestRequest jawax InvocationEvent.dispatch (Unknown source) at java.awt.EventQueue.dispatchEvent (Unknown source) in java.awt.EventDispatchThread.pumpOneEventForFilters (Unknown source) in java.awt.EventDispatchThread.pumpEventsForFetch. unknown (Unknown) pumpEventsForHierarchy (Unknown source) in java.awt.EventDispatchThread.pumpEvents (Unknown source) in java.awt.EventDispatchThread.pumpEvents (Unknown source) in java.awt.EventDispatchThread.run (Unknown source)run (Unknown source)

, :

public synchronized void refreshTable()
{
    Customer cust = custManager.getCustomer(phoneNumber.getText());

    if (cust == null)
    {
        table.setModel(new DefaultTableModel(new Object[][] {}, tableHeader) {
                @SuppressWarnings("rawtypes")
                Class[] columnTypes = new Class[] {Integer.class, String.class,
                                                   Object.class, Object.class, 
                                                   Object.class, Object.class};
                @SuppressWarnings({ "unchecked", "rawtypes" })
                public Class getColumnClass(int columnIndex) {
                    return columnTypes[columnIndex];
                }

                public boolean isCellEditable(int row, int column) {
                    return false;
                }
        });
        table.getColumnModel().getColumn(0).setPreferredWidth(40);
        table.getColumnModel().getColumn(1).setPreferredWidth(120);
        return;
    }

    Object[][] grid = new Object[cust.getOrderHistory().size()][6];

    SimpleDateFormat sdf = new SimpleDateFormat("MMM/dd/yyyy HH:mm");
    NumberFormat currencyFormat = NumberFormat.getCurrencyInstance();

    int i = 0;
    for (Entry<GregorianCalendar, Order> orderEntry : cust.getOrderHistory())
    {
        Order order = orderEntry.getValue();

        grid[i][0] = order.getOrderID();
        grid[i][1] = sdf.format((order.getProcessedTimestamp().getTime()));
        grid[i][2] = currencyFormat.format(order.getSubTotal()/100.00);
        grid[i][3] = currencyFormat.format(order.getTaxedAmount()/100.00);
        grid[i][4] = currencyFormat.format(order.getTotal()/100.00);
        grid[i][5] = order.getOrderStatus();

        i++;
    }

    DefaultTableModel dft = new DefaultTableModel(grid, tableHeader) {
            @SuppressWarnings("rawtypes")
            Class[] columnTypes = new Class[] {Integer.class, String.class, 
                                               Object.class, Object.class, 
                                               Object.class, Object.class};
            @SuppressWarnings({ "unchecked", "rawtypes" })
            public Class getColumnClass(int columnIndex) {
                return columnTypes[columnIndex];
            }

            public boolean isCellEditable(int row, int column) {
                return false;
            }
        };

    table.setModel(dft);
    table.getColumnModel().getColumn(0).setPreferredWidth(40);
    table.getColumnModel().getColumn(1).setPreferredWidth(120);
}

try/catch, . , .

+3
3

, , , , , - , .

, "". , . (, Swing , ), , - , . , , , , concurrency.

, , , , , . , .

, AbstractTableModel (http://download.oracle.com/javase/6/docs/api/javax/swing/table/AbstractTableModel.html). Java (http://download.oracle.com/javase/tutorial/uiswing/components/table.html#data), , . - getValueAt, , . , , "", .

TableModel, setModel , .

, . , "fireTableDataChanged". , , , . , , Java Tutorial, : http://download.oracle.com/javase/tutorial/uiswing/components/table.html#fire

+3

? , - EDT. , Swing?

+2

: , refreshTable , EDT, - , Swing, , EDT.

( , ), , refreshTable

  public void invokeRefreshTable(final OrderTableModel model) {
    SwingUtilities.invokeLater(new Runnable() {
        public void run() {
            refreshTable(model)
        }
    }); 

  }

, , , , , , , - . ( ) , tableModel: . , TableModel, - :

public static class OrderTableModel extends AbstractTableModel {
    List<Order> orders = new ArrayList<Order>();
    Class<?>[] columnTypes = new Class[] { Integer.class,
            Timestamp.class, BigDecimal.class, BigDecimal.class, BigDecimal.class,
            Object.class };

    public void setOrders(Customer customer) {
        setOrders(customer != null ? customer.getOrderHistory() : null);
    }

    public void setOrders(Map<?, ?> orderHistory) {
        clear();
        if (orderHistory == null) return;
        for (Entry<?, ?> orderEntry: orderHistory) {
            orders.add(orderEntry.getValue());
        }
        fireTableRowsInserted(0, orders.size() - 1);
    }

    public void clear() {
        int rowCount = orders.size();
        orders.clear();
        if (rowCount > 0 ) {
            fireTableRowsDeleted(0, rowCount -1);
        }
    }

    @Override
    public Object getValueAt(int rowIndex, int columnIndex) {
       switch (columnIndex) {
           case 0: return orders.get(rowIndex).getOrderID();
           //....

           default:
               break;
       }

        return null;
    }

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

    @Override
    public int getColumnCount() {
        return columnTypes.length;
    }

    @Override
    public Class<?> getColumnClass(int columnIndex) {
        return columnTypes[columnIndex];
    }

}

// the single model instance to re-use always
OrderTableModel model = new OrderTableModel()
// separate initial configuration of the table
JTable table = new JTable(model);
// register custom renderers
table.setDefaultRenderer(BigDecimal.class, new BigDecimalRenderer());
table.setDefaultRenderer(Timestamp.class, new TimeStampRenderer());
// config the table
table.getColumnModel().getColumn(0).setPreferredSize(...)
....

// the refresh method crumpled down to a single line
public void refreshTable(OrderTableModel model) {
    model.setCustomer(customManager.getCustomer(phoneNumber))
}

// if refreshing is needed
invokeRefreshTable(model);

:

  • : - cellRenderers
  • : Customer, orderHistory
+2

All Articles