Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Problems with JTable and JScrollpane size

Tags:

java

swing

jtable

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

like image 757
Wolfgang Adamec Avatar asked Jan 28 '26 22:01

Wolfgang Adamec


1 Answers

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.

like image 188
camickr Avatar answered Jan 30 '26 11:01

camickr



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!