JTable in JScrollPane Problem

Ok, I have been banging my head aginst the wall with this problem for the past few hours and I'm running out ot advil.

Everything time I put a JTable inside a JScrollPane and display the frame I get an ArrayIndexOutOfBoundsException like so.

Thread [AWT-EventQueue-0] (Suspended (exception ArrayIndexOutOfBoundsException))

JViewport(Container).getComponent(int) line: not available

JViewport.getView() line: not available

.......

.......

But the only time this happens is when my program is running in Debug mode. If I run it in non-debug mode the code runs fine. I'm beginning to think its a bug with Java. I'm running version 1.4.2_03-b02. I could show you my code but I can actually duplicate the issue by running Sun's SimpleTableDemo.java example. The code is below stright from the examples page.

Any ideas?

/*

* SimpleTableDemo.java is a 1.4 application that requires no other files.

*/

import javax.swing.JFrame;

import javax.swing.JPanel;

import javax.swing.JScrollPane;

import javax.swing.JTable;

import java.awt.Dimension;

import java.awt.GridLayout;

import java.awt.event.MouseAdapter;

import java.awt.event.MouseEvent;

public class SimpleTableDemo extends JPanel {

private boolean DEBUG = false;

public SimpleTableDemo() {

super(new GridLayout(1,0));

String[] columnNames = {"First Name",

"Last Name",

"Sport",

"# of Years",

"Vegetarian"};

Object[][] data = {

{"Mary", "Campione",

"Snowboarding", new Integer(5), new Boolean(false)},

{"Alison", "Huml",

"Rowing", new Integer(3), new Boolean(true)},

{"Kathy", "Walrath",

"Knitting", new Integer(2), new Boolean(false)},

{"Sharon", "Zakhour",

"Speed reading", new Integer(20), new Boolean(true)},

{"Philip", "Milne",

"Pool", new Integer(10), new Boolean(false)}

};

final JTable table = new JTable(data, columnNames);

table.setPreferredScrollableViewportSize(new Dimension(500, 70));

if (DEBUG) {

table.addMouseListener(new MouseAdapter() {

public void mouseClicked(MouseEvent e) {

printDebugData(table);

}

});

}

//Create the scroll pane and add the table to it.

JScrollPane scrollPane = new JScrollPane(table);

//Add the scroll pane to this panel.

add(scrollPane);

}

private void printDebugData(JTable table) {

int numRows = table.getRowCount();

int numCols = table.getColumnCount();

javax.swing.table.TableModel model = table.getModel();

System.out.println("Value of data: ");

for (int i=0; i < numRows; i++) {

System.out.print("row " + i + ":");

for (int j=0; j < numCols; j++) {

System.out.print(" " + model.getValueAt(i, j));

}

System.out.println();

}

System.out.println("--");

}

/**

* Create the GUI and show it. For thread safety,

* this method should be invoked from the

* event-dispatching thread.

*/

private static void createAndShowGUI() {

//Make sure we have nice window decorations.

JFrame.setDefaultLookAndFeelDecorated(true);

//Create and set up the window.

JFrame frame = new JFrame("SimpleTableDemo");

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

//Create and set up the content pane.

SimpleTableDemo newContentPane = new SimpleTableDemo();

newContentPane.setOpaque(true); //content panes must be opaque

frame.setContentPane(newContentPane);

//Display the window.

frame.pack();

frame.setVisible(true);

}

public static void main(String[] args) {

//Schedule a job for the event-dispatching thread:

//creating and showing this application's GUI.

javax.swing.SwingUtilities.invokeLater(new Runnable() {

public void run() {

createAndShowGUI();

}

});

}

}

[4058 byte] By [rstolle] at [2007-9-30 3:54:30]
# 1

I had the same problem and I searched also a few hours. But the problem was, that the debugger

stopped at a caught(!) ArrayIndexOutOfBoundsException. So, its not a bug:

While initialization a new viewport object is set as column header for the scrollpane. This causes the

call of the updateColumnHeader method in the scrollpane ui object, which calls the getViewPosition

method of the viewport object. Because the viewport object is new and has no child already,

getComponent(0) throws an ArrayIndexOutOfBoundsException, which is caught by getView() (and

unfortunally by my debugger ;-) ).

Here is the relevant code from JViewport:

public Point getViewPosition() {

Component view = getView();

if (view != null) {

Point p = view.getLocation();

p.x = -p.x;

p.y = -p.y;

return p;

}

else {

return new Point(0,0);

}

}

/**

* Returns the <code>JViewport</code>'s one child or <code>null</code>.

*

* @return the viewports child, or <code>null</code> if none exists

*

* @see #setView

*/

public Component getView() {

try {

return getComponent(0);

} catch (ArrayIndexOutOfBoundsException e) {

return null;

}

}

/**

* Gets the nth component in this container.

* @paramnthe index of the component to get.

* @returnthe n<sup>th</sup> component in this container.

* @exception ArrayIndexOutOfBoundsException

*if the n<sup>th</sup> value does not exist.

*/

public Component getComponent(int n) {

synchronized (getTreeLock()) {

if ((n < 0) || (n >= ncomponents)) {

throw new ArrayIndexOutOfBoundsException("No such child: " + n);

}

return component[n];

}

}

dirkeiden at 2007-6-29 17:17:55 > top of Java-index,Archived Forums,Socket Programming...