2

我已经设置了一个JTable并使它包含 18 列。最初,当它是 13 根柱子时,它很好地融入了其中JTable并且没有撕裂。但是,一旦我让它包含 18 个表,并将 autoresize 设置为关闭,当我使用水平滚动条尝试滚动其他列时,JTable开始发生撕裂,如下图所示:

表格图像

Netbeans 也开始给我很多这样的错误消息:

线程“AWT-EventQueue-0”中的异常 java.lang.ArrayIndexOutOfBoundsException:14
    在 javax.swing.JTable$1.getValueAt(JTable.java:689)
    在 javax.swing.JTable.getValueAt(JTable.java:2720)
    在 javax.swing.JTable.prepareRenderer(JTable.java:5718)
    在 javax.swing.plaf.synth.SynthTableUI.paintCell(SynthTableUI.java:684)
    在 javax.swing.plaf.synth.SynthTableUI.paintCells(SynthTableUI.java:581)
    在 javax.swing.plaf.synth.SynthTableUI.paint(SynthTableUI.java:365)
    在 javax.swing.plaf.synth.SynthTableUI.update(SynthTableUI.java:276)
    在 javax.swing.JComponent.paintComponent(JComponent.java:778)
    在 javax.swing.JComponent.paint(JComponent.java:1054)
    在 javax.swing.JComponent.paintToOffscreen(JComponent.java:5221)
    在 javax.swing.RepaintManager$PaintManager.paintDoubleBuffered(RepaintManager.java:1482)
    在 javax.swing.RepaintManager$PaintManager.paint(RepaintManager.java:1413)
    在 javax.swing.RepaintManager.paint(RepaintManager.java:1206)
    在 javax.swing.JComponent.paintForceDoubleBuffered(JComponent.java:1090)
    在 javax.swing.JViewport.blitDoubleBuffered(JViewport.java:1598)
    在 javax.swing.JViewport.windowBlitPaint(JViewport.java:1559)
    在 javax.swing.JViewport.setViewPosition(JViewport.java:1102)
    在 javax.swing.plaf.basic.BasicScrollPaneUI$Handler.hsbStateChanged(BasicScrollPaneUI.java:1087)
    在 javax.swing.plaf.basic.BasicScrollPaneUI$Handler.stateChanged(BasicScrollPaneUI.java:1038)
    在 javax.swing.DefaultBoundedRangeModel.fireStateChanged(DefaultBoundedRangeModel.java:364)
    在 javax.swing.DefaultBoundedRangeModel.setRangeProperties(DefaultBoundedRangeModel.java:302)
    在 javax.swing.DefaultBoundedRangeModel.setValue(DefaultBoundedRangeModel.java:168)
    在 javax.swing.JScrollBar.setValue(JScrollBar.java:463)
    在 javax.swing.plaf.basic.BasicScrollBarUI$TrackListener.setValueFrom(BasicScrollBarUI.java:1253)
    在 javax.swing.plaf.basic.BasicScrollBarUI$TrackListener.mouseDragged(BasicScrollBarUI.java:1195)
    在 java.awt.Component.processMouseMotionEvent(Component.java:6553)
    在 javax.swing.JComponent.processMouseMotionEvent(JComponent.java:3339)
    在 java.awt.Component.processEvent(Component.java:6274)
    在 java.awt.Container.processEvent(Container.java:2229)
    在 java.awt.Component.dispatchEventImpl(Component.java:4861)
    在 java.awt.Container.dispatchEventImpl(Container.java:2287)
    在 java.awt.Component.dispatchEvent(Component.java:4687)
    在 java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4832)
    在 java.awt.LightweightDispatcher.processMouseEvent(Container.java:4509)
    在 java.awt.LightweightDispatcher.dispatchEvent(Container.java:4422)
    在 java.awt.Container.dispatchEventImpl(Container.java:2273)
    在 java.awt.Window.dispatchEventImpl(Window.java:2719)
    在 java.awt.Component.dispatchEvent(Component.java:4687)
    在 java.awt.EventQueue.dispatchEventImpl(EventQueue.java:703)
    在 java.awt.EventQueue.access$000(EventQueue.java:102)
    在 java.awt.EventQueue$3.run(EventQueue.java:662)
    在 java.awt.EventQueue$3.run(EventQueue.java:660)
    在 java.security.AccessController.doPrivileged(本机方法)
    在 java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
    在 java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:87)
    在 java.awt.EventQueue$4.run(EventQueue.java:676)
    在 java.awt.EventQueue$4.run(EventQueue.java:674)
    在 java.security.AccessController.doPrivileged(本机方法)
    在 java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
    在 java.awt.EventQueue.dispatchEvent(EventQueue.java:673)
    在 java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:244)
    在 java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:163)
    在 java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:151)
    在 java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:147)
    在 java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:139)
    在 java.awt.EventDispatchThread.run(EventDispatchThread.java:97)
