From: Robbo on
Hello,

I would like to have horizontal JSplitPane with two panels,
where one of them (bottom) should have always the same
height when we use only one touch expandables
(we assume, user doesn't use dragging of divider).
It is sample code:

import javax.swing.*;
import java.awt.*;


public class Swing5 {
public static void main(String[] args) {
new Swing5();
}

class MyPanel extends JPanel {
public void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D gDC2 = (Graphics2D)g;
gDC2.drawRect(0,0, 298,48);
gDC2.drawLine(0,0, 298,48);
}
}

public Swing5() {
JFrame f = new JFrame("Swing...");
f.setSize(300, 100);
Container c = f.getContentPane();
c.setLayout(new BorderLayout());
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

MyPanel p1 = new MyPanel();
p1.setPreferredSize(new Dimension(300, 100));

MyPanel p2 = new MyPanel();
p2.setMinimumSize(new Dimension(0, 50));
p2.setMaximumSize(new Dimension(0, 50));
p2.setPreferredSize(new Dimension(300, 50));

JSplitPane sp1 = new JSplitPane();
sp1.setTopComponent(p1);
sp1.setBottomComponent(p2);
sp1.setDividerSize(15);
sp1.setOrientation(javax.swing.JSplitPane.VERTICAL_SPLIT);
sp1.setResizeWeight(1.0);
sp1.setOneTouchExpandable(true);

c.add(sp1);
f.pack();
f.setVisible(true);
}
}


Now, try to compile and run that application. Next:
1. press right one touch arrow -- bottom panel is now hidden.
2. maximalize application window, so it covers whole screen.
3. press left one touch arrow -- bottom panel is now shown, but
unfortunatelly it has bigger height than I wanted!!!

What to do, to make bottom panel having always the same height?

Thanks in advance for your help.

Regards,
Robbo


From: John B. Matthews on
In article <hoipd2$on9$1(a)nemesis.news.neostrada.pl>,
"Robbo" <nie.mam(a)yle.com> wrote:

> Hello,
>
> I would like to have horizontal JSplitPane with two panels,
> where one of them (bottom) should have always the same
> height when we use only one touch expandables
> (we assume, user doesn't use dragging of divider).
[...]
> Now, try to compile and run that application. Next:
> 1. press right one touch arrow -- bottom panel is now hidden.
> 2. maximalize application window, so it covers whole screen.
> 3. press left one touch arrow -- bottom panel is now shown, but
> unfortunatelly it has bigger height than I wanted!!!
>
> What to do, to make bottom panel having always the same height?

Handling componentResized events seemed to get the desired effect:

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class Swing6 {

private static class MyPanel extends JPanel {

@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawLine(0, 0, getWidth(), getHeight());
g.drawLine(getWidth(), 0, 0, getHeight());
}
}

private static void create() {
JFrame f = new JFrame("JSplitPane");
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

final MyPanel p1 = new MyPanel();
p1.setPreferredSize(new Dimension(300, 150));

final MyPanel p2 = new MyPanel();
p2.setMinimumSize(new Dimension(0, 0));
p2.setPreferredSize(new Dimension(300, 100));
p2.setMaximumSize(new Dimension(300, 100));

final JSplitPane jsp = new JSplitPane();
jsp.setTopComponent(p1);
jsp.setBottomComponent(p2);
jsp.setOrientation(JSplitPane.VERTICAL_SPLIT);
jsp.setResizeWeight(1.0);
jsp.setOneTouchExpandable(true);
jsp.addComponentListener(new ComponentAdapter() {

@Override
public void componentResized(ComponentEvent e) {
if (p2.getHeight() > 0)
jsp.resetToPreferredSizes();
}
});

f.add(jsp);
f.pack();
f.setVisible(true);
}

public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {

@Override
public void run() {
create();
}
});
}
}

As an aside, it's a good habit to build the GUI on the EDT:

<http://java.sun.com/docs/books/tutorial/uiswing/concurrency/initial.html
>

--
John B. Matthews
trashgod at gmail dot com
<http://sites.google.com/site/drjohnbmatthews>
From: Roedy Green on
On Fri, 26 Mar 2010 17:51:49 +0100, "Robbo" <nie.mam(a)yle.com> wrote,
quoted or indirectly quoted someone who said :

>Hello,
>
>I would like to have horizontal JSplitPane with two panels,
>where one of them (bottom) should have always the same
>height when we use only one touch expandables
>(we assume, user doesn't use dragging of divider).

If you don't want variable size, why not just use two JPanels inside a
JPanel?
--
Roedy Green Canadian Mind Products
http://mindprod.com

If you tell a computer the same fact in more than one place, unless you have an automated mechanism to ensure they stay in sync, the versions of the fact will eventually get out of sync.
From: John B. Matthews on
In article <kmvuq5lk4r88ov60p7ssdst1rlt0klkd1o(a)4ax.com>,
Roedy Green <see_website(a)mindprod.com.invalid> wrote:

> On Fri, 26 Mar 2010 17:51:49 +0100, "Robbo" <nie.mam(a)yle.com> wrote,
> quoted or indirectly quoted someone who said :
>
> >Hello,
> >
> >I would like to have horizontal JSplitPane with two panels,
> >where one of them (bottom) should have always the same
> >height when we use only one touch expandables
> >(we assume, user doesn't use dragging of divider).
>
> If you don't want variable size, why not just use two JPanels
> inside a JPanel?

I wondered about this, too. I'm guessing the OP wants to leverage the
one-touch show/hide feature of JSplitPane, at least when it's supported.

--
John B. Matthews
trashgod at gmail dot com
<http://sites.google.com/site/drjohnbmatthews>