bug(s) in JTabbedPane or in JTable or in "basicUIlayout"?

Okay i tried following code, and all is correct:

package genv;//comment this out before you run this application

import java.awt.BorderLayout;

import java.awt.Container;

import java.io.FileNotFoundException;

import java.io.FileOutputStream;

import java.io.IOException;

import java.io.ObjectOutputStream;

import java.io.OutputStream;

import javax.swing.JFrame;

import javax.swing.JScrollPane;

import javax.swing.JTable;

import javax.swing.JPanel;

//import peathal.gui.JTabbedPane;

import javax.swing.JTabbedPane;

public class JavaProblem extends JFrame

{static public void main(String arg[]){ new JavaProblem(); }

public JavaProblem() { setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); javaProblem1(); }

public void javaProblem1()

{

Container cp = getContentPane();

cp.setLayout(new BorderLayout());

String data[][] = {{"1","2","3"},{"2","3","4"}};

String names[]={"test0","test1","test2"};

JTable table = new JTable(data,names);

JScrollPane scroll = new JScrollPane(table);

JPanel panel = new JPanel();

panel.setLayout(new BorderLayout());

panel.add(scroll, BorderLayout.CENTER);

JTabbedPane jt = new JTabbedPane();

jt.addTab("tab1", panel);

//jt.addTab("tab2", table);//1

cp.add(jt, BorderLayout.CENTER);

setSize(200,300);

setVisible(true);

//setVisible(false);//3

try

{OutputStream out = new FileOutputStream("testJavaProblem.dat");

ObjectOutputStream oout = new ObjectOutputStream(out);

//oout.writeObject(table);//2

oout.close();

}

catch(FileNotFoundException exc){}

catch(IOException exc){}

//setVisible(true);//3

}

}

A little problem we will get, if we comment out "No. 1" jt.addTab("tab2", table);

then we get table without headers! This is not very important here!

BUT i want to solve the following problem:

Now if we comment out "No.2" we get following exception:

java.lang.NullPointerException

at javax.swing.plaf.basic.BasicTableUI.getPreferredSize(BasicTableUI.java:908)

at javax.swing.JComponent.getPreferredSize(JComponent.java:1275)

at javax.swing.JTable.setWidthsFromPreferredWidths(JTable.java:2237)

at javax.swing.JTable.doLayout(JTable.java:2176)

at java.awt.Container.validateTree(Container.java:1092)

at java.awt.Container.validateTree(Container.java:1099)

at java.awt.Container.validate(Container.java:1067)

at javax.swing.plaf.basic.BasicTabbedPaneUI.ensureCurrentLayout(BasicTabbedPaneUI.java:1145)

at javax.swing.plaf.basic.BasicTabbedPaneUI.paint(BasicTabbedPaneUI.java:490)

at javax.swing.plaf.metal.MetalTabbedPaneUI.paint(MetalTabbedPaneUI.java:666)

at javax.swing.plaf.metal.MetalTabbedPaneUI.update(MetalTabbedPaneUI.java:561)

at javax.swing.JComponent.paintComponent(JComponent.java:541)

at javax.swing.JComponent.paint(JComponent.java:808)

at javax.swing.JComponent.paintChildren(JComponent.java:647)

at javax.swing.JComponent.paint(JComponent.java:817)

at javax.swing.JComponent.paintWithOffscreenBuffer(JComponent.java:4787)

at javax.swing.JComponent.paintDoubleBuffered(JComponent.java:4740)

at javax.swing.JComponent._paintImmediately(JComponent.java:4685)

at javax.swing.JComponent.paintImmediately(JComponent.java:4488)

at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:410)

at javax.swing.SystemEventQueueUtilities$ComponentWorkRequest.run(SystemEventQueueUtilities.java:117)

at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:178)

at java.awt.EventQueue.dispatchEvent(EventQueue.java:454)

at java.awt.EventDispatchThread.pumpOneEventForHierarchy(EventDispatchThread.java:201)

at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:151)

at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:145)

at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:137)

at java.awt.EventDispatchThread.run(EventDispatchThread.java:100)

And if we comment out "No.3" we won't get an exception!

I think the serialisation of table won't happend in the correct manner, will it delete some variables of table?

Rewriting of class JTabbedPane or serialisation of table.getModel() instead of "whole" table

will change this special problem, but in my application the problem still exists?

In my application: if I overload the private writeObject for a panel which hold the JTable indirectly as variable,

i will get an exception before this private writeObject method will called:

java.lang.NullPointerException

at javax.swing.plaf.basic.BasicScrollPaneUI.paint(BasicScrollPaneUI.java:76)

at javax.swing.plaf.ComponentUI.update(ComponentUI.java:142)

at javax.swing.JComponent.paintComponent(JComponent.java:541)

at javax.swing.JComponent.paint(JComponent.java:808)

at javax.swing.JComponent.paintWithOffscreenBuffer(JComponent.java:4787)

at javax.swing.JComponent.paintDoubleBuffered(JComponent.java:4740)

at javax.swing.JComponent._paintImmediately(JComponent.java:4685)

at javax.swing.JComponent.paintImmediately(JComponent.java:4488)

at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:410)

at javax.swing.SystemEventQueueUtilities$ComponentWorkRequest.run(SystemEventQueueUtilities.java:117)

at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:178)

at java.awt.EventQueue.dispatchEvent(EventQueue.java:454)

at java.awt.EventDispatchThread.pumpOneEventForHierarchy(EventDispatchThread.java:201)

at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:151)

at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:145)

at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:137)

at java.awt.EventDispatchThread.run(EventDispatchThread.java:100)

But this exception will only occur if we embedded the jtable in a scrollpane and add this to jpanel.

It wont occur if we directly add jtable to panel

You see much things and i have no idea, how to solve serialising of jTable embedded in a scrollPane.

Please help me, what is wrong here?

[6467 byte] By [peterkaricha] at [2007-10-2 6:21:46]
# 1

use code tags [ code][ /code]

as you will see now, your code becomes more readable.

package genv;//comment this out before you run this application

import java.awt.BorderLayout;

import java.awt.Container;

import java.io.FileNotFoundException;

import java.io.FileOutputStream;

import java.io.IOException;

import java.io.ObjectOutputStream;

import java.io.OutputStream;

import javax.swing.JFrame;

import javax.swing.JScrollPane;

import javax.swing.JTable;

import javax.swing.JPanel;

//import peathal.gui.JTabbedPane;

import javax.swing.JTabbedPane;

public class JavaProblem extends JFrame

{ static public void main(String arg[]){ new JavaProblem(); }

public JavaProblem() { setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); javaProblem1(); }

public void javaProblem1()

{

Container cp = getContentPane();

cp.setLayout(new BorderLayout());

String data[][] = {{"1","2","3"},{"2","3","4"}};

String names[]={"test0","test1","test2"};

JTable table = new JTable(data,names);

JScrollPane scroll = new JScrollPane(table);

JPanel panel = new JPanel();

panel.setLayout(new BorderLayout());

panel.add(scroll, BorderLayout.CENTER);

JTabbedPane jt = new JTabbedPane();

jt.addTab("tab1", panel);

//jt.addTab("tab2", table);//1

cp.add(jt, BorderLayout.CENTER);

setSize(200,300);

setVisible(true);

//setVisible(false);//3

try

{ OutputStream out = new FileOutputStream("testJavaProblem.dat");

ObjectOutputStream oout = new ObjectOutputStream(out);

//oout.writeObject(table);//2

oout.close();

}

catch(FileNotFoundException exc){}

catch(IOException exc){}

//setVisible(true);//3

}

}

sim085a at 2007-7-16 13:23:35 > top of Java-index,Desktop,Core GUI APIs...