线程“AWT-EventQueue-0”中的异常 java.lang.ArrayIndexOutOfBoundsException:14
    在 javax.swing.JTable$1.getValueAt(JTable.java:689)
    在 javax.swing.JTable.getValueAt(JTable.java:2720)
    在 javax.swing.JTable.prepareRenderer(JTable.java:5718)
    在 javax.swing.plaf.synth.SynthTableUI.paintCell(SynthTableUI.java:684)
    在 javax.swing.plaf.synth.SynthTableUI.paintCells(SynthTableUI.java:581)
    在 javax.swing.plaf.synth.SynthTableUI.paint(SynthTableUI.java:365)
    在 javax.swing.plaf.synth.SynthTableUI.update(SynthTableUI.java:276)
    在 javax.swing.JComponent.paintComponent(JComponent.java:778)
    在 javax.swing.JComponent.paint(JComponent.java:1054)
    在 javax.swing.JComponent.paintChildren(JComponent.java:887)
    在 javax.swing.JComponent.paint(JComponent.java:1063)
    在 javax.swing.JViewport.paint(JViewport.java:731)
    在 javax.swing.JComponent.paintChildren(JComponent.java:887)
    在 javax.swing.JComponent.paint(JComponent.java:1063)
    在 javax.swing.JComponent.paintChildren(JComponent.java:887)
    在 javax.swing.JComponent.paint(JComponent.java:1063)
    在 javax.swing.JComponent.paintToOffscreen(JComponent.java:5221)
    在 javax.swing.RepaintManager$PaintManager.paintDoubleBuffered(RepaintManager.java:1482)
    在 javax.swing.RepaintManager$PaintManager.paint(RepaintManager.java:1413)
    在 javax.swing.RepaintManager.paint(RepaintManager.java:1206)
    在 javax.swing.JComponent._paintImmediately(JComponent.java:5169)
    在 javax.swing.JComponent.paintImmediately(JComponent.java:4980)
    在 javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:770)
    在 javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:728)
    在 javax.swing.RepaintManager.prePaintDirtyRegions(RepaintManager.java:677)
    在 javax.swing.RepaintManager.access$700(RepaintManager.java:59)
    在 javax.swing.RepaintManager$ProcessingRunnable.run(RepaintManager.java:1621)
    在 java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:251)
    在 java.awt.EventQueue.dispatchEventImpl(EventQueue.java:701)
    在 java.awt.EventQueue.access$000(EventQueue.java:102)
    在 java.awt.EventQueue$3.run(EventQueue.java:662)
    在 java.awt.EventQueue$3.run(EventQueue.java:660)
    在 java.security.AccessController.doPrivileged(本机方法)
    在 java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
    在 java.awt.EventQueue.dispatchEvent(EventQueue.java:671)
    在 java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:244)
    在 java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:163)
    在 java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:151)
    在 java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:147)
    在 java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:139)
    在 java.awt.EventDispatchThread.run(EventDispatchThread.java:97)
