2012-05-24 75 views
2

我已經設置了JTable,並使其包含18列。最初,當它是13列,它很好地適合JTable,並沒有撕裂。但是,一旦我使它包含18個表並將自動調整大小設置爲關閉,當我使用水平滾動條嘗試滾動其他列時,開始發生JTable的撕裂,如此圖所示:JTable在呈現時撕裂

table image http://oi46.tinypic.com/2uzupg0.jpg

Netbeans的也開始給我許多錯誤信息像這樣的:

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

你的代碼顯然有些問題。你看到的堆棧跟蹤可能是你問題的原因。發佈一些重現問題的代碼。 –

+0

在一些代碼中添加! – Laughy

回答

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

+0

這解決了我的問題!我太傻了...我宣佈列號比實際列號短。 – Laughy

1

答案是在這一行:

異常在線程 「AWT-EventQueue的 - 0」 java.lang.ArrayIndexOutOfBoundsException:14在

這意味着它知道它應該有更多的列,並且它想繪製下一列,但是不能,因爲底層表模型沒有那麼多的列。

給予表18列意味着您還需要更新關聯的表模型。兩者都需要同步才能工作。

+0

嗯,但我使用的表模型是默認的表模型...我沒有爲它設置任何表模型。我如何更新表格模型?謝謝你的幫助! – Laughy

+0

我看到問題已經解決 - 偉大的東西! – Ewald