-
Bug
-
Resolution: Duplicate
-
P2
-
None
-
1.4.0
-
x86
-
windows_2000
Name: jl125535 Date: 11/19/2001
java version "1.4.0-beta3"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.4.0-beta3-b84)
Java HotSpot(TM) Client VM (build 1.4.0-beta3-b84, mixed mode)
This behavior occurs on both Windows 2000 and Solaris 8 with both
JDK 1.3.1 and JDK 1.4 beta 3.
Bug In JScrollBar
While working with JScrollBar, we traced a bug -
BUG
We are sending a test case alongwith this bug report. Deserialization of this
testBean results in an infinite loop from JScrollBar.java getMinimumSize()
method.
REASON
while calculating JScrollBar's preferred size on deserialization,
Component.java class's getPreferredSize() method calls its getMinimumSize()
method, and this method again calls its super class's (Component.java)
getPreferredSize() method, hence resulting in an infinite loop.
PROBLEM AREA
This call for getPreferredSize() of JScrollbar is from line number 522 of
ScrollPaneLayout.java class while deserialization.
Stack Trace
Exception occurred during event dispatching:java.lang.StackOverflowError at
javax.swing.JScrollBar.getMinimumSize(JScrollBar.java:651) at
java.awt.Component.preferredSize(Component.java:1685) at
java.awt.Container.preferredSize(Container.java:833) at
java.awt.Container.getPreferredSize(Container.java:817) at
javax.swing.JComponent.getPreferredSize(JComponent.java:992) at
javax.swing.JScrollBar.getMinimumSize(JScrollBar.java:651) at
java.awt.Component.preferredSize(Component.java:1685) at
java.awt.Container.preferredSize(Container.java:833) at
java.awt.Container.getPreferredSize(Container.java:817) at
javax.swing.JComponent.getPreferredSize(JComponent.java:992) at
javax.swing.JScrollBar.getMinimumSize(JScrollBar.java:651) at
java.awt.Component.preferredSize(Component.java:1685) at
java.awt.Container.preferredSize(Container.java:833) at
java.awt.Container.getPreferredSize(Container.java:817) at
javax.swing.JComponent.getPreferredSize(JComponent.java:992) at
javax.swing.JScrollBar.getMinimumSize(JScrollBar.java:651)
at java.awt.Component.preferredSize(Component.java:1685)
at java.awt.Container.preferredSize(Container.java:833)
at java.awt.Container.getPreferredSize(Container.java:817)
at javax.swing.JComponent.getPreferredSize
(JComponent.java:992) at javax.swing.JScrollBar.getMinimumSize
(JScrollBar.java:651) at java.awt.Component.preferredSize
(Component.java:1685) at java.awt.Container.preferredSize
(Container.java:833) at java.awt.Container.getPreferredSize
(Container.java:817) at
javax.swing.JComponent.getPreferredSize(JComponent.java:992) at
javax.swing.JScrollBar.getMinimumSize(JScrollBar.java:651)
at java.awt.Component.preferredSize(Component.java:1685)
at java.awt.Container.preferredSize(Container.java:833)
at java.awt.Container.getPreferredSize(Container.java:817)
at javax.swing.JComponent.getPreferredSize
(JComponent.java:992) at javax.swing.JScrollBar.getMinimumSize
(JScrollBar.java:651)
and so on ........
Steps for running program
1. Run the program.
2. Press "Save Bean" button to serialize the test bean, this action will
remove the bean from frame after saving it.
3. Press "Load Bean" button to deserialize the test bean, you will get
above stack trace.
// TEST PROGRAM
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.io.*;
public class JScrollBarBug {
private JPanel panel;
private JButton saveButton;
private JButton loadButton;
private JFrame frame;
private Component compToAdd = null;
public JScrollBarBug() {
frame = new JFrame();
frame.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent we){
System.exit(0);
}
});
panel = new JPanel();
saveButton = new JButton("Save Bean");
loadButton = new JButton("Load Bean");
panel.add(saveButton);
panel.add(loadButton);
compToAdd = initialize();
frame.getContentPane().add(compToAdd);
frame.getContentPane().add(panel, BorderLayout.SOUTH);
saveButton.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
if(compToAdd != null){
saveBean(compToAdd);
frame.remove(compToAdd);
frame.repaint();
}
}
});
loadButton.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
try{
compToAdd = (Component)loadBean();
}catch(Exception ex){ex.printStackTrace();}
if(compToAdd != null){
frame.getContentPane().add(compToAdd);
}
}
});
frame.setSize(650,400);
frame.setVisible(true);
}
public static void main(String[] args){
JScrollBarBug jScrollBarBug = new JScrollBarBug();
}
private Object loadBean() throws Exception {
FileInputStream fis = null;
ObjectInputStream ois = null;
try{
fis = new FileInputStream("./JScrollBarBug");
ois = new ObjectInputStream(fis);
return ois.readObject();
}
catch(Exception ex){
ex.printStackTrace();
return null;
}
finally{
ois.close();
fis.close();
}
}
private void saveBean(Object obj){
try{
FileOutputStream fos = new FileOutputStream
("./JScrollBarBug");
//("c:/JScrollBarBug");
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(obj);
oos.flush();
fos.flush();
oos.close();
fos.close();
}
catch(Exception ex){
ex.printStackTrace();
}
}
private Component initialize(){
JTable tableLeft = new JTable(50,100);
JTable tableRight = new JTable(50,100);
JSplitPane splitPane = new JSplitPane();
JScrollPane jspLeft = new JScrollPane(tableLeft);
JScrollPane jspRight = new JScrollPane(tableRight);
splitPane.setLeftComponent(jspLeft);
splitPane.setRightComponent(jspRight);
return splitPane;
}
}
(Review ID: 135420)
======================================================================
- duplicates
-
JDK-4430294 JSplitPane: Divider too big
-
- Closed
-