线程“AWT-EventQueue-0”中的异常 java.lang.ArrayIndexOutOfBoundsException:14
    在 javax.swing.JTable$1.getValueAt(JTable.java:689)
    在 javax.swing.JTable.getValueAt(JTable.java:2720)
    在 javax.swing.JTable.prepareRenderer(JTable.java:5718)
    在 javax.swing.plaf.synth.SynthTableUI.paintCell(SynthTableUI.java:684)
    在 javax.swing.plaf.synth.SynthTableUI.paintCells(SynthTableUI.java:581)
    在 javax.swing.plaf.synth.SynthTableUI.paint(SynthTableUI.java:365)
    在 javax.swing.plaf.synth.SynthTableUI.update(SynthTableUI.java:276)
    在 javax.swing.JComponent.paintComponent(JComponent.java:778)
    在 javax.swing.JComponent.paint(JComponent.java:1054)
    在 javax.swing.JComponent.paintToOffscreen(JComponent.java:5221)
    在 javax.swing.RepaintManager$PaintManager.paintDoubleBuffered(RepaintManager.java:1482)
    在 javax.swing.RepaintManager$PaintManager.paint(RepaintManager.java:1413)
    在 javax.swing.RepaintManager.paint(RepaintManager.java:1206)
    在 javax.swing.JComponent.paintForceDoubleBuffered(JComponent.java:1090)
    在 javax.swing.JViewport.blitDoubleBuffered(JViewport.java:1598)
    在 javax.swing.JViewport.windowBlitPaint(JViewport.java:1559)
    在 javax.swing.JViewport.setViewPosition(JViewport.java:1102)
    在 javax.swing.plaf.basic.BasicScrollPaneUI$Handler.hsbStateChanged(BasicScrollPaneUI.java:1087)
    在 javax.swing.plaf.basic.BasicScrollPaneUI$Handler.stateChanged(BasicScrollPaneUI.java:1038)
    在 javax.swing.DefaultBoundedRangeModel.fireStateChanged(DefaultBoundedRangeModel.java:364)
    在 javax.swing.DefaultBoundedRangeModel.setRangeProperties(DefaultBoundedRangeModel.java:302)
    在 javax.swing.DefaultBoundedRangeModel.setValue(DefaultBoundedRangeModel.java:168)
    在 javax.swing.JScrollBar.setValue(JScrollBar.java:463)
    在 javax.swing.plaf.basic.BasicScrollBarUI$TrackListener.setValueFrom(BasicScrollBarUI.java:1253)
    在 javax.swing.plaf.basic.BasicScrollBarUI$TrackListener.mouseDragged(BasicScrollBarUI.java:1195)
    在 java.awt.Component.processMouseMotionEvent(Component.java:6553)
    在 javax.swing.JComponent.processMouseMotionEvent(JComponent.java:3339)
    在 java.awt.Component.processEvent(Component.java:6274)
    在 java.awt.Container.processEvent(Container.java:2229)
    在 java.awt.Component.dispatchEventImpl(Component.java:4861)
    在 java.awt.Container.dispatchEventImpl(Container.java:2287)
    在 java.awt.Component.dispatchEvent(Component.java:4687)
    在 java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4832)
    在 java.awt.LightweightDispatcher.processMouseEvent(Container.java:4509)
    在 java.awt.LightweightDispatcher.dispatchEvent(Container.java:4422)
    在 java.awt.Container.dispatchEventImpl(Container.java:2273)
    在 java.awt.Window.dispatchEventImpl(Window.java:2719)
    在 java.awt.Component.dispatchEvent(Component.java:4687)
    在 java.awt.EventQueue.dispatchEventImpl(EventQueue.java:703)
    在 java.awt.EventQueue.access$000(EventQueue.java:102)
    在 java.awt.EventQueue$3.run(EventQueue.java:662)
    在 java.awt.EventQueue$3.run(EventQueue.java:660)
    在 java.security.AccessController.doPrivileged(本机方法)
    在 java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
    在 java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:87)
    在 java.awt.EventQueue$4.run(EventQueue.java:676)
    在 java.awt.EventQueue$4.run(EventQueue.java:674)
    在 java.security.AccessController.doPrivileged(本机方法)
    在 java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
    在 java.awt.EventQueue.dispatchEvent(EventQueue.java:673)
    在 java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:244)
    在 java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:163)
    在 java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:151)
    在 java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:147)
    在 java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:139)
    在 java.awt.EventDispatchThread.run(EventDispatchThread.java:97)
线程“AWT-EventQueue-0”中的异常 java.lang.ArrayIndexOutOfBoundsException:14
    在 javax.swing.JTable$1.getValueAt(JTable.java:689)
    在 javax.swing.JTable.getValueAt(JTable.java:2720)
    在 javax.swing.JTable.prepareRenderer(JTable.java:5718)
    在 javax.swing.plaf.synth.SynthTableUI.paintCell(SynthTableUI.java:684)
    在 javax.swing.plaf.synth.SynthTableUI.paintCells(SynthTableUI.java:581)
    在 javax.swing.plaf.synth.SynthTableUI.paint(SynthTableUI.java:365)
    在 javax.swing.plaf.synth.SynthTableUI.update(SynthTableUI.java:276)
    在 javax.swing.JComponent.paintComponent(JComponent.java:778)
    在 javax.swing.JComponent.paint(JComponent.java:1054)
    在 javax.swing.JComponent.paintChildren(JComponent.java:887)
    在 javax.swing.JComponent.paint(JComponent.java:1063)
    在 javax.swing.JViewport.paint(JViewport.java:731)
    在 javax.swing.JComponent.paintChildren(JComponent.java:887)
    在 javax.swing.JComponent.paint(JComponent.java:1063)
    在 javax.swing.JComponent.paintChildren(JComponent.java:887)
    在 javax.swing.JComponent.paint(JComponent.java:1063)
    在 javax.swing.JComponent.paintToOffscreen(JComponent.java:5221)
    在 javax.swing.RepaintManager$PaintManager.paintDoubleBuffered(RepaintManager.java:1482)
    在 javax.swing.RepaintManager$PaintManager.paint(RepaintManager.java:1413)
    在 javax.swing.RepaintManager.paint(RepaintManager.java:1206)
    在 javax.swing.JComponent._paintImmediately(JComponent.java:5169)
    在 javax.swing.JComponent.paintImmediately(JComponent.java:4980)
    在 javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:770)
    在 javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:728)
    在 javax.swing.RepaintManager.prePaintDirtyRegions(RepaintManager.java:677)
    在 javax.swing.RepaintManager.access$700(RepaintManager.java:59)
    在 javax.swing.RepaintManager$ProcessingRunnable.run(RepaintManager.java:1621)
    在 java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:251)
    在 java.awt.EventQueue.dispatchEventImpl(EventQueue.java:701)
    在 java.awt.EventQueue.access$000(EventQueue.java:102)
    在 java.awt.EventQueue$3.run(EventQueue.java:662)
    在 java.awt.EventQueue$3.run(EventQueue.java:660)
    在 java.security.AccessController.doPrivileged(本机方法)
    在 java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
    在 java.awt.EventQueue.dispatchEvent(EventQueue.java:671)
    在 java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:244)
    在 java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:163)
    在 java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:151)
    在 java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:147)
    在 java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:139)
    在 java.awt.EventDispatchThread.run(EventDispatchThread.java:97)
