【问题标题】:JTable tearing when rendering渲染时 JTable 撕裂
【发布时间】:2012-05-24 06:15:31
【问题描述】:

我已经设置了一个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);

【问题讨论】:

  • 您的代码显然有问题。您看到的堆栈跟踪可能是您的问题的原因。发布一些重现问题的代码。

标签: java swing jtable


【解决方案1】:

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

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

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 模式。

【讨论】:

  • 这解决了我的问题!我真傻……我声明的列号比实际的列号短。
【解决方案2】:

答案在这一行:

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

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

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

【讨论】:

  • 嗯,但我使用的表格模型是默认表格模型...我没有为它设置任何表格模型。如何更新表模型?感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 2012-09-09
  • 2011-04-21
  • 2018-07-29
  • 1970-01-01
  • 2011-04-04
  • 2012-06-15
  • 2011-04-09
  • 1970-01-01
相关资源
最近更新 更多