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 :

Modifier les fléches de défilement d'un JTabbedPane


Sujet :

AWT/Swing Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 40
    Par défaut Modifier les fléches de défilement d'un JTabbedPane
    Bonjour, je cherche a personnaliser mes onglets et en particulier les flèches qui permettent le défilement des onglets dans un composant JTabbedPane.

    Il s'agit des flèches qui appararaissent lorsque l'on a un grand nombre d'onglet, ou une petite fenêtre.

    J'ai des icônes que je cherche à mettre à la place des flèches par défaut.

    J'ai mis une capture afin de lever toutes ambiguïté quant au bouton que je cherche à remplacer :



    Merci.
    Images attachées Images attachées  

  2. #2
    Expert confirmé
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Par défaut
    Ca ne va pas être des plus simple, il va te falloir redéfinit l'UI de ton JTabbedPane.

    EN l'occurence la classe dont tu dois partir est la classe javax.swing.plaf.metal.MetalTabbedPaneUI dont tu dois hériter et redéfinir la méthode createScrollButton pour qu'elle affecte une autre icône au bouton renvoyé.


    Genre:

    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
     
     
    public class MyTabbedPaneUI extends MetalTabbedPaneUI {
     
    	private Icon southIcon = new ImageIcon(MyTabbedPaneUI.class.getRessource("/com/company/app/resources/image/southIcon.png"));
    	private Icon northIcon = new ImageIcon(MyTabbedPaneUI.class.getRessource("/com/company/app/resources/image/northIcon.png"));
    	private Icon eastIcon = new ImageIcon(MyTabbedPaneUI.class.getRessource("/com/company/app/resources/image/eastIcon.png"));
    	private Icon westIcon = new ImageIcon(MyTabbedPaneUI.class.getRessource("/com/company/app/resources/image/westIcon.png"));
     
    	public static ComponentUI createUI( JComponent x ) {
            return new MyTabbedPaneUI();
        }
     
    	@Override
    	protected JButton createScrollButton(int direction) {
    		if (direction != SOUTH && direction != NORTH && direction != EAST &&
    								  direction != WEST) {
    			throw new IllegalArgumentException("Direction must be one of: " +
    											   "SOUTH, NORTH, EAST or WEST");
    		}
    		JButton b = super.createScrollButton(direction);
    		if (direction == SOUTH) {
    			b.setIcon(southIcon);
    		} else if (direction == NORTH) {
    			b.setIcon(northIcon);
    		} else if (direction == WEST) {
    			b.setIcon(westIcon);
    		} else {
    			b.setIcon(eastIcon);
    		}
    		return b;
    	}
     
    }

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 40
    Par défaut
    Merci pour ta réponse, j'ai donc crée une classe qui hérite (extends) de JTabbedPane et dans le constructeur de cette classe j'utilise la méthode "setUI(new MyTabbedPaneUI());" pourtant cela ne change pas mes boutons.

    Je pense que je dois utilisé la méthode "createUI" que tu as défini mais je ne vois pas comment. Mon code est le suivant :


    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
    public class ongletFleche extends JTabbedPane {
     
    	public ongletFleche(){
     
    		addTab("tab1", new Panel());
    		addTab("tab2", new Panel());
    		[...]
    		addTab("tab11", new Panel());
    		addTab("tab12", new Panel());
     
    		setUI(new MyTabbedPaneUI());
     
    		setTabLayoutPolicy(SCROLL_TAB_LAYOUT);
     
    	}
    }

  4. #4
    Expert confirmé
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Par défaut
    Problème capté, ça vient du fait que le super renvoie un ArrowButton et non un JButton. Or les ArrawButton n'ont rien à carrer des Icons...

    Version corrigée

    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
    63
    64
    65
    66
    package swing.ui;
     
    import java.awt.Dimension;
     
    import javax.swing.Icon;
    import javax.swing.ImageIcon;
    import javax.swing.JButton;
    import javax.swing.JComponent;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JTabbedPane;
    import javax.swing.plaf.ComponentUI;
    import javax.swing.plaf.metal.MetalTabbedPaneUI;
     
    public class MyTabbedPaneUI extends MetalTabbedPaneUI {
     
        private Icon southIcon = new ImageIcon(MyTabbedPaneUI.class.getResource("/swing/ui/res/southIcon.png"));
        private Icon northIcon = new ImageIcon(MyTabbedPaneUI.class.getResource("/swing/ui/res/northIcon.png"));
        private Icon eastIcon = new ImageIcon(MyTabbedPaneUI.class.getResource("/swing/ui/res/eastIcon.png"));
        private Icon westIcon = new ImageIcon(MyTabbedPaneUI.class.getResource("/swing/ui/res/westIcon.png"));
     
        public static ComponentUI createUI( JComponent x ) {
            return new MyTabbedPaneUI();
        }
     
        @Override
        protected JButton createScrollButton(int direction) {
            System.out.println("getButton");
            if (direction != SOUTH && direction != NORTH && direction != EAST &&
                                      direction != WEST) {
                throw new IllegalArgumentException("Direction must be one of: " +
                                                   "SOUTH, NORTH, EAST or WEST");
            }
     
            JButton b = new JButton();
            b.setText("");
            b.setPreferredSize(new Dimension(southIcon.getIconWidth(), southIcon.getIconHeight()));
            if (direction == SOUTH) {
                b.setIcon(southIcon);
            } else if (direction == NORTH) {
                b.setIcon(northIcon);
            } else if (direction == WEST) {
                b.setIcon(westIcon);
            } else {
                b.setIcon(eastIcon);
            }
            return b;
        }
     
        public static void main(String[] args) {
            JTabbedPane pane = new JTabbedPane();
            pane.setUI(new MyTabbedPaneUI());
            pane.setTabLayoutPolicy(JTabbedPane.SCROLL_TAB_LAYOUT);
            for(int i=0; i<40; i++) {
                pane.addTab("tab "+i, new JLabel(""+i));
            }
     
            JFrame f = new JFrame();
            f.add(pane);
            f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
            f.setSize(800, 600);
            f.setLocationRelativeTo(null);
            f.setVisible(true);
     
        }
    }

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 40
    Par défaut
    Merci, ta solution fonctionne dans mon prototype je vais l'intégrer au projet.

    J'ai intégrer la solution cela marche bien cependant j'ai deux onglets qui sont crées et qui ne comporte pas de titre.

    Aprés avoir cherché ces onglets apparaissent suite à l'utilisation de la méthode permettant de modifier les boutons "protected JButton createScrollButton(int direction)"

    SI je mets le stricte minimum dans cette méthode j'ai quand même mes deux onglets qui apparaissent :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    protected JButton createScrollButton(int direction) {
    	    return new JButton("badoo");
    	    }
    J'ai essayé d'enlever ces 2 onglets qui apparaissé, oui ce n'est pas vraiment propre mais bon. J'ai donc utilisé la méthode removeTabe de l'objet JTabbedPane mais ça enléve mes 2 onglets indésirable mais ça fait également disparaitre mes fléches !

    Petit détail je suis en JavaSE 1.6

    MAJ du 15/03/12 :
    Il faudrait que je modifie la classe ScrollableTabButton qui hérite de BasicArrowButton dans BasicTabbedPaneUI mais je ne sais pas vriament comment faire.

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 52
    Par défaut
    Au détour d'une recherche google je suis tombé là dessus :
    Hi dude,
    There is one issue I was facing after implementing your solution.
    BasicArrowButton does not implement UIResource so I was getting two extra tabs.
    What I have done to resolve this is I have created my own class which extends BasicArrowButton and implements UIResource.
    That works..
    Par ici pour le thread complet.

    Pour info, la problématique du thread est similaire à la tienne (je précise tout de même que je n'ai pas testé).
    Ce post commence tout peine à dater mais si ça ne sert pas à son auteur, ça pourrait toujours servir à une quelconque âme perdue qui passerait par là...

Discussions similaires

  1. JscrollPane et défilement grâce les flèches du clavier
    Par patouche dans le forum Agents de placement/Fenêtres
    Réponses: 0
    Dernier message: 26/11/2008, 09h42
  2. [JTabbedPane] Modifier les icônes
    Par Amara dans le forum Composants
    Réponses: 4
    Dernier message: 31/05/2005, 11h19
  3. Evenement sur les barres de défilement d'une ScrollBox
    Par Nico118 dans le forum C++Builder
    Réponses: 2
    Dernier message: 06/05/2004, 14h56
  4. [VBA-E]modifier les attributs d'un commentaire dans une cellule
    Par Olivier vb dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 15/03/2004, 10h26
  5. [EXCEL]Modifier les marges d'une page dans Excel
    Par ms91fr dans le forum Composants VCL
    Réponses: 4
    Dernier message: 06/01/2004, 15h26

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