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 :

Redimensionnement des composants


Sujet :

Agents de placement/Fenêtres Java

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    201
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 201
    Points : 108
    Points
    108
    Par défaut Redimensionnement des composants
    Salut,

    J'ai une classe Tabs qui me dessine des onglets. Elle me dessine par défaut une surface, avec la méthode drawRect, d'une taille donnée (800x600 ici).
    Dans mon applet je fais:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    public void init() {
                   setLayout(new BorderLayout());
                   tabs = new Tabs(25, 25, getSize().width - 6, getSize().height - 10, 1);
     
    (...)
                   panTabs = new Panel();
                   panTabs.setLayout(new BorderLayout());
                   panTabs.add(tabs);
     
                   add("Center", panTabs);
    }
    Je lance ensuite l'applet dans une popup javascript et si je redimensionne la fenêtre, ce fameux rectagle ne se redimensionne pas ... J'aimerais qu'il s'étire en long et en large, normalement le layout manager BorderLayout fait celà...

  2. #2
    Gfx
    Gfx est déconnecté
    Expert éminent
    Avatar de Gfx
    Inscrit en
    Mai 2005
    Messages
    1 770
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 770
    Points : 8 178
    Points
    8 178
    Par défaut
    On peut voir le code de la classe Tabs ?

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    201
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 201
    Points : 108
    Points
    108
    Par défaut
    C'est un peu long mais oui ..

    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
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    280
    281
    282
    283
    284
    285
    286
    287
    288
    289
    290
    291
    292
    293
    294
    295
    296
    297
    298
    299
    300
    301
    302
    303
    304
    305
    306
    307
    308
    309
    310
    311
    312
    313
    314
    315
    316
    317
    318
    319
    320
    321
    322
    323
    324
    325
    326
    327
    328
    329
    330
    331
    332
    333
    334
    335
    336
    337
    338
    339
    340
    341
    342
    343
    344
    345
    346
    347
    348
    349
    350
    351
    352
    353
    354
    355
    356
    357
    358
    359
    360
    361
    362
    363
    364
    365
    366
    367
    368
    369
    370
    371
    372
    373
    374
    375
    376
    377
    378
    379
    380
    381
    382
    383
    384
    385
    386
    387
    388
    389
    390
    391
    392
     
    public class Tabs extends Panel {
     
      //how much tabs can be enabled
      int maxAuthorized = 4;
     
      // Fonts
      Font tabFontPlain = new Font("Helvetica", Font.PLAIN, 12);
      Font tabFontBold = new Font("Helvetica", Font.BOLD, 12);
      FontMetrics fmBoldFont = getFontMetrics(tabFontBold);
     
      //couleurs utilisees
      Color bgDefaultColor = new Color(230, 230, 230);
      Color extraLightColor = Color.white;
      Color lightColor = new Color(223, 223, 223);
      Color shadowColor = new Color(128, 128, 128);
      Color extraShadowColor = Color.black;
      Color txtMouseOverColor = new Color(43, 98, 255);
      Color txtColor = Color.black;
      Color txtDisabledColor = shadowColor;
     
      // Déplacement de l'applet vers le haut en pixels
      static final int upSel = 2;
     
      // Déplacement Horizontal et Vertical pour les coins arrondis
      static final int roundHorz = 2;
      static final int roundVert = 2;
     
      // Endroit où on commence à écrire la chaîne
      static final int xTitle = 7;
      static final int yTitle = 3;
     
      // Hauteur de l'image des onglets
      int Z;
     
      // La largeur de la ligne qu'on utilise pour dessiner
      int lineWeight;
     
      //longueur et hauteur totale des onglets et du cadre
      int X = 800;
      int Y = 600;
     
      // Information sur chaque onglet :name, début, fin (en pixels), couleurs, activés
      // Donc, un max de 25 onglets = largement suffisant
      final int nbMax = 25;
      Panel tabPanel[] = new Panel[nbMax];
      String tabName[] = new String[nbMax];
      int tabEnd[] = new int[nbMax];
      int tabBegin[] = new int[nbMax];
      Color tabColors[] = new Color[nbMax];
      boolean tabEnabled[] = new boolean[nbMax];
     
      // Nombre total des onglets ajoutes
      int nbTabs = 0;
      // Quel onglet a ete selected
      int selected = 0;
      // Quel onglet a ete surligne
      int mousedOver =- 1;
     
      // X, Y : longueur, hauteur totale des onglets (avec les panels)
      // posX, posY : le coin haut gauche des Onglets a l'interieur de l'applet
      public Tabs(int posX, int posY, int X, int Y) {
      	this(posX, posY, X, Y, 2);
      }
     
      //X, Y : longueur, hauteur totale des onglets (avec les panels)
      // posX,posY : le coin haut gauche des Onglets a l'interieur de l'applet
      // largeur de la bordure des onglets
      public Tabs(int posX, int posY, int X, int Y, int borderWeight) {
        this.X = X;
        this.Y = Y;
        this.setBounds(posX, posY, X, Y);
        this.setBackground(bgDefaultColor);
        this.setLayout(null);
        lineWeight = borderWeight;
        Z = fmBoldFont.getHeight() + (2 * lineWeight) + (2 * yTitle) + 1;
      }
     
      //Ajout d'un onglet
      public void addTab(String name, Panel p) {
     
        if ((nbTabs >= tabBegin.length) || (p == this)) return;
     
        tabName[nbTabs] = name;
        tabBegin[nbTabs] = (nbTabs == 0) ? 0 : ((nbTabs==1) ? tabEnd[nbTabs-1] - lineWeight : tabEnd[nbTabs-1]);
        tabEnd[nbTabs]=(nbTabs == 0) ? (2 * xTitle + fmBoldFont.stringWidth(name)) + (4 * lineWeight) : tabBegin[nbTabs] + (2 * xTitle) + fmBoldFont.stringWidth(name) + (2 * lineWeight);
        tabColors[nbTabs] = bgDefaultColor;
        tabEnabled[nbTabs] = true;
     
        if(nbTabs >= maxAuthorized) tabEnabled[nbTabs] = false;
     
        //on ne peut pas rajouter 2 fois le meme Panel ou avec le meme name
        for(int i = 0; i < nbTabs; i++) {
        	if (tabPanel[i] == p || tabName[i].equals(name)) return;
        }
     
        //on ne peut pas ajouter plus d'onglets que la largeur du Panel
        if (tabEnd[nbTabs] > X) return;
     
        p.setBounds(lineWeight, Z + 1, X - (2 * lineWeight), Y - Z - lineWeight - 1);
        this.add(p);
     
        //seulement le premier onglet sera affiche au debut
        if (nbTabs != selected) {
        	p.setVisible(false);
        }
     
        tabPanel[nbTabs] = p;
        nbTabs++;
      }
     
      //vous DEVEZ appeler cette fonction newName l'appel de
      //ajouteOnglet, supprimeOnglet, metCouleurOnglet, activeOnglet, desactiveOnglet, renamemeOnglet et selectOnglet
      //dans des conditions "dynamiques", cad pas dans le constructeur ou init
      //rafraichit les onglets, cad redessine tout
      public void refreshTabs() {
      	paint(getGraphics());
      }
     
      //suppression d'un onglet
      public void removeTab(String name) {
        //on cherche l'onglet que l'on veut supprimer
        for(int i = 0; i < nbTabs; i++) {
          if (tabName[i].equals(name)) {
            this.remove(tabPanel[i]);
            selectTab(tabName[0]);
            int tabWeight = tabEnd[i] - tabBegin[i];
     
            //recalcul de la taille des onglets
            for(int j = i; j < nbTabs - 1; j++) {
              if (j == 0) {
                tabEnd[j] += lineWeight;
                tabBegin[j] += lineWeight;
              }
              else {
                tabEnd[j] = tabEnd[j + 1] - tabWeight;
                tabBegin[j] = tabBegin[j + 1] - tabWeight;
              }
              tabName[j] = tabName[j + 1];
              tabColors[j] = tabColors[j + 1];
              tabEnabled[j] = tabEnabled[j + 1];
              tabPanel[j] = tabPanel[j + 1];
            }
            nbTabs--;
            return;
          }
        }
      }
     
      //met la couleur dans l'onglet donne
      public void setTabColor(String name, Color col) {
        //on cherche l'onglet
        for(int i = 0; i < nbTabs; i++) {
          if (tabName[i].equals(name)) {
            tabColors[i] = col;
            return;
          }
        }
      }
     
      //desactive l'onglet specifie
      public void disableTab(String name) {
        //on cherche l'onglet
        for(int i = 0; i < nbTabs; i++) {
          if (tabName[i].equals(name)) {
            tabEnabled[i] = false;
            return;
          }
        }
      }
     
      //active l'onglet specifie
      public void enableTab(String name) {
        //on cherche l'onglet
        for(int i = 0; i < nbTabs; i++) {
          if (tabName[i].equals(name)) {
          	if(i>=maxAuthorized) return;
            tabEnabled[i] = true;
            return;
          }
        }
      }
     
      // Pour renommer un onglet
      public void renameTab(String currentName, String newName) {
        //on cherche l'onglet que l'on veut renommer
        for(int i = 0; i < nbTabs; i++) {
          if(tabName[i].equals(currentName)) {
            int diff = fmBoldFont.stringWidth(newName) - fmBoldFont.stringWidth(currentName);
     
            //si le last ne depasse pas le cadre
            if ((tabEnd[nbTabs - 1]) + diff > X) return;
     
            tabName[i] = new String(newName);
            tabEnd[i] += diff;
     
            //recalcul de la taille des onglets
            for(int j = i + 1; j < nbTabs; j++) {
              tabEnd[j] += diff;
              tabBegin[j] += diff;
            }
     
            break;
          }
        }
      }
     
      //pour selectionner et afficher un onglet donne
      public void selectTab(String name) {
        //on cherche l'onglet
        for(int i = 0; i < nbTabs; i++) {
          if (tabName[i].equals(name)) {
            if(i == selected || !tabEnabled[i]) return;
            //restauration de la taille de l'onglet selected precedement
            tabBegin[selected] += lineWeight;
            tabEnd[selected] -= lineWeight;
            tabPanel[selected].setVisible(false);
     
            //on selectionne et on affiche l'onglet selected
            selected = i;
            tabPanel[selected].setVisible(true);
     
            //elargissement de l'onglet selected currentrament
            tabBegin[i] -= lineWeight;
            tabEnd[i] += lineWeight;
            return;
          }
        }
      }
     
      //dessine l'onglet numero current
      private void drawTab(int current){
        if (current < 0 || current >= nbTabs) return;
        Graphics g = getGraphics();
        //pour le selected, c'est special
        int notSelected = (current==selected) ? 0 : 1;
        g.setFont((current == selected) ? tabFontBold : tabFontPlain);
     
        //pour mettre la couleur pour cet onglet
        g.setColor(tabColors[current]);
        if (current == selected) {
        	g.fillRect(tabBegin[current] + lineWeight, lineWeight + (notSelected * upSel), tabEnd[current] - tabBegin[current] - (2 * lineWeight), Z);
        }
        else {
        	g.fillRect(tabBegin[current] + lineWeight, lineWeight + (notSelected * upSel), tabEnd[current] - tabBegin[current] - 2 * lineWeight, Z - ((2 * lineWeight) + (notSelected * upSel)) + 1);
        }
     
        g.setColor(shadowColor);
        for(int i = lineWeight; current != (selected - 1) && i > 0; i--) {
          //dessine la ligne droite de l'onglet
          g.drawLine(tabEnd[current] - i, notSelected * upSel + roundVert, tabEnd[current] - i, Z- lineWeight + i - i * notSelected);
          //l'arrondi droit de l'onglet=point sur la diagonale
          if(i==1) {
          	g.setColor(extraLightColor);
          	g.drawLine(tabEnd[current] - lineWeight - 1, notSelected * upSel + 1, tabEnd[current] - lineWeight - 1, notSelected * upSel+lineWeight);
          }
        }
     
        //on ecrit la chaine
        if (tabEnabled[current]) {
          if (current == mousedOver) {
          	g.setColor(txtMouseOverColor);
          }
          else {
          	g.setColor(txtColor);
          }
        }
        else {
        	g.setColor(txtDisabledColor);
        }
     
        g.drawString(tabName[current], tabBegin[current] + lineWeight * (2 - notSelected) + xTitle, notSelected * upSel + yTitle + lineWeight + fmBoldFont.getAscent());
     
        g.setColor(extraLightColor);
        for(int i = 0; i < lineWeight; i++) {
          if (i == 1) g.setColor(lightColor);
          int last = (i == lineWeight - 1 && i != 0) ? -1 : 0;
          //dessine la ligne du haut de l'onglet
          g.drawLine(tabBegin[current] + roundHorz + i + last, notSelected * upSel + i, tabEnd[current] - lineWeight - roundHorz, notSelected * upSel + i);
          if (current != (selected + 1)) {
            //dessine la ligne gauche de l'onglet
            g.drawLine(tabBegin[current] + i, notSelected * upSel + roundVert, tabBegin[current] + i, Z - lineWeight + i - i * notSelected);
            //l'arrondi gauche de l'onglet=un point sur la diagonale
            if (i==0) {
            	g.drawLine(tabBegin[current] + 1, notSelected * upSel + 1, tabBegin[current] + 1, notSelected * upSel + 1);
            }
          }
        }
      }
     
      //dessine les onglets et le contour
      public void paint(Graphics g){
        //on met tout a zero
        g.setColor(bgDefaultColor);
        g.fillRect(0, 0, X, Z + 1);
     
        //un par un on dessine les onglets
        for(int current = 0; current < nbTabs; current++) {
          drawTab(current);
        }//fin for
     
        //on fait le grand contour
        g.setColor(extraLightColor);
        for(int i = 0; i < lineWeight; i++) {
          if (i==1) g.setColor(lightColor);
          //dessine la ligne du bas des onglets (haut du contour)
          //1 :jusqu'a l'onglet currentant
          if (selected != 0) {
          	g.drawLine(i, Z - lineWeight + i + 1, tabBegin[selected] + i, Z - lineWeight + i + 1);
          }
          //2 :newName l'onglet courant
          g.drawLine(tabEnd[selected] - i, Z - lineWeight + i + 1, X, Z - lineWeight + i + 1);
          //dessine la ligne de gauche du contour
          g.drawLine(i, Z - (lineWeight - i - 1), i, Y);
        }
        g.setColor(shadowColor);
        for(int i = lineWeight; i > 0; i--) {
          //if(i==1) g.setColor(couleurExtraOmbre);
          //dessine la ligne du bas du contour
          g.drawLine(i - 1, Y - i, X, Y - i);
          //dessine la ligne droite du contour
          g.drawLine(X - i, Z - (lineWeight - i), X - i, Y);
        }
      }
     
      //on determine quand un onglet a ete selectionne
      public boolean mouseDown(Event event, int x, int y) {
        //calcule sur quel onglet different on a clique
        if (y < Z) {
          for(int i = 0; i < nbTabs; i++) {
            if (x > tabBegin[i] && x < tabEnd[i] && i != selected && tabEnabled[i]) {
              selectTab(tabName[i]);
              //on redessine tout
              refreshTabs();
              return true;
            }
          }
        }
        return false;
      }
     
      //on determine quand un onglet doit etre surligne
      public boolean mouseMove(Event event, int x, int y) {
        int currentName = mousedOver;
        //calcule sur quel onglet different la souris est passee
        if ( y < Z) {
          for(int i = 0; i < nbTabs; i++) {
            if (x < tabEnd[i] && x > tabBegin[i]) {
              //rien a faire si on est deja dans le bon onglet
              if (i == mousedOver) return true;
              if (!tabEnabled[i]) {
                //redessine les onglets si la souris passe au-dessus d'un onglet desactive
                //rien n'est surligne
                //ne redessine pas quand on passe d'un onglet desactive
                //a un autre onglet desactive
                if(currentName != nbTabs) {
                  mousedOver = nbTabs;
                  drawTab(currentName);
                }
                return true;
              }
              mousedOver = i;
              //on redessine les deux onglets en question
              drawTab(currentName);
              drawTab(mousedOver);
              return true;
            }
          }
        }
        else {
          //redessine les onglets si la souris passe au-dessus d'un onglet desactive
          //rien n'est surligne
          if (currentName != nbTabs) {
            mousedOver = nbTabs;
            drawTab(currentName);
          }
        }
        return false;
      }
     
      //pour determiner quand la souris est sortie du composant
      public boolean mouseExit(Event event, int x, int y) {
        int currentName = mousedOver;
        //redessine les onglets si la souris passe au-dessus d'un onglet desactive
        //rien n'est surligne
        if(currentName != nbTabs) {
          mousedOver = nbTabs;
          drawTab(currentName);
        }
        return true;
      }
    }

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    201
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 201
    Points : 108
    Points
    108
    Par défaut
    Je me demande si je fais bien de reprogrammer tous les composants avec AWT, ne devrais-je pas utiliser SWING ?
    Je connais peu le JAVA, je programme uniquement en C. Là je dois faire une applet pour un serveur développé en C justement ...

  5. #5
    Gfx
    Gfx est déconnecté
    Expert éminent
    Avatar de Gfx
    Inscrit en
    Mai 2005
    Messages
    1 770
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 770
    Points : 8 178
    Points
    8 178
    Par défaut
    Je te conseille Swing en effet mais je viens de me rendre compte d'un truc tout bête à priori. Tu parles de redimensionner la fenêtre, mais il s'agit d'une fenêtre du navigateur qui contient l'applet, c'est bien ça ? Pas d'une fenêtre Java ? Si c'est le cas le problème vient de la page HTML qui ne redimensionne pas l'applet (ce qui est le comportement attendu).

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    201
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 201
    Points : 108
    Points
    108
    Par défaut
    Mais je ne peux pas redimensionner une applet à la volée via HTML / JavaScript ... donc comment j'dois m'y prendre ?

  7. #7
    Gfx
    Gfx est déconnecté
    Expert éminent
    Avatar de Gfx
    Inscrit en
    Mai 2005
    Messages
    1 770
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 770
    Points : 8 178
    Points
    8 178
    Par défaut
    Tu dois pouvoir le faire en JavaScript avec une instruction comme document.getElementById('myapplet').width = 700 par exemple.

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    201
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 201
    Points : 108
    Points
    108
    Par défaut
    Ok merci beaucoup : )
    Niveau portabilité plus ça va plus je me limite ... AWt -> SWING, et maintenant le JavaScript : |

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    201
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 201
    Points : 108
    Points
    108
    Par défaut
    Il suffisait d'insérer le paramètre MAYSCRIPT dans la balise <applet>. Mais mon problème n'est tjs pas résolu. En effet l'applet se redimensionne mais pas le cadre principal de mes onglets. Une idée ?

  10. #10
    Gfx
    Gfx est déconnecté
    Expert éminent
    Avatar de Gfx
    Inscrit en
    Mai 2005
    Messages
    1 770
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 770
    Points : 8 178
    Points
    8 178
    Par défaut
    mayscript fait l'inverse, c'est-à-dire qu'il autorise l'applet à manipuler les objets JavaScript de la page conteneur. Ce paramètre n'est pas nécessaire pour permettre au JavaScript de contrôler l'applet.

    En ce qui concerne la taille de ton cadre, apparemment tu utilises la variable X pour connaître sa largeur. En regardant ton code je ne vois nulle part un endroit où tu modifies X qui vaut donc toujours 800.

  11. #11
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    201
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 201
    Points : 108
    Points
    108
    Par défaut
    Je pensais justement que les layout prendraient en charge son redimensionnement, mais apparemment ce n'est pas le cas.

    Le résultat:

    .


    Donc selon toi je dois redimensionner le cadre à partir d'un évènement ? Mais lequel ? (je code en JAVA que depuis trois jours, désolé)

  12. #12
    Gfx
    Gfx est déconnecté
    Expert éminent
    Avatar de Gfx
    Inscrit en
    Mai 2005
    Messages
    1 770
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 770
    Points : 8 178
    Points
    8 178
    Par défaut
    Le layout s'occupe de ça mais il faut que tu lises les valeurs toi-même. Tu peux utiliser getWidth() par exemple pour connaître la largeur de ton composant. Si tu utilisais Swing tu aurais un composant déjà existant pour faire des onglets (JTabbedPane).

  13. #13
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    201
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 201
    Points : 108
    Points
    108
    Par défaut
    J'ai essayé de voir pour SWING mais j'ai été bloqué par la personnalisation des onglets. Là mes onglets ont un style et des couleurs fixes. J'ai vu qu'il existe les look and feel pour SWING mais pour la portabilité il faut l'inclure dans le .jar de l'applet apparemment, ce qui doit poser quelques problèmes de lenteur au chargement. AWT semble bien plus difficile d'approche étant donné qu'il faut reprogrammer chaque composant dans mon cas, mais la portabilité est meilleure... J'ai vu que tu faisais parti de l'équipe de développement de SWING, tu dois en savoir long sur la question, peut-être que je me trompe donc ? : )

    EDIT: J'ai fait:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    X = getSize().width;
    Y = getSize().height;
    Dans la méthode paint, et ça marche super : )

  14. #14
    Gfx
    Gfx est déconnecté
    Expert éminent
    Avatar de Gfx
    Inscrit en
    Mai 2005
    Messages
    1 770
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 770
    Points : 8 178
    Points
    8 178
    Par défaut
    La portabilité de Swing n'est pas moins bonne qu'AWT puisque Swing est une (grosse) extension d'AWT. Si tu regardes les composants Swing tu verras qu'ils héritent tous de java.awt.Component, de java.awt.Window, de java.awt.Frame. Swing est même plus portable puisque les look and feels cross-platforms, dont celui par défaut qui est Metal ou Ocean dans Java 1.5, sont exactement pareils sous Windows, Linux, MacOS X, etc. AWT change forcément d'apparence suivant l'OS. Ca peut avoir une incidence quand tu fais des trucs dans ton interface au pixel près.

    Si tu veux personnaliser des choses aussi simples que la couleur des onglets tu n'es pas obligé de réécrire un look and feel complet mais tu peux te contenter d'écrire un UI delegate pour le JTabbedPane. C'est-à-dire que tu n'écris qu'un bout de look and feel, destiné uniquement au JTabbedPane. Ce n'est pas très dur à faire.

    Le plus important dans le choix d'AWT ou Swing est de savoir si tu veux pouvoir cibler les ordinateurs ne disposant, sous Windows, que de la JVM de Microsoft (livrée avec Windows 95 et 98 par exemple). Les nouvelles version de Java sont cependant très répandues donc ce ne sera pas forcément un problème dans ton cas (et tu peux générer du code HTML avec le JDK pour lancer le téléchargement de la bonne version de Java de Sun si l'utilisateur ne l'a pas). Enfin ça reste ton choix

  15. #15
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    201
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 201
    Points : 108
    Points
    108
    Par défaut
    Alala j'commençais à m'débrouiller avec AWT ... mais tu vas réussir à m'faire changer d'avis j'crois. Je vais regarder de plus près ce qu'est un UI delegate et faire un choix définitif avant que mon code devienne trop volumieux : )
    Merci beaucoup pour tous ces conseils et le temps que tu as consacré à me répondre.

  16. #16
    Gfx
    Gfx est déconnecté
    Expert éminent
    Avatar de Gfx
    Inscrit en
    Mai 2005
    Messages
    1 770
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 770
    Points : 8 178
    Points
    8 178
    Par défaut
    Le problème d'AWT est qu'il ne va jamais vraiment évoluer, contrairement à Swing. De rien pour les réponses, c'est normal

  17. #17
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    201
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 201
    Points : 108
    Points
    108
    Par défaut
    Oui mais c'est ce qui fait que ça reste extrêmement portable, non ?

    Une dernière question, si je peux m'permettre d'abuser de ton temps libre...
    Si tu as lu le code de la classe Tabs, tu as vu que dans la méthode addTab j'ajoute un Panel. Le problème lorsque je l'utilise c'est que si je crée un nouveau composant (un autre Panel qui intègre un Canvas et une Scrollbar pour reprogrammer un TextArea) eh bien rien ne s'affiche ... En revanche n'importe quel autre composant AWT s'affiche sans problème.

    Ma classe qui dessine le Canvas:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    class ChatArea extends Canvas {
     
    	public void paint(Graphics g) {
     
    		g.setColor(Color.white);
     
    		g.fillRect(0, 0, getSize().width, getSize().height);
    	}
    }
    Celle qui construit le TextArea personnalisé:
    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
     
    public class ChannelWindow extends Panel {
     
    	GridBagLayout gbl = new GridBagLayout();
    	GridBagConstraints gbc = new GridBagConstraints();
    	ChatArea chatArea = new ChatArea();
    	Scrollbar sc = new Scrollbar();
    	Panel pan = new Panel();
     
    	public ChannelWindow() {
     
    		pan.setLayout(gbl);
     
    		// Fenetre de chat
    		gbc.gridx = 0;
    		gbc.gridy = 0;
    		gbc.fill = GridBagConstraints.BOTH;
    		gbc.ipadx = 1;
    		gbc.ipady = 1;
    		gbc.anchor = GridBagConstraints.WEST;
    	  gbc.weightx = 1;
    	  gbc.weighty = 1;
     
    		gbl.setConstraints(chatArea, gbc);
    		pan.add(chatArea);
     
    		// Scrollbar
    		gbc.gridx++;
    		gbc.gridy = 0;
    		gbc.fill = GridBagConstraints.VERTICAL;
    		gbc.ipadx = 0;
    		gbc.ipady = 1;
    		gbc.anchor = GridBagConstraints.EAST;
    	  gbc.weightx = 0;
    	  gbc.weighty = 1;
     
    	  gbl.setConstraints(sc, gbc);
    		pan.add(sc);
    	}
    }
    Et l'applet:
    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
     
    Tabs tabs, Chan;
    Panel panChan;
     
    (...)
     
    public void init() {
         setLayout(new BorderLayout());
     
         tabs = new Tabs(25, 25, getSize().width - 6, getSize().height - 10, 1);
     
         panChan = new Panel();
         panChan.setLayout(null);
         panChan.add(chanWnd);
     
         (...)
     
         tabs.addTab("Ongtlet 1", panChan);
     
         add(tabs);
    }
     
    public Insets getInsets() {
         return new Insets(3, 3, 3, 3);
    }

  18. #18
    Gfx
    Gfx est déconnecté
    Expert éminent
    Avatar de Gfx
    Inscrit en
    Mai 2005
    Messages
    1 770
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 770
    Points : 8 178
    Points
    8 178
    Par défaut
    Dans ta classe ChannelWindow tu ajoutes les composants enfants dans un Panel appelé pan. Supprimer la variable "pan" et remplace les appels "pan.add()" par "add()" tout court. Puisque tu hérites de Panel tu peux utiliser la classe elle-même.

    Je ne comprends pas bien ce que tu entends par "portabilité" en fait ^^

  19. #19
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    201
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 201
    Points : 108
    Points
    108
    Par défaut
    Merci c'était bien ça ..

    Par "portabilité" j'entends par là ce qu'on entend généralement quand on en parle (je pense). A l'exception près qu'on ne parle pas ici de portabilité suivant l'OS, étant donné que JAVA est un langage "semi-interprété", mais de la JVM sur laquelle il s'exécute. Donc je veux dire qu'un code portable en JAVA doit pouvoir s'exécuter sur toutes les JVM sans présenter trop de changements.
    Mais sans parler portabilité ne gagne-t-on pas au niveau de la taille finale de l'exécutable ?

    Y a des pour et des contre des deux cotés je crois : P

  20. #20
    Gfx
    Gfx est déconnecté
    Expert éminent
    Avatar de Gfx
    Inscrit en
    Mai 2005
    Messages
    1 770
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 770
    Points : 8 178
    Points
    8 178
    Par défaut
    Ton programme Java ne sera pas plus gros avec Swing qu'AWT puisque la compilation ne fait intervenir que ton code, rien d'autre. Je comprends mieux ton souci concernant la portabilité d'une JVM à l'autre mais en pratique tu n'en trouveras pas beaucoup qui ne gèrent pas Swing. Comme je le disais, ça dépend de ta cible

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Redimensionnement des composants
    Par adjoly dans le forum Qt
    Réponses: 3
    Dernier message: 27/04/2009, 15h24
  2. Redimensionnement des composants à l'intérieur d'un GridLayout
    Par keul85 dans le forum Agents de placement/Fenêtres
    Réponses: 7
    Dernier message: 11/04/2008, 00h34
  3. Pas de redimensionnement des composants
    Par Dimitri_87 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 3
    Dernier message: 05/03/2008, 11h32
  4. pb de redimensionnement des composants?
    Par kheldoun ahmed dans le forum Delphi
    Réponses: 1
    Dernier message: 20/05/2007, 17h25
  5. redimensionnement des composants par l'utilisateur
    Par osoumayaj dans le forum JBuilder
    Réponses: 2
    Dernier message: 05/10/2006, 11h15

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