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

Agents de placement/Fenêtres Java Discussion :

[JTabbedPane] afficher texte étiquette bas en haut.


Sujet :

Agents de placement/Fenêtres Java

  1. #1
    Membre régulier Avatar de spoutyoyo
    Inscrit en
    Avril 2004
    Messages
    116
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 116
    Points : 83
    Points
    83
    Par défaut [JTabbedPane] afficher texte étiquette bas en haut.
    Bonjour,

    J'ai créé un JTabbedPane dans lequel j'y ai ajouté deux panels.
    Les étiquettes de ces deux panels sont situés à gauche.

    onglets.setTabPlacement(javax.swing.JTabbedPane.LEFT);

    Je voudrais que le texte dans mes étiquettes soit afficher de bas en haut, c'est à dire "une rotation du texte (écrit normalement) de 90° vers la gauche".

    Gaetan.
    http://www.stop-monsanto.qsdf.org/

  2. #2
    Membre émérite
    Avatar de Ioan
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    737
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 737
    Points : 2 999
    Points
    2 999
    Par défaut
    Bonjour,
    Tu peux utiliser du html :
    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
     
    public class Test extends JFrame{ 
    	public Test(){ 
    		super("Test"); 
    		JTabbedPane jtb = new JTabbedPane();
    		jtb.add(getTitle("label 1"), new JLabel("label 1"));
    		jtb.add(getTitle("label 2 "), new  JLabel("label 2"));
    		jtb.setTabPlacement(JTabbedPane.LEFT);
    		getContentPane().add(jtb);
    		setSize(400,400);setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    		setLocationRelativeTo(null);setVisible(true);  
    	}
    	public String getTitle(String title){
    		if(title==null){return null;}
    		String nouveauTitre = "<html>";
    		for(int i=0;i<title.length();i++){
    			nouveauTitre+=title.charAt(i)+"<br>";	
    		}	
    		nouveauTitre+="</html>";
    		return nouveauTitre;
    	}
    	public static void main(String[] args){new Test();} 
    }
    Ou utilises un BasicTabbedPaneUI et surcharges paintText.
    Bonne chance.
    @+
    Les FAQs Java, J2EE, JDBC, Struts > Les cours > Le Forum Java.
    Merci de respecter les règles du club.
    Mon blog : quelques news sur Java, Linux et le monde de l'Open Source.

  3. #3
    Membre régulier Avatar de spoutyoyo
    Inscrit en
    Avril 2004
    Messages
    116
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 116
    Points : 83
    Points
    83
    Par défaut
    J'avais fait ça au départ mais ça m'affiche par exemple

    t
    e
    s
    t

    Moi ce que j'aimerais (ben plutot mon responsable lol), que l'on tourne la tête vers la gauche, et que l'on puisse lire le texte.

    J'aimerais trouver une solution en java. Car sinon une solution brutale serait de mettre une image du texte dans le sens voulu et de la claquée dans l'étiquette, mais c pas très bien lol.
    http://www.stop-monsanto.qsdf.org/

  4. #4
    Membre émérite
    Avatar de Ioan
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    737
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 737
    Points : 2 999
    Points
    2 999
    Par défaut
    Salut,
    Citation Envoyé par vedaer
    Ou utilises un BasicTabbedPaneUI et surcharges paintText.

    @+
    Les FAQs Java, J2EE, JDBC, Struts > Les cours > Le Forum Java.
    Merci de respecter les règles du club.
    Mon blog : quelques news sur Java, Linux et le monde de l'Open Source.

  5. #5
    Membre régulier Avatar de spoutyoyo
    Inscrit en
    Avril 2004
    Messages
    116
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 116
    Points : 83
    Points
    83
    Par défaut
    J'ai récupéré la méthode paintText de BasicTabbedPaneUI

    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
     
    protected void paintText(Graphics g, int tabPlacement,
                                 Font font, FontMetrics metrics, int tabIndex,
                                 String title, Rectangle textRect, 
                                 boolean isSelected) {
     
            g.setFont(font);
     
    	View v = getTextViewForTab(tabIndex);
    	if (v != null) {
    	    // html
    	    v.paint(g, textRect);
    	} else {
    	    // plain text
                int mnemIndex = tabPane.getDisplayedMnemonicIndexAt(tabIndex);
     
    	    if (tabPane.isEnabled() && tabPane.isEnabledAt(tabIndex)) {
    		g.setColor(tabPane.getForegroundAt(tabIndex));
                    BasicGraphicsUtils.drawStringUnderlineCharAt(g,
                                 title, mnemIndex,
                                 textRect.x, textRect.y + metrics.getAscent());
     
    	    } else { // tab disabled
    		g.setColor(tabPane.getBackgroundAt(tabIndex).brighter());
                    BasicGraphicsUtils.drawStringUnderlineCharAt(g,
                                 title, mnemIndex,
                                 textRect.x, textRect.y + metrics.getAscent());
    		g.setColor(tabPane.getBackgroundAt(tabIndex).darker());
                    BasicGraphicsUtils.drawStringUnderlineCharAt(g,
                                 title, mnemIndex,
                                 textRect.x - 1, textRect.y + metrics.getAscent() - 1);
     
    	    }
    	}
        }
    A mon avis, c'est au niveau de la méthode drawStringUnderlineCharAt qu'il faut intervenir, mais je suis un peu perdu, je sais pas trop comment faire.

    Si qqun peut m'aider.
    http://www.stop-monsanto.qsdf.org/

  6. #6
    Membre émérite
    Avatar de Ioan
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    737
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 737
    Points : 2 999
    Points
    2 999
    Par défaut
    Bonjour,
    Citation Envoyé par spoutyoyo
    A mon avis, c'est au niveau de la méthode drawStringUnderlineCharAt qu'il faut intervenir
    Oui, c'est bien ca. Cette méthode est chargée de dessinner le texte. Une simple translation puis une rotation devraient faire l'affaire. Regardes les méthodes rotate et translate de Graphics2D ou AffineTransform. Par contre, il faudra aussi que tu redefinisse toutes les méthodes chargées de mettre la taille des "composants", de dessinner les bords, etc. Enfin bref, cela n'a rien de trivial . Cela correspond carrémént à redéfinir une nouvelle UI.
    Si tu n'as pas trop le temps (cf. "mon responsable " ), je te conseilles plutôt d'utiliser une Icon pour définir à la fois le texte et l'image de l'onglet. Ca sera plus facile et plus rapide à faire. Ou, au pire, créer ton propre Tabbedpane, composé de JToggleButton, d'un CardLayout et de quelques Listeners.
    Bonne chance.
    @+
    Les FAQs Java, J2EE, JDBC, Struts > Les cours > Le Forum Java.
    Merci de respecter les règles du club.
    Mon blog : quelques news sur Java, Linux et le monde de l'Open Source.

  7. #7
    Membre régulier Avatar de spoutyoyo
    Inscrit en
    Avril 2004
    Messages
    116
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 116
    Points : 83
    Points
    83
    Par défaut
    Bon ben mon responsable veut que je me lance dans la redéfinition de paintText, donc me voilà reparti

    Quelqu'un serait-il par hasard où il y aurait le code de la méthode

    BasicGraphicsUtils.drawStringUnderlineCharAt(...)

    car c'est à ce niveau qu'intervient le dessin du texte dans la méthode paintText défini dans la classe BasicTabbedPaneUI
    http://www.stop-monsanto.qsdf.org/

  8. #8
    Membre régulier Avatar de spoutyoyo
    Inscrit en
    Avril 2004
    Messages
    116
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 116
    Points : 83
    Points
    83
    Par défaut
    Personne n'a toujours pas d'idée.
    http://www.stop-monsanto.qsdf.org/

  9. #9
    Membre émérite
    Avatar de Ioan
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    737
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 737
    Points : 2 999
    Points
    2 999
    Par défaut
    Bonjour,
    La méthode BasicGraphicsUtils.drawStringUnderlineCharAt(...) ne fais rien de plus qu'écrire du texte en soulignant une lettre. Comme la méthode drawString avec un AttributedCharacterIterator.
    En fait il faut modifier beaucoup plus de choses. Voila un exemple :
    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
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
     
    public class Test  extends JFrame{
    	public Test(){
    		super("Test");
    		Container contentpane = getContentPane();
    		contentpane.setLayout(new GridLayout(2,2));
    		contentpane.add(createTabbedPane(JTabbedPane.LEFT));
    		contentpane.add(createTabbedPane(JTabbedPane.TOP));
    		contentpane.add(createTabbedPane(JTabbedPane.BOTTOM));
    		contentpane.add(createTabbedPane(JTabbedPane.RIGHT));
    		setSize(500,600);setDefaultCloseOperation(EXIT_ON_CLOSE);
    		setLocationRelativeTo(null);setVisible(true);
    	}
    	private JTabbedPane createTabbedPane(int tabPlacement){
    		JTabbedPane tabbedpane = new JTabbedPane();
    		tabbedpane.setTabPlacement(tabPlacement);
    		tabbedpane.setUI(new MonUI());
    		tabbedpane.addTab("panel 1",new ImageIcon("icone.gif"), new JLabel("panel 1"));
    		tabbedpane.addTab("panel 2", new JLabel("panel 2"));
    		tabbedpane.addTab("panel 3", new JLabel("panel 3"));
    		tabbedpane.setForeground(Color.BLUE);
    		tabbedpane.setFont(new Font("Dialog",Font.ITALIC,15));
    		return tabbedpane;
    	}
    	private class MonUI extends BasicTabbedPaneUI{
    		public MonUI(){super();}
    		private Image getVerticalImage(int tabIndex){
    			ImageIcon iconeNormale = (ImageIcon)tabPane.getIconAt(tabIndex);
    			int iconeWidth = (iconeNormale!=null)?iconeNormale.getIconHeight():0;
    			int iconeHeight = (iconeNormale!=null)?iconeNormale.getIconWidth():0;
    			String titre = tabPane.getTitleAt(tabIndex);
    			FontMetrics metrics = getFontMetrics();
    			int titreWidth = (titre!=null)?metrics.stringWidth(titre):0;
    			int titreHeight = (titre!=null)?metrics.getHeight():0;
    			int height = iconeWidth+titreWidth+textIconGap+1;
    			int width = Math.max(iconeHeight,titreHeight);
    			boolean isSelected = (tabPane.getSelectedIndex()==tabIndex);
    			int tabPlacement = tabPane.getTabPlacement();
    			BufferedImage image = new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);	
    			Graphics2D g2 = image.createGraphics();
    			if(tabPlacement==JTabbedPane.LEFT){g2.translate(0,height);g2.rotate(-Math.PI/2);}
    			else{g2.translate(width,0);g2.rotate(Math.PI/2);}
    			Color background = (isSelected)?UIManager.getColor("TabbedPane.selected"):
    								tabPane.getBackgroundAt(tabIndex);
    			g2.setColor(background);g2.fillRect(0,0,height,width);
    			if(iconeNormale!=null)g2.drawImage(iconeNormale.getImage(),0,0,null);
    			if(titre!=null){
    				g2.setFont(metrics.getFont());
    				g2.setColor(tabPane.getForegroundAt(tabIndex));
    				int mnemIndex = tabPane.getDisplayedMnemonicIndexAt(tabIndex);
    				BasicGraphicsUtils.drawStringUnderlineCharAt(g2,titre, mnemIndex
                                 ,iconeWidth+textIconGap,metrics.getAscent()); 	
    			}
    			g2.dispose();
    			return image;	
    		}
    		private boolean isBottomOrTop(){
    			int tabPlacement = tabPane.getTabPlacement();
    			return tabPlacement==JTabbedPane.TOP||tabPlacement==JTabbedPane.BOTTOM;
    		}
    		protected  int calculateTabHeight(int tabPlacement,int tabIndex,int fontHeight){
    			if(isBottomOrTop()){
    				return super.calculateTabHeight(tabPlacement,tabIndex,fontHeight);	
    			}									
    			return super.calculateTabWidth(tabPlacement,tabIndex,getFontMetrics());										
    		} 
    		protected  int calculateTabWidth(int tabPlacement,int tabIndex,FontMetrics metrics){
    			if(isBottomOrTop()){
    				return super.calculateTabWidth(tabPlacement,tabIndex,metrics);	
    			}
    			return getVerticalImage(tabIndex).getWidth(null);
    		}
    		protected  void paintText(Graphics g, int tabPlacement, Font font
    								, FontMetrics metrics, int tabIndex, String title
    								, Rectangle textRect, boolean isSelected){
    			if(isBottomOrTop()){
    				super.paintText(g,tabPlacement,font,metrics,tabIndex,title,textRect,isSelected);
    			}else{
    				Image image = getVerticalImage(tabIndex);
    				Rectangle r = getTabBounds(tabPane,tabIndex);
    				Insets insets = getTabAreaInsets(tabPlacement);
    				int dx = r.x+insets.top; int dy = r.y;
    				if(tabPlacement==JTabbedPane.LEFT){dy+=insets.left;}
    				else{dy+=insets.right;}
    				g.drawImage(image,dx,dy,null);
    			}
    		} 
    		protected  void paintIcon(Graphics g, int tabPlacement, int tabIndex, 
    								Icon icon, Rectangle iconRect, boolean isSelected){
    			if(!isBottomOrTop()){return;}
    			super.paintIcon(g,tabPlacement,tabIndex,icon,iconRect,isSelected);
    		} 
    	}
    	public static void main(String[] args){new Test();} 
    }
    Désolé, c'est un peu long , mais je vois pas comment faire plus court. NB : c'est pas parfait, il y a un "bug d'affichage" pour l'alignement à droite. J'ai pas du utiliser les bons insets aux bons endroits . Mais, bon ca fonctionne pas trop mal (à tester avec différents fonts et configs).
    J'espère que j'ai pu t'aider. Bonne chance.
    @+
    Les FAQs Java, J2EE, JDBC, Struts > Les cours > Le Forum Java.
    Merci de respecter les règles du club.
    Mon blog : quelques news sur Java, Linux et le monde de l'Open Source.

  10. #10
    Membre régulier Avatar de spoutyoyo
    Inscrit en
    Avril 2004
    Messages
    116
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 116
    Points : 83
    Points
    83
    Par défaut
    Je n'ai pas encore essayé...je viens de voir ta réponse.
    J'ai pas encore très bien compris le principe mais jm'y lance .
    http://www.stop-monsanto.qsdf.org/

  11. #11
    Membre régulier Avatar de spoutyoyo
    Inscrit en
    Avril 2004
    Messages
    116
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 116
    Points : 83
    Points
    83
    Par défaut
    Je te remercie sincerement de m'avoir aidé...ça marche impeccable pour moi.

    Merci
    http://www.stop-monsanto.qsdf.org/

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    86
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 86
    Points : 42
    Points
    42
    Par défaut
    Bonsoir,

    Je viens de tomber sur ce code, et honnêtement, il est excellent !
    Bien joué.

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

Discussions similaires

  1. [AC-2003] Formulaire: texte vertical de bas en haut
    Par Loudjé dans le forum IHM
    Réponses: 12
    Dernier message: 24/01/2012, 09h00
  2. Texte défilant de bas en haut mais qui sort du JPanel
    Par womannosky dans le forum AWT/Swing
    Réponses: 10
    Dernier message: 28/04/2009, 13h02
  3. Texte qui défile de haut en bas.
    Par womannosky dans le forum AWT/Swing
    Réponses: 2
    Dernier message: 13/08/2007, 15h20
  4. [FLASH MX2004] Texte défilant de bas en haut sous un masque !
    Par °°° Zen-Spirit °°° dans le forum Flash
    Réponses: 18
    Dernier message: 28/05/2006, 01h02
  5. Ecrire un text de bas en haut
    Par kcizth dans le forum Balisage (X)HTML et validation W3C
    Réponses: 6
    Dernier message: 14/02/2006, 09h23

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