OVH Cloud OVH Cloud

JSplitPanes imbriqués, problème d'expansion

3 réponses
Avatar
Thibaut Desmarest
Bonjour à tous,

Mon problème est le suivant :

J'ai une interface graphique que je veux couper en 3 parties
rétractables, comme ça :

________________________
| |
|________partie 1_______|
| |
|_°______partie 2 _____|
| |
|________partie 3_______|


J'ai donc crée un premier Jsplitpane avec comme TopComponent la partie
1, et comme BottomComponent un autre JSplitPane qui contient lui les
parties 1 et 2.

Jusque là ça marche à peu près excepté quelques bugs de Layout parfois.
Le vrai problème c'est que l'on ma demandé (et je n'ai pas le choix) de
faire UN SEUL bouton qui permet de rétracter les parties 1 et 3 pour
n'avoir plus à l'écran que la partie 2. (C'est le petit °).

J'ai donc essayé de faire un

splitPane1.setDividerLocation(splitPane.getMinimumLocation());
splitPane2.setDividerLocation(splitPane.getMaximumLocation());

mais ca ne marche que pour le splitPane1. Celui se rétracte puis reprend
sa taile originale quand je lui demande, pas de problème. Par contre le
splitPane2 ne veut rien savoir ! J'ai mis des

println(splitPane.getDividerLocation());

Et je vois que la valeur de la position de la barre a bien été modifiée
et poussée (à priori) à son maximum. Mais graphiquement la barre reste
où elle est ! Jai bien essayé des repaint() et des updateUI() mais rien
n'y fait.

En revanche, si j'essaie de bouger la barre "à la main", ca marche très
bien et je peux retracter la partie 3 complètement.


Déjà merci de m'avoir lu jusqu'ici, et merci d'avance pour toutes vos
idées, parceque moi là je commence à m'arracher les cheveux :(

3 réponses

Avatar
Christophe Roudet
si tu as split1 avec comme bottomComponent split2

tu fais

split1.setDividerLocation(0.0);// double
split2.setDividerLocation(1.0);// double

Christophe

public class TestSplit extends JPanel {
private JSplitPane _mainSp;
private JSplitPane _sp;

public TestSplit() {
super();
setLayout(new BorderLayout());
_mainSp = new JSplitPane(JSplitPane.VERTICAL_SPLIT);
_mainSp.setOneTouchExpandable(true);
_sp = new JSplitPane(JSplitPane.VERTICAL_SPLIT);
_sp.setOneTouchExpandable(true);

_mainSp.setTopComponent(new JLabel("Pane1"));
_mainSp.setBottomComponent(_sp);
_sp.setTopComponent(new JLabel("Pane2"));
_sp.setBottomComponent(new JLabel("Pane3"));


add(BorderLayout.CENTER, _mainSp);
}

public void doIt() {
_mainSp.setDividerLocation(0.0);
_sp.setDividerLocation(1.0);
}

public static void main(String[] args) throws Exception {
JFrame f = new JFrame();
f.getContentPane().setLayout(new BorderLayout());
TestSplit sp;
f.getContentPane().add(BorderLayout.CENTER, sp = new TestSplit());
f.setSize(500, 500);
f.setVisible(true);
sp.doIt();
}
}
"Thibaut Desmarest" wrote in message
news:cj0sab$13qm$
Bonjour à tous,

Mon problème est le suivant :

J'ai une interface graphique que je veux couper en 3 parties rétractables,
comme ça :

________________________
| |
|________partie 1_______|
| |
|_°______partie 2 _____|
| |
|________partie 3_______|


J'ai donc crée un premier Jsplitpane avec comme TopComponent la partie 1,
et comme BottomComponent un autre JSplitPane qui contient lui les parties
1 et 2.

Jusque là ça marche à peu près excepté quelques bugs de Layout parfois. Le
vrai problème c'est que l'on ma demandé (et je n'ai pas le choix) de faire
UN SEUL bouton qui permet de rétracter les parties 1 et 3 pour n'avoir
plus à l'écran que la partie 2. (C'est le petit °).

J'ai donc essayé de faire un

splitPane1.setDividerLocation(splitPane.getMinimumLocation());
splitPane2.setDividerLocation(splitPane.getMaximumLocation());

mais ca ne marche que pour le splitPane1. Celui se rétracte puis reprend
sa taile originale quand je lui demande, pas de problème. Par contre le
splitPane2 ne veut rien savoir ! J'ai mis des

println(splitPane.getDividerLocation());

Et je vois que la valeur de la position de la barre a bien été modifiée et
poussée (à priori) à son maximum. Mais graphiquement la barre reste où
elle est ! Jai bien essayé des repaint() et des updateUI() mais rien n'y
fait.

En revanche, si j'essaie de bouger la barre "à la main", ca marche très
bien et je peux retracter la partie 3 complètement.


Déjà merci de m'avoir lu jusqu'ici, et merci d'avance pour toutes vos
idées, parceque moi là je commence à m'arracher les cheveux :(


Avatar
Thibaut Desmarest
Christophe Roudet wrote:
si tu as split1 avec comme bottomComponent split2

tu fais

split1.setDividerLocation(0.0);// double
split2.setDividerLocation(1.0);// double

Christophe

public class TestSplit extends JPanel {
private JSplitPane _mainSp;
private JSplitPane _sp;

public TestSplit() {
super();
setLayout(new BorderLayout());
_mainSp = new JSplitPane(JSplitPane.VERTICAL_SPLIT);
_mainSp.setOneTouchExpandable(true);
_sp = new JSplitPane(JSplitPane.VERTICAL_SPLIT);
_sp.setOneTouchExpandable(true);

_mainSp.setTopComponent(new JLabel("Pane1"));
_mainSp.setBottomComponent(_sp);
_sp.setTopComponent(new JLabel("Pane2"));
_sp.setBottomComponent(new JLabel("Pane3"));


add(BorderLayout.CENTER, _mainSp);
}

public void doIt() {
_mainSp.setDividerLocation(0.0);
_sp.setDividerLocation(1.0);
}

public static void main(String[] args) throws Exception {
JFrame f = new JFrame();
f.getContentPane().setLayout(new BorderLayout());
TestSplit sp;
f.getContentPane().add(BorderLayout.CENTER, sp = new TestSplit());
f.setSize(500, 500);
f.setVisible(true);
sp.doIt();
}
}


Euh... Merci pour ta réponse, mais je vois pas ce qu'il y'a de différent
entre ton code et le mien au niveau de la création des SplitPanes... A
part l'utilisation des double (0.0 et 1.0)
Pourquoi mettre un double alors qu'il demande un int ? Pourquoi ces
valeurs là ? Les valeurs ne doivent pas correspondre à la position en
pixel ?
Je rappelle que j'ai desactivé le oneTouchExpandable ainsi que la
possibilité de bouger manuellement le divider, puisque mon bouton est
censé rétracter tout seul les panneaux.

Avatar
Christophe Roudet
"Thibaut Desmarest" wrote in message
news:cj8hg5$1r4d$
Christophe Roudet wrote:
si tu as split1 avec comme bottomComponent split2

tu fais

split1.setDividerLocation(0.0);// double
split2.setDividerLocation(1.0);// double

Christophe

public class TestSplit extends JPanel {
private JSplitPane _mainSp;
private JSplitPane _sp;

public TestSplit() {
super();
setLayout(new BorderLayout());
_mainSp = new JSplitPane(JSplitPane.VERTICAL_SPLIT);
_mainSp.setOneTouchExpandable(true);
_sp = new JSplitPane(JSplitPane.VERTICAL_SPLIT);
_sp.setOneTouchExpandable(true);

_mainSp.setTopComponent(new JLabel("Pane1"));
_mainSp.setBottomComponent(_sp);
_sp.setTopComponent(new JLabel("Pane2"));
_sp.setBottomComponent(new JLabel("Pane3"));


add(BorderLayout.CENTER, _mainSp);
}

public void doIt() {
_mainSp.setDividerLocation(0.0);
_sp.setDividerLocation(1.0);
}

public static void main(String[] args) throws Exception {
JFrame f = new JFrame();
f.getContentPane().setLayout(new BorderLayout());
TestSplit sp;
f.getContentPane().add(BorderLayout.CENTER, sp = new TestSplit());
f.setSize(500, 500);
f.setVisible(true);
sp.doIt();
}
}


Euh... Merci pour ta réponse, mais je vois pas ce qu'il y'a de différent
entre ton code et le mien au niveau de la création des SplitPanes... A
part l'utilisation des double (0.0 et 1.0)
Pourquoi mettre un double alors qu'il demande un int ? Pourquoi ces
valeurs là ? Les valeurs ne doivent pas correspondre à la position en
pixel ?


Lit la doc.
le double represente un pourcentage.

Je rappelle que j'ai desactivé le oneTouchExpandable ainsi que la
possibilité de bouger manuellement le divider, puisque mon bouton est
censé rétracter tout seul les panneaux.


fait le doIt() dans une Action.

Christophe