线程“AWT-EventQueue-0”中的异常 java.lang.ArrayIndexOutOfBoundsException:14
    在 javax.swing.JTable$1.getValueAt(JTable.java:689)
    在 javax.swing.JTable.getValueAt(JTable.java:2720)
    在 javax.swing.JTable.prepareRenderer(JTable.java:5718)
    在 javax.swing.plaf.synth.SynthTableUI.paintCell(SynthTableUI.java:684)
    在 javax.swing.plaf.synth.SynthTableUI.paintCells(SynthTableUI.java:581)
    在 javax.swing.plaf.synth.SynthTableUI.paint(SynthTableUI.java:365)
    在 javax.swing.plaf.synth.SynthTableUI.update(SynthTableUI.java:276)
    在 javax.swing.JComponent.paintComponent(JComponent.java:778)
    在 javax.swing.JComponent.paint(JComponent.java:1054)
    在 javax.swing.JComponent.paintToOffscreen(JComponent.java:5221)
    在 javax.swing.RepaintManager$PaintManager.paintDoubleBuffered(RepaintManager.java:1482)
    在 javax.swing.RepaintManager$PaintManager.paint(RepaintManager.java:1413)
    在 javax.swing.RepaintManager.paint(RepaintManager.java:1206)
    在 javax.swing.JComponent.paintForceDoubleBuffered(JComponent.java:1090)
    在 javax.swing.JViewport.blitDoubleBuffered(JViewport.java:1598)
    在 javax.swing.JViewport.windowBlitPaint(JViewport.java:1559)
    在 javax.swing.JViewport.setViewPosition(JViewport.java:1102)
    在 javax.swing.plaf.basic.BasicScrollPaneUI$Handler.hsbStateChanged(BasicScrollPaneUI.java:1087)
    在 javax.swing.plaf.basic.BasicScrollPaneUI$Handler.stateChanged(BasicScrollPaneUI.java:1038)
    在 javax.swing.DefaultBoundedRangeModel.fireStateChanged(DefaultBoundedRangeModel.java:364)
    在 javax.swing.DefaultBoundedRangeModel.setRangeProperties(DefaultBoundedRangeModel.java:302)
    在 javax.swing.DefaultBoundedRangeModel.setValue(DefaultBoundedRangeModel.java:168)
    在 javax.swing.JScrollBar.setValue(JScrollBar.java:463)
    在 javax.swing.plaf.basic.BasicScrollBarUI$TrackListener.setValueFrom(BasicScrollBarUI.java:1253)
    在 javax.swing.plaf.basic.BasicScrollBarUI$TrackListener.mouseDragged(BasicScrollBarUI.java:1195)
    在 java.awt.Component.processMouseMotionEvent(Component.java:6553)
    在 javax.swing.JComponent.processMouseMotionEvent(JComponent.java:3339)
    在 java.awt.Component.processEvent(Component.java:6274)
    在 java.awt.Container.processEvent(Container.java:2229)
    在 java.awt.Component.dispatchEventImpl(Component.java:4861)
    在 java.awt.Container.dispatchEventImpl(Container.java:2287)
    在 java.awt.Component.dispatchEvent(Component.java:4687)
    在 java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4832)
    在 java.awt.LightweightDispatcher.processMouseEvent(Container.java:4509)
    在 java.awt.LightweightDispatcher.dispatchEvent(Container.java:4422)
    在 java.awt.Container.dispatchEventImpl(Container.java:2273)
    在 java.awt.Window.dispatchEventImpl(Window.java:2719)
    在 java.awt.Component.dispatchEvent(Component.java:4687)
    在 java.awt.EventQueue.dispatchEventImpl(EventQueue.java:703)
    在 java.awt.EventQueue.access$000(EventQueue.java:102)
    在 java.awt.EventQueue$3.run(EventQueue.java:662)
    在 java.awt.EventQueue$3.run(EventQueue.java:660)
    在 java.security.AccessController.doPrivileged(本机方法)
    在 java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
    在 java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:87)
    在 java.awt.EventQueue$4.run(EventQueue.java:676)
    在 java.awt.EventQueue$4.run(EventQueue.java:674)
    在 java.security.AccessController.doPrivileged(本机方法)
    在 java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
    在 java.awt.EventQueue.dispatchEvent(EventQueue.java:673)
    在 java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:244)
    在 java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:163)
    在 java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:151)
    在 java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:147)
    在 java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:139)
    在 java.awt.EventDispatchThread.run(EventDispatchThread.java:97)

为什么会这样?这个问题有什么解决办法吗?谢谢!

非常抱歉!这是用于初始化表格的代码。希望它有用!

jp.setLayout(new BorderLayout());
    JTable jt = new JTable(data, column);// data and columns are just 2D and 1D String arrays each
    JTableHeader th = jt.getTableHeader();
    th.setBackground(java.awt.Color.pink);
    th.setEnabled(true);
    jt.setTableHeader(th);
    jt.setEnabled(false);
    jp.add(jt, BorderLayout.CENTER);
    JScrollPane scrollPane = new JScrollPane(jt, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
    jt.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
    scrollPane.setEnabled(false);
    jp.add(scrollPane, BorderLayout.CENTER);
4

2 回答 2

5

我认为您声明的列数比数据数组中的多。

此代码示例完全重现了您的问题:

import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.SwingUtilities;

public class TestTable {

    public JFrame f;
    private JTable table;

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() {
                new TestTable().initUI();
            }
        });
    }

    protected void initUI() {
        String[][] data = new String[1][1];
        data[0] = new String[] { "hello" };
        String[] columns = new String[] { "Column-1", "Column-2" };
        table = new JTable(data, columns);
        f = new JFrame();
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setSize(300, 300);
        f.setLocationRelativeTo(null);
        f.add(new JScrollPane(table));
        f.setVisible(true);
    }

}

解决方案当然是使数据中的列数与您声明的列数相匹配。并且您应该确保数据数组的每一“行”都使用正确数量的“列”进行初始化。

例如你可以有这个:

String[][] data = new String[1][18];
data[0] = new String[15]; // <-- This will cause some problems

现在,我建议使用数组以外的其他数据结构,因为它不是很灵活,而且它们往往难以维护。一个简单的解决方案是拥有一些“模型”类并创建自己的 TableModel,如下所示:

import java.util.List;
import java.util.Random;
import java.util.Vector;

import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.SwingUtilities;
import javax.swing.table.AbstractTableModel;

public class TestTable {

    public JFrame f;
    private JTable table;

    public class ModelObject {
        private String column0; // Consider using something more explicit than column0,1,...
        private String column1;

        public String getColumn0() {
            return column0;
        }

        public void setColumn0(String column0) {
            this.column0 = column0;
        }

        public String getColumn1() {
            return column1;
        }

        public void setColumn1(String column1) {
            this.column1 = column1;
        }
    }

    private class TableModel extends AbstractTableModel {

        private List<ModelObject> data;

        protected TableModel(List<ModelObject> data) {
            super();
            this.data = data;
        }

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

        @Override
        public String getColumnName(int column) {
            switch (column) {
            case 0:
                return "Header 0";
            case 1:
                return "Header 1";
            }
            System.err.println("Only two columns are known in this table model");
            return "???";
        }

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

        @Override
        public Object getValueAt(int rowIndex, int columnIndex) {
            ModelObject o = data.get(rowIndex);
            switch (columnIndex) {
            case 0:
                return o.getColumn0();
            case 1:
                return o.getColumn1();
            }
            System.err.println("Only two columns are known in this table model");
            return null;
        }

    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() {
                new TestTable().initUI();
            }
        });
    }

    protected void initUI() {
        Random r = new Random();
        Vector<ModelObject> data = new Vector<TestTable.ModelObject>();
        for (int i = 0; i < 10; i++) {
            ModelObject o = new ModelObject();
            o.setColumn0("Some stuff in column 0 " + i);
            o.setColumn1("Some other stuff in column 1 " + r.nextInt());
            data.add(o);
        }
        table = new JTable(new TableModel(data));
        f = new JFrame();
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setSize(300, 300);
        f.setLocationRelativeTo(null);
        f.add(new JScrollPane(table));
        f.setVisible(true);
    }

}

这里所有的东西都写在一个类中,但当然你应该将它们分开以正确遵循 MVC 模式。

于 2012-05-24T07:52:00.853 回答
1

答案在这一行:

线程“AWT-EventQueue-0”中的异常 java.lang.ArrayIndexOutOfBoundsException: 14 at

这意味着它知道它应该有更多的列,并且它想绘制下一列,但不能因为底层表模型没有那么多列。

为表提供 18 列意味着您还需要更新关联的表模型。两者都需要同步才能使表格正常工作。

于 2012-05-24T06:22:33.143 回答