I have a JScrollPane with a JTable in it. In the JTable I have initially 3 rows. Later on rows get added.
The default JTable with my 3 rows is ugly because JScrollPane calls getPreferredScrollableViewportSize from the client (JTable) and the return value is always the same. That's why my JTable/JScrollpane with 3 rows has this free space, JScrollpane andJTable do not have the same size.
My solution is to make a subclass JTable, override getPreferredScrollableViewportSize and return in this function getPreferredSize();. Now the whole JScrollPane has exactly the size of the 3 row `JTable!
When a row gets added I have the command ((JComponent) scrollPane.getParent()).revalidate();
The scrollpane grows with the table.
Everything works fine!
But now I want to set a certain layout for the container of the scrollpane (panel):
myjpanel.setLayout (new BoxLayout(contentPane, BoxLayout.Y_AXIS));
When I add this command my whole solution doesn't work anymore. The scrollpane hasn't the size of the 3 row table, this free space is there again.
Why is this?
Does anybody have a solution?
CONTINUED
Thank you camickr for pointing me in the right direction. My solution is the following:
scrollPane = new JScrollPane (table) {
public Dimension getMaximumSize () {
double height = 0;
double width = super.getMaximumSize().getWidth();
height += columnHeader.getViewSize().getHeight();
height += viewport.getView().getPreferredSize().getHeight();
height += (getViewportBorderBounds().getHeight() * -1);
Dimension returnValue = new Dimension ((int) width, (int) height);
return returnValue;
}
};
It works now at the beginning. But when a row is added to the jtable and I call revalidate(); on the jpanel (parent container of the scrollpanel) the jscrollpanel shrinks in height to 1 row + header! Has anyone got an idea what is to do in this situation.
CONTINUED
Now I know the problem. It is the viewportBorder. In order to get the whole, exact height I have to total the height of the view (Jtable), the height of the column header and the height of the viewportBorder. The first time getViewportBorderBounds().getHeight() returns -3, next time - after a new row is inserted in the table model - the function returns 48. I do not understand why this function returns 48 now.
Another point is that camickr says that changing the size of the jscrollpane defeats the purpose of the scrollpane. I do not understand this. How can anyone be satisfied with a default jscrollpane size of 450 x 400 (http://www.javalobby.org/java/forums/t19559.html) even when the jtable has only 3 lines at the beginning. This unfilled extra space does not look very professional in my eyes. Has anyone got a better solution for this.
Thank you very much for your answers
CONTINUED
Now everything works!
At the beginning I simply set the jscrollpane border to 0 ... sp.setBorder(createEmptyBorder());
In this way I avoid having these strange return values of getViewportBorderBounds().getHeight()
Wolfgang
The BoxLayout allows the component to grow up to the maximum size of the component. I guess you need to override the getMaximumSize() of the scrollpane to return the preferred size.
When a row gets added I have the command "((JComponent) scrollPane.getParent()).revalidate();" The scrollpane grows with the jtable.
That kind of defeats the purpose of the scrollpane. The scrollbar is supposed to stay at a fixed size and then scrollbars will appear if necessary.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With