IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

AWT/Swing Java Discussion :

Question sur les JSplitPane


Sujet :

AWT/Swing Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    327
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 327
    Par défaut Question sur les JSplitPane
    Bonjour,

    Comment pourrai-je faire pour empecher un JSplitPane de s'ouvrir au maximum de la fenetre lorsque j'appuie sur la petite fleche qui est dirigé vers la bordure extérieure ?

    Ou encore mieux lorsqu'elle est dans son état initial griser la fleche dirigé vers l'extérieur (enfin si c'est possible)

    Merci

  2. #2
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3 276
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3 276
    Par défaut
    A priori tu ne peux désactiver ou activer que les deux flèches en même temps avec la méthode setOneTouchExpandable.

  3. #3
    Membre chevronné
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    299
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2009
    Messages : 299
    Par défaut
    J'ai réussi à contourner ton problème... après je ne suis pas du tout sûr que ce soit une méthode "propre"...
    J'ai du calculer une variable "divider_adjust_value" car suivant les look&feel, il y a un décalage différent entre la valeur que l'on demande et la valeur qu'on obtient lors du placement du divider...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    import java.awt.BorderLayout;
    import java.awt.Color;
    import java.awt.Dimension;
     
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.JSplitPane;
     
    public class Test {
    	public static void main(String[] args) {
    		JFrame frame = new JFrame("Test");
    		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		frame.setSize(450,450);
    		frame.setResizable(false);
     
    		JPanel gauche = new JPanel();
    		gauche.setOpaque(true);
    		gauche.setBackground(Color.WHITE);
    		gauche.setMinimumSize(new Dimension(200, 200));
     
    		JPanel droite = new JPanel();
    		droite.setOpaque(true);
    		droite.setBackground(Color.WHITE);
    		droite.setMinimumSize(new Dimension(200, 200));
     
    		JSplitPane split = new MySplitPane(JSplitPane.HORIZONTAL_SPLIT, gauche, droite);
     
    		split.setOneTouchExpandable(true);
    		split.setDividerLocation(200);
     
    		frame.add(split, BorderLayout.CENTER);
    		frame.setVisible(true);
    	}
     
    }
     
    @SuppressWarnings("serial")
    class MySplitPane extends JSplitPane{
    	private int divider_adjust_value;
     
    	public MySplitPane(int horizontalSplit, JPanel gauche, JPanel droite) {
    		super(horizontalSplit, gauche, droite);
     
    		initDividerAdjustment();
    	}
     
    	private void initDividerAdjustment() {
    		divider_adjust_value = getMinimumDividerLocation() - getLeftComponent().getMinimumSize().width;
    	}
     
    	@Override
    	public void setDividerLocation(int location) {
    		super.setDividerLocation(location);
     
    		if(getDividerLocation()==divider_adjust_value)
    			setDividerLocation(getLeftComponent().getMinimumSize().width);
     
    		if(getDividerLocation()==(getWidth()-(getDividerSize()+divider_adjust_value)))
    			setDividerLocation(getWidth() - (getRightComponent().getMinimumSize().width + getDividerSize() + divider_adjust_value));
    	}
    }

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    327
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 327
    Par défaut
    Génial c'est casiment ce que je voulais faire ce que je cherchais c'étais ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    import java.awt.BorderLayout;
    import java.awt.Color;
    import java.awt.Dimension;
     
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.JSplitPane;
     
    public class Test {
    	public static void main(String[] args) {
    		JFrame frame = new JFrame("Test");
    		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		frame.setSize(450,450);
    		frame.setResizable(false);
     
    		JPanel gauche = new JPanel();
    		gauche.setOpaque(true);
    		gauche.setBackground(Color.WHITE);
    		gauche.setMinimumSize(new Dimension(200, 200));
     
    		JPanel droite = new JPanel();
    		droite.setOpaque(true);
    		droite.setBackground(Color.WHITE);
    		droite.setMinimumSize(new Dimension(200, 200));
     
    		JSplitPane split = new MySplitPane(JSplitPane.HORIZONTAL_SPLIT, gauche, droite, frame);
     
    		split.setOneTouchExpandable(true);
    		split.setDividerLocation(200);
     
    		frame.add(split, BorderLayout.CENTER);
    		frame.setVisible(true);
    	}
     
    }
     
    @SuppressWarnings("serial")
    class MySplitPane extends JSplitPane{
    	private int divider_adjust_value;
    	private JFrame fenetre;
     
    	public MySplitPane(int horizontalSplit, JPanel gauche, JPanel droite, JFrame fenetre) {
    		super(horizontalSplit, gauche, droite);
    		this.fenetre = fenetre;
    		initDividerAdjustment();
    	}
     
    	private void initDividerAdjustment() {
    		divider_adjust_value = getMinimumDividerLocation() - getLeftComponent().getMinimumSize().width;
    	}
     
    	@Override
    	public void setDividerLocation(int location) {
    		super.setDividerLocation(location);
     
    		if(getDividerLocation()==divider_adjust_value)
    			setDividerLocation(getLeftComponent().getMinimumSize().width);
     
    		if(getDividerLocation()==(getWidth()-(getDividerSize()+divider_adjust_value)))
    			setDividerLocation(this.fenetre.getWidth ());
    	}
    }
    Mais à une ligne près c'étais bon. Merci beaucoup

  5. #5
    Membre chevronné
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    299
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2009
    Messages : 299
    Par défaut
    En fait tu ne voulais que ca ne le fasse que d'un côté ??
    Si c'est le cas, au lieu de rajouter des lignes il vaudrait mieux en supprimer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    import java.awt.BorderLayout;
    import java.awt.Color;
    import java.awt.Dimension;
     
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.JSplitPane;
     
    public class Test {
    	public static void main(String[] args) {
    		JFrame frame = new JFrame("Test");
    		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		frame.setSize(450,450);
    		frame.setResizable(false);
     
    		JPanel gauche = new JPanel();
    		gauche.setOpaque(true);
    		gauche.setBackground(Color.WHITE);
    		gauche.setMinimumSize(new Dimension(200, 200));
     
    		JPanel droite = new JPanel();
    		droite.setOpaque(true);
    		droite.setBackground(Color.WHITE);
    		droite.setMinimumSize(new Dimension(200, 200));
     
    		JSplitPane split = new MySplitPane(JSplitPane.HORIZONTAL_SPLIT, gauche, droite);
     
    		split.setOneTouchExpandable(true);
    		split.setDividerLocation(200);
     
    		frame.add(split, BorderLayout.CENTER);
    		frame.setVisible(true);
    	}
     
    }
     
    @SuppressWarnings("serial")
    class MySplitPane extends JSplitPane{
    	private int divider_adjust_value;
     
    	public MySplitPane(int horizontalSplit, JPanel gauche, JPanel droite) {
    		super(horizontalSplit, gauche, droite);
     
    		initDividerAdjustment();
    	}
     
    	private void initDividerAdjustment() {
    		divider_adjust_value = getMinimumDividerLocation() - getLeftComponent().getMinimumSize().width;
    	}
     
    	@Override
    	public void setDividerLocation(int location) {
    		super.setDividerLocation(location);
     
    		if(getDividerLocation()==divider_adjust_value)
    			setDividerLocation(getLeftComponent().getMinimumSize().width);
     
    	}
    }
    Surtout que du coup, j'ai un peu peur que ton setDividerLocation tourne en boucle. En fait lorsque tu clics sur les flêches, cette méthode est appelée afin de mettre le divider vers un des 2 bords. Ce que j'ai rajouté permet de tester si nous sommes au bord et dans ce cas là effectuer un décalage vers la valeur minimum du composant de gauche ou de droite. Avec ton code, en gros tu fais : si le divider est au bord, alors le mettre au bord... ca risque de faire une boucle infinie... peut être que le décalage qu'il existe au niveau du divider te sauve de ce cas de figure, mais en faisant les tests j'ai vu que la valeur était différente suivant le L&F... si tu tombes sur un L&F qui retourne 0 pour cette valeur, alors tu entrera dans une boucle sans fin.

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    327
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 327
    Par défaut
    Merci du conseils

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Petite question sur les performances de Postgres ...
    Par cb44 dans le forum PostgreSQL
    Réponses: 5
    Dernier message: 13/01/2004, 13h49
  2. question sur les vertex buffer et index buffer
    Par airseb dans le forum DirectX
    Réponses: 9
    Dernier message: 25/08/2003, 02h38
  3. question sur les variables globales et les thread posix
    Par souris_sonic dans le forum POSIX
    Réponses: 5
    Dernier message: 13/06/2003, 13h59
  4. Question sur les handles et les couleurs...
    Par MrDuChnok dans le forum C++Builder
    Réponses: 7
    Dernier message: 29/10/2002, 08h45
  5. question sur les message box !
    Par krown dans le forum Langage
    Réponses: 7
    Dernier message: 02/08/2002, 16h11

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo