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

Interfaces Graphiques en Java Discussion :

[L&F] encore ..


Sujet :

Interfaces Graphiques en Java

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

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 770
    Points : 8 178
    Points
    8 178
    Par défaut
    nicotine : Le meilleur outil que je connaisse pour faire des GUI en Java est NetBeans 5.0. J'utilise personnellement NetBeans 6.0M1 et IntelliJ IDEA 5.1 en meme temps. J'adore NetBeans pour son module de creation de GUI et son Profiler, IntelliJ pour l'editeur. Avant j'utilisais NetBeans 5.0 + Eclipse 3.2. NetBeans est gratuit et tu seras surement seduit par la puissance de son module de creation de GUI.

    Notez que Synthetica est n look and feel gratuit, dans certains cas, et vraiment excellent.
    Romain Guy
    Android - Mon livre - Mon blog

  2. #42
    Membre éclairé
    Avatar de bbclone
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    537
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2006
    Messages : 537
    Points : 704
    Points
    704
    Par défaut
    comparons rapidement 2 outil gratuit :-))
    j'ai voulu mettre aussi eclipse mais juste que depuis que j'ai installer le 3.2 j'ai un petit probleme avec tout mes plugin. je tenterai demain si quelqu'un veut vraiment :-)


    objectif realiser cette toute petite fenetre :



    pour jdev 10g (+tiger), voila le resultat


    et le code obtenu
    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
     
    import java.awt.Dimension;
    import java.awt.GridBagConstraints;
    import java.awt.GridBagLayout;
     
    import java.awt.Insets;
     
    import javax.swing.JButton;
    import javax.swing.JComboBox;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
    import javax.swing.JSeparator;
    import javax.swing.JTextField;
     
    public class JdevCVSConnection extends JPanel {
        private GridBagLayout gridBagLayout1 = new GridBagLayout();
        private JLabel methodeLabel = new JLabel();
        private JComboBox methodComboBox = new JComboBox();
        private JLabel userLabel = new JLabel();
        private JTextField userTextField = new JTextField();
        private JLabel portLabel = new JLabel();
        private JTextField portTextField = new JTextField();
        private JLabel hostLabel = new JLabel();
        private JTextField hostTextField = new JTextField();
        private JLabel repositoryLabel = new JLabel();
        private JTextField repositoryTextField = new JTextField();
        private JSeparator separator = new JSeparator();
        private JPanel buttonsPanel = new JPanel();
        private GridBagLayout gridBagLayout2 = new GridBagLayout();
        private JButton okButton = new JButton();
        private JButton cancelButton = new JButton();
     
        public JdevCVSConnection() {
            try {
                jbInit();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
     
        private void jbInit() throws Exception {
            this.setLayout(gridBagLayout1);
            this.setSize(new Dimension(412, 173));
            methodeLabel.setText("Method:");
            methodComboBox.setPreferredSize(new Dimension(200, 20));
            userLabel.setText("User:");
            portLabel.setText("Port:");
            hostLabel.setText("Host :");
            repositoryLabel.setText("Repository:");
            buttonsPanel.setLayout(gridBagLayout2);
            okButton.setText("Ok");
            okButton.setPreferredSize(new Dimension(80, 22));
            cancelButton.setText("Cancel");
            cancelButton.setPreferredSize(new Dimension(80, 22));
            this.add(methodeLabel,
                     new GridBagConstraints(0, 0, 1, 1, 0.0, 0.0, GridBagConstraints.EAST, GridBagConstraints.NONE,
                                            new Insets(15, 10, 0, 0), 0, 0));
            this.add(methodComboBox,
                     new GridBagConstraints(1, 0, 1, 1, 0.0, 0.0, GridBagConstraints.CENTER, GridBagConstraints.NONE,
                                            new Insets(15, 15, 0, 0), 0, 0));
            this.add(userLabel,
                     new GridBagConstraints(0, 1, 1, 1, 0.0, 0.0, GridBagConstraints.EAST, GridBagConstraints.NONE,
                                            new Insets(5, 0, 0, 0), 0, 0));
            this.add(userTextField,
                     new GridBagConstraints(1, 1, 1, 1, 0.0, 0.0, GridBagConstraints.CENTER, GridBagConstraints.HORIZONTAL,
                                            new Insets(5, 15, 0, 0), 0, 0));
            this.add(portLabel,
                     new GridBagConstraints(2, 1, 1, 1, 0.0, 0.0, GridBagConstraints.CENTER, GridBagConstraints.NONE,
                                            new Insets(5, 10, 0, 0), 0, 0));
            this.add(portTextField,
                     new GridBagConstraints(3, 1, 1, 1, 0.0, 0.0, GridBagConstraints.CENTER, GridBagConstraints.HORIZONTAL,
                                            new Insets(5, 10, 0, 10), 0, 0));
            this.add(hostLabel,
                     new GridBagConstraints(0, 2, 1, 1, 0.0, 0.0, GridBagConstraints.EAST, GridBagConstraints.NONE,
                                            new Insets(5, 0, 0, 0), 0, 0));
            this.add(hostTextField,
                     new GridBagConstraints(1, 2, GridBagConstraints.REMAINDER,
                                            1, 0.0, 0.0, GridBagConstraints.CENTER, GridBagConstraints.HORIZONTAL,
                                            new Insets(5, 15, 0, 10), 0, 0));
            this.add(repositoryLabel,
                     new GridBagConstraints(0, 3, 1, 1, 0.0, 0.0, GridBagConstraints.EAST, GridBagConstraints.NONE,
                                            new Insets(0, 10, 0, 0), 0, 0));
            this.add(repositoryTextField,
                     new GridBagConstraints(1, 3, GridBagConstraints.REMAINDER,
                                            1, 0.0, 0.0, GridBagConstraints.CENTER, GridBagConstraints.HORIZONTAL,
                                            new Insets(5, 15, 0, 10), 0, 0));
            this.add(separator,
                     new GridBagConstraints(0, 4, GridBagConstraints.REMAINDER,
                                            1, 0.0, 0.0, GridBagConstraints.CENTER, GridBagConstraints.HORIZONTAL,
                                            new Insets(5, 10, 5, 5), 0, 0));
            buttonsPanel.add(okButton,
                             new GridBagConstraints(0, 0, 1, 1, 1.0, 1.0, GridBagConstraints.NORTHEAST, GridBagConstraints.NONE,
                                                    new Insets(5, 0, 0, 5), 0, 0));
            buttonsPanel.add(cancelButton,
                             new GridBagConstraints(1, 0, 1, 1, 0.0, 0.0,GridBagConstraints.NORTHEAST, GridBagConstraints.NONE,
                                                    new Insets(5, 0, 5, 10), 0,
                                                    0));
            this.add(buttonsPanel,
                     new GridBagConstraints(0, 5, GridBagConstraints.REMAINDER, GridBagConstraints.REMAINDER,
                                            1.0, 1.0, GridBagConstraints.CENTER, GridBagConstraints.BOTH,
                                            new Insets(0, 0, 0, 0), 0, 0));
        }
    }

    pour netbeans (6.0 beta + mustang), voila le resultat


    et le code obtenu.
    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
     
    /**
     *
     * @author  bebe
     */
    public class NetbeansCVSConnection extends javax.swing.JPanel {
     
        /**
         * Creates new form NetbeansCVSConnection
         */
        public NetbeansCVSConnection() {
            initComponents();
        }
     
        /** This method is called from within the constructor to
         * initialize the form.
         * WARNING: Do NOT modify this code. The content of this method is
         * always regenerated by the Form Editor.
         */
        // <editor-fold defaultstate="collapsed" desc=" Generated Code ">                          
        private void initComponents() {
            methodLabel = new javax.swing.JLabel();
            methodComboBox = new javax.swing.JComboBox();
            userLabel = new javax.swing.JLabel();
            userTextField = new javax.swing.JTextField();
            portLabel = new javax.swing.JLabel();
            portTextField = new javax.swing.JTextField();
            hostLabel = new javax.swing.JLabel();
            hostTextField = new javax.swing.JTextField();
            repositoryLabel = new javax.swing.JLabel();
            repositoryTextField = new javax.swing.JTextField();
            cancelButton = new javax.swing.JButton();
            okButton = new javax.swing.JButton();
            jSeparator1 = new javax.swing.JSeparator();
     
            setPreferredSize(new java.awt.Dimension(348, 154));
            methodLabel.setText("Method:");
            methodLabel.setName("");
            methodLabel.getAccessibleContext().setAccessibleName("methodLabel");
     
            methodComboBox.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "Item 1", "Item 2", "Item 3", "Item 4" }));
     
            userLabel.setText("User:");
     
            portLabel.setText("Port:");
     
            hostLabel.setText("Host:");
     
            repositoryLabel.setText("Repository:");
     
            cancelButton.setText("Cancel");
            cancelButton.setPreferredSize(new java.awt.Dimension(80, 25));
     
            okButton.setText("OK");
            okButton.setPreferredSize(new java.awt.Dimension(80, 25));
     
            javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
            this.setLayout(layout);
            layout.setHorizontalGroup(
                layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGroup(layout.createSequentialGroup()
                    .addContainerGap()
                    .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                        .addComponent(jSeparator1, javax.swing.GroupLayout.DEFAULT_SIZE, 417, Short.MAX_VALUE)
                        .addGroup(layout.createSequentialGroup()
                            .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                                .addComponent(repositoryLabel)
                                .addComponent(hostLabel)
                                .addComponent(userLabel)
                                .addComponent(methodLabel))
                            .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                            .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                .addComponent(hostTextField, javax.swing.GroupLayout.DEFAULT_SIZE, 335, Short.MAX_VALUE)
                                .addGroup(layout.createSequentialGroup()
                                    .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false)
                                        .addComponent(methodComboBox, javax.swing.GroupLayout.Alignment.LEADING, 0, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                                        .addComponent(userTextField, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, 227, Short.MAX_VALUE))
                                    .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                    .addComponent(portLabel)
                                    .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                    .addComponent(portTextField, javax.swing.GroupLayout.PREFERRED_SIZE, 56, javax.swing.GroupLayout.PREFERRED_SIZE))
                                .addComponent(repositoryTextField, javax.swing.GroupLayout.DEFAULT_SIZE, 335, Short.MAX_VALUE)))
                        .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                            .addComponent(okButton, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                            .addComponent(cancelButton, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)))
                    .addContainerGap())
            );
            layout.setVerticalGroup(
                layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGroup(layout.createSequentialGroup()
                    .addGap(25, 25, 25)
                    .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                        .addComponent(methodLabel)
                        .addComponent(methodComboBox, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                    .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                    .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                        .addComponent(userLabel)
                        .addComponent(userTextField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addComponent(portLabel)
                        .addComponent(portTextField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                    .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                    .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                        .addComponent(hostLabel)
                        .addComponent(hostTextField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                    .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                    .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                        .addComponent(repositoryLabel)
                        .addComponent(repositoryTextField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                    .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                    .addComponent(jSeparator1, javax.swing.GroupLayout.PREFERRED_SIZE, 10, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                    .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                        .addComponent(cancelButton, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addComponent(okButton, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                    .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
            );
        }// </editor-fold>                        
     
     
        // Variables declaration - do not modify                     
        private javax.swing.JButton cancelButton;
        private javax.swing.JLabel hostLabel;
        private javax.swing.JTextField hostTextField;
        private javax.swing.JSeparator jSeparator1;
        private javax.swing.JComboBox methodComboBox;
        private javax.swing.JLabel methodLabel;
        private javax.swing.JButton okButton;
        private javax.swing.JLabel portLabel;
        private javax.swing.JTextField portTextField;
        private javax.swing.JLabel repositoryLabel;
        private javax.swing.JTextField repositoryTextField;
        private javax.swing.JLabel userLabel;
        private javax.swing.JTextField userTextField;
        // End of variables declaration                   
     
    }
    (le support de netbeans pour le GridBagLayout est tellement nul que j'ai laisser tomber)



    alors apres c'est question de gouts.
    netbeans peut etre "simple" et puissant mais le code generer laisse vraiment a desirer.

  3. #43
    Membre averti Avatar de nicotine002
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    577
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 577
    Points : 409
    Points
    409
    Par défaut
    J'ai pu essayer jdev et c'est vrai que çà me facilite vraiment la tache mais je ne peux plus dire : "c'est moi qui est tout fait à la main"

    Conçernant netbean et ton exemple, c'est toi qui à decidé de ne pas le faire en GridBag?(j'ai jamais utiliser ce plugin dans netbean).
    Pourquoi ca marche jamais?Vive le café!

  4. #44
    Membre éclairé
    Avatar de bbclone
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    537
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2006
    Messages : 537
    Points : 704
    Points
    704
    Par défaut
    j'ai commencer pour voir ce que ca donnerais avec le GridBagLayout mais c'est long parce que le support est pas terrible.

    si tu veut un rapide exemple:
    dans Jdeveloper tu veux deplacer un composant dans un nouvelle cellule tu peut le faire avec ta souris. (et il ajuste la grille si y a plus de place ...)
    avec netbeans meme le gridx et gridy je devais chaque fois mettre a jour moi meme a la main. la souris ne sers presque a rien.

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

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 770
    Points : 8 178
    Points
    8 178
    Par défaut
    Mais... puisque le design est plus rapide et plus facile avec le GroupLayout de NetBeans, qu'est-ce que cela peut te faire que le code genere soit plus dur a lire ? Ce layout n'a jamais ete pense pour etre utilise par nous, il est fait pour permettre au GUI builder d'etre plus facile et plus puissant.
    Romain Guy
    Android - Mon livre - Mon blog

  6. #46
    Membre éclairé
    Avatar de bbclone
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    537
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2006
    Messages : 537
    Points : 704
    Points
    704
    Par défaut
    le design peut etre un peu plus rapide avec le grouplayout+netbeans. mais parfois quand il propose de s'aligner sur un composant alors qu'on veut juste pas qu'il s'aligne dessus c'est ennuyant. (je supose que je dois un peu mieu decouvrir l'outil pour ne plus avoir ces petit problemes).
    pour le moment je suis plus rapide avec d'autre outil.

    des outils comme netbeans et son module matisse je suis pas contre mais

    1- imagine sur un grand projet avec une dizaine de developeur developer des interfaces avec ca. ceux qui utilisent netbeans serons capable de modifier l'interface, les autres devront télécharger netbeans parce qu'ils oseront pas se risquer dans un code comme celui generer. ce qui est normal parce que comme tu l'a dit c'est pas un layout pour etre utiliser directement par un homme. et imposer un truc a un developeur c'est jamais bon :-)))
    [a part netbeans aucun tool que je connais ne supporte le grouplayout pour le moment. meme si les autres outil le prenent en charge, c'est pas sur qu'il arriveront a comprendre le code de netbeans. JBuilder/Jdev veulent le code dans le jbInit, eclipse et ses nombreux plugin pour faire des interface ont chacun une certaine facon de faire. ca va etre dure de tout standardiser]


    2- le melange avec le "business code" devrait etre plus visible. il faut une vrai separation je veut dire!!!!
    en C++ builder tu a par exemple ton fichier dfm dans lequel se trouve la definition de ton interface et quand tu veut ajouter un evenement sur un bouton ou quelque chose comme ca tu arrives dans un fichier cpp. tout ce qui concerne le gui est completement transparent pour le developeur qui est pas curieu.
    [c'est un peu ce qu'IDEA essaye de faire en proposant de creer directement le byte-code de l'interface avec ses Form et en laissant juste les champs accessibles au developeur parce que je pense que mettre des balise dans le code pour masquer une partie c'est pas tres propre]


    ceci est biensure un avis personel.

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

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 770
    Points : 8 178
    Points
    8 178
    Par défaut
    le design peut etre un peu plus rapide avec le grouplayout+netbeans. mais parfois quand il propose de s'aligner sur un composant alors qu'on veut juste pas qu'il s'aligne dessus c'est ennuyant.
    Tu n'alignes pas tes composants ? Diable. Bref, tu peux quand meme interdire a Matisse d'aligner en appuyant sur Shift ou Alt ou un truc comme ca, je ne sais plus.

    1- imagine sur un grand projet avec une dizaine de developeur developer des interfaces avec ca. ceux qui utilisent netbeans serons capable de modifier l'interface, les autres devront télécharger netbeans parce qu'ils oseront pas se risquer dans un code comme celui generer. ce qui est normal parce que comme tu l'a dit c'est pas un layout pour etre utiliser directement par un homme. et imposer un truc a un developeur c'est jamais bon :-)))
    Ce n'est pas un probleme vraiment lie a l'outil mais a la gestion de l'equipe ca.


    2- le melange avec le "business code" devrait etre plus visible. il faut une vrai separation je veut dire!!!!
    Oui. Cela dit NetBeans a tout de meme le merite de te cacher, et de t'interdire de modifier, le code du GUI.

    Tant mieux si tu es plus a l'aise avec le GridBagLayout mais apres tout ce temps passe sur Swing, je suis bien content que l'on ait enfin un vrai designer comme Matisse.
    Romain Guy
    Android - Mon livre - Mon blog

  8. #48
    Membre éclairé
    Avatar de bbclone
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    537
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2006
    Messages : 537
    Points : 704
    Points
    704
    Par défaut
    Citation Envoyé par gfx
    Tu n'alignes pas tes composants ? Diable.
    l'objectif etait de faire ca


    regarde le separator est un peu plus broche du bord que les textfield a droite.
    (j'ai mis avec le gridbaglayout un insets.right = 10 bout les textfield et un inset.right = 5 pour le separator).

    avec netbeans il propose aligner sur ceci le bouton, sur le textfield sur le bord...

    mais c'est qu'est ce que je disais. je connais pas bien l'outil ;-))


    Citation Envoyé par gfx
    Ce n'est pas un probleme vraiment lie a l'outil mais a la gestion de l'equipe ca.
    un peu des 2 quand meme.
    si les outils (je parle en general et ne met pas netbeans en cause directement donc pas frapper) etait bien concu, ce serait transparent pour tous les developeurs qu'ils utilise eclipse, netbean, idea, jbuilder ou n'importe quoi ;-)
    ce serait bcp mieux je trouve. on peut esperer qu'ils se mettent tous d'accord.

    Citation Envoyé par gfx
    Oui. Cela dit NetBeans a tout de meme le merite de te cacher, et de t'interdire de modifier, le code du GUI.
    c'est vrai tant que je prend pas vi

    soit le debat eternel mon ide est meilleur que le tien parce que quand je clique il fait le cafe et me propose des toast avec n'a pas de sens . c'est juste question de gout ;-)

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

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 770
    Points : 8 178
    Points
    8 178
    Par défaut
    regarde le separator est un peu plus broche du bord que les textfield a droite.
    (j'ai mis avec le gridbaglayout un insets.right = 10 bout les textfield et un inset.right = 5 pour le separator).

    avec netbeans il propose aligner sur ceci le bouton, sur le textfield sur le bord...
    Mais justement ! Le GroupLayout s'assure que tu respecteras les conventions de design de chaque plateforme. Dans ton cas, non seulement tu violes les conventions mais tu fais en plus quelque chose de non portable. Lorsque Matisse te propose d'aligner quelque chose pres du bord, il n'assigne pas une distance en pixels depuis le bord mais un "gap" enonce par les conventions de design de chaque plateforme. Ce gap sera par exemple de 6 pixels sous Windows et de 12 sous Mac (chiffres fantaisistes). Cela evite des problemes majeurs comme des composants Swing qui s'affichent sous le grip des fenetres Mac OS X parce qu'ils sont trop pres des bords. Matisse est vraiment fait pour eviter au developpeur de commettre des erreurs de design.

    Note enfin que je ne defends pas specialement Netbeans puisque j'utilise principalement IntelliJ IDEA (NetBeans me sert de Profiler et de GUI builder). Mais puisque mon travail consiste a developper des interfaces graphiques, j'insiste pour parler de l'outil le plus approprie, aujourd'hui, pour Swing.
    Romain Guy
    Android - Mon livre - Mon blog

  10. #50
    Membre éclairé
    Avatar de bbclone
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    537
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2006
    Messages : 537
    Points : 704
    Points
    704
    Par défaut
    je suis pas designer
    informaticien non plus
    developeur non plus.

    je suis statisticien de formation mais j'ai repris des cours il y a pas longtemps en gestion ;-)
    je suis tomber dans le developement au cours d'informatique il y a pres d'un an et depuis j'ai aimer et j'en fais par "loisir". j'ai meme choisi moi meme un stage en informatique pour voir c'est quoi le developement dans la realiter.


    la fenetre exemple que j'ai "refaite" c'est une fenetre d'idea. je faisait en meme temps que lire ici un checkout et puis j'ai eu l'idee de comparer les codes generer.
    (idea utilise aussi le gridBagLayout pour faire la plupart de ses fenetres ;-) )


    je dis pas que matisse n'est pas un grand pas, mais juste que c'est pas (encore) parfait.

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

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 770
    Points : 8 178
    Points
    8 178
    Par défaut
    Mais je ne dis pas que Matisse est parfait, loin de la.

    je suis pas designer
    informaticien non plus
    developeur non plus.
    Ben justement, autant utiliser des outils qui t'empechent de commettre des erreurs comme tes mauvais espacements dans ton dernier exemple :p
    Romain Guy
    Android - Mon livre - Mon blog

  12. #52
    Membre éclairé
    Avatar de bbclone
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    537
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2006
    Messages : 537
    Points : 704
    Points
    704
    Par défaut
    c'est un truc fait en 3 minutes (montre en main) avec jdev.

    tu essaye de me faire croire qu'avant le GroupLayout aucune application GUI java n'etait portable?
    parce qu'on definissait des vgap, hgap, gridBagConstraints.insets... dur a croire

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

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 770
    Points : 8 178
    Points
    8 178
    Par défaut
    Je ne dis pas qu'elles ne sont pas portables, simplement qu'elles ne respectent pas automatiquement les conventions de design de chaque plateforme et de chaque look and feel. Les insets du GridBag, et ses gaps, sont definis avec un nombre precis de pixels qui ne change pas d'un look and feel a l'autre. Avec GroupLayout, ces ecarts sont definis par chaque look and feel, non pas par l'application. Crois-moi, je viens de passer un an a travailler dans l'equipe Swing et on a beaucoup parle de ces problemes.

    FormLayout de JGoodies possede quant a lui un avantage different, celui de gerer les dialog units. Car 1 pixel n'aura pas toujours le meme aspect sur differents ecrans (quand les dpi changenet, par exemple une interface GridBagLayout sur un ecran 96 dpi sera totalement differente de la meme interface sur un ecran 120 dpi). Avec FormLayout on peut utiliser l'unite "dlu" pour dialog units, qui corrige ce probleme (Visual Basic fait de meme avec les "twips").

    GroupLayout devrait pouvoir profiter de sa notion d'espacements dependants du look and feel pour afficher les GUI correctement suivant le dpi de chaque ecran.

    Bref, ca fait presque 9 ans que je fais du Swing et oui, avant les GUI Swing n'etait pas *totalement* portables d'un look and feel a l'autre (ce n'est toujours pas le cas mais un des plus gros problemes a ete resolu avec GroupLayout).
    Romain Guy
    Android - Mon livre - Mon blog

  14. #54
    Membre éclairé
    Avatar de bbclone
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    537
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2006
    Messages : 537
    Points : 704
    Points
    704
    Par défaut
    Citation Envoyé par gfx
    Dans ton cas, non seulement tu violes les conventions mais tu fais en plus quelque chose de non portable.
    tu a dit ca plus haut :-)

    FormLayout je connais assez bien aussi. ;-)

    et je sais qui tu est, je lis ton blog de temps a autre.

  15. #55
    Membre éclairé
    Avatar de bbclone
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    537
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2006
    Messages : 537
    Points : 704
    Points
    704
    Par défaut
    juste une derniere chose Romain Guy, (je voulais demander hier mais je me suis dit que je t'ennuyait avec mes question)

    pourquoi n'avoir pas ajouter cette notion de "gap dependant du l&f" au autre LayoutManager?

    la baseline a aussi ete rajouter au layoutManager ou ca avait un sens (FlowLayout, SpringLayout, GridBagLayout...) pourquoi ne pas avoir rajouter ces "gaps"?

    ps: a celui qui a creer ce sujet, faux nous excuser si on a completement polluer ton avec nos discussion

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

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 770
    Points : 8 178
    Points
    8 178
    Par défaut
    Pour la compatibilite
    Romain Guy
    Android - Mon livre - Mon blog

  17. #57
    Membre éclairé
    Avatar de bbclone
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    537
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2006
    Messages : 537
    Points : 704
    Points
    704
    Par défaut
    compatibilite :-)
    c'est pas la premiere fois que j'entend cette reponse chez des gens qui travaillent pour sun :-))

    je suis pas ingenieur chez sun et je remet pas en doute leur capacites. pas du tout!
    mais encore une fois j'ai du mal a comprendre, desole.

    pour le GridBagLayout des constante ont ete rajouter (comme GridBagConstraints.ABOVE_BASELINE ou GridBagConstraints.BELOW_BASELINE_LEADING) et tout est gerer en interne au layout. Ceux qui veulent continuer a utilise le GridBagLayout comme avant ils peuvent.

    alors je vois pas pourquoi rajouter des constante pour definir des comportement particulier et des gaps particulier serait un probleme? c'est peut etre bcp de boulot pour les gens qui travail chez sun mais je vois pas qu'est ce qui pourrait empecher l'ajout de cette "fonctionnalite".

    t'a pas un exemple clair qui explique qu'est ce qui serait plus (retro) compatible?

    en tout cas merci pour la reponse :-))

  18. #58
    Membre averti Avatar de nicotine002
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    577
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 577
    Points : 409
    Points
    409
    Par défaut
    ps: a celui qui a creer ce sujet, faux nous excuser si on a completement polluer ton avec nos discussion
    Ca m'interresse énormément
    Pourquoi ca marche jamais?Vive le café!

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

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 770
    Points : 8 178
    Points
    8 178
    Par défaut
    Le cas des baselines est tres different car les ingenieurs de Sun ont simplement rajoute des valeurs a une enumeration existante. Dans le cas des gaps, la valeur numerique fournie est la valeur en pixels du gap. Puisqu'il ne faut pas changer la signature de GridBagConstraints pour la compatibilite, les types doivent rester des int.

    Donc comment fais-tu la difference entre un int qui dirait "ceci est le gap de l'OS, quel qu'il soit" et "ceci est une taille en pixels" ? Que donnerais-tu comme valeurs aux nouvelles constantes ? On pourrait toujours utiliser des nombres negatifs mais qui sait si l'application de quelqu'un ne repose pas sur la possibilite d'utiliser un gap negatif ?

    Une autre solution consiste a ajouter des methodes a l'API il y a deux problemes. Le premier est que l'on aurait alors la possibilite de specifier les gaps en pixels tout en pouvant donner une constante qui dirait d'ignorer lesdits gaps (par exemple new GridBagConstraints(..., new Insets(2, 2, 2, 2), 0, 0, GridBagConstraints.USE_LEFT_SYSTEM_GAP | GridBagConstraints.USE_RIGHT_SYSTEM_GAP)). C'est pas terrible comme approche. Le deuxieme probleme est qu'au moment ou GroupLayout a ete inclus dans le JDK, il etait tres difficile, presque impossible, de modifier les API publiques du JDK pour des raisons de stabilite du code.

    Alors peut-etre pour Dolphin... en attendant tu peux ouvrir un ticket sur la Bug Parade de Sun et proposer une solution. Ou mieux, participer au projet PeaBody pour fournir toi-meme le patch qui ajouterait ce support au GridBagLayout.

    Pour avoir bosse sur le JDK je sais a quel point il est difficile de le modifier. Etant donne la taille de la base de code, de son age et de l'incroyable quantite de plateformes (OS + versions du JDK) a supporter et le nombre de gens a bosser dessus, rien de tout cela ne me parait anormal.
    Romain Guy
    Android - Mon livre - Mon blog

  20. #60
    Membre éclairé
    Avatar de bbclone
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    537
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2006
    Messages : 537
    Points : 704
    Points
    704
    Par défaut
    je pensais plus a un truc comme ca

    exemple simpliste bien sur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    JButton myButton = ...
    GridBagConstraints gbc = new GridBagConstraints();
    gbc.gridx = ..
    ...
    gbc.fill = GridBagConstraints.FILL_HORIZONTAL_AND_BE_AWARE_OF_CONTAINER'S_GAPS;
     
    myContainer.add(myButton, gbc);
    et dans le layoutContainer de ton layoutManager on calcule la taille du composant.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    int width = parent.getUsableWidth(); // methode qui retourn la largeur du container sans les gap a gauche et a droite.
    myComponent.setBounds(x, y, width, ...);

    si on defini des insets

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    GridBagConstraints gbc = new GridBagConstraints();
    gbc.insets = new Insets(10, 10, 10, 10);
     
    gbc.fill = GridBagConstraints.FILL_HORIZONTAL_AND_BE_AWARE_OF_RIGHT_CONTAINER'S_GAP;
     
    myContainer.add(myButton, gbc);
    pareil que juste avant dans le layoutContainer tu calcule la taille en diminuant les gaps qui faut et ensuite les insets.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    int width = parent.getWidth();
    if (mustSubstractRightGap()) {
        width -=  getRightContainerGap(); // or getRightParentGap();
    }
    if (mustSubstractLeftGap()) {
        width -=  getLeftContainerGap();
    }
     
    width -= constraint.insets.right; // width = parentWidth - rightgap - insets.right 
    width -= constraint.insets.left;
    myComponent.setBounds(x, y, width, ...);
    j'ai pas vraiment penser a la question du comment mais c'est juste une idee que j'avais. ca ne casse pas la compatibilite parce que la seule chose qu'on fait c'est ajouter des constante entiere dans la classe GridBagConstraints et dans le layout manager (ici gridBagLayout) tu fais tout le traitement. ce sera alors au developeur de savoir ce qu'il veut et d'ecrire ses constrainte correctement. (c'est aussi un peu comme ca que ca a ete coder le support de la baseline).

    je comprend que c'est une chose delicate a faire au niveau programmation mais realisable quand meme. surtout avec des padding et des insets negatifs mais c'est faisable.

    a ta reponse precedente, j'ai compris que c'etait impossible. maintenant je sais que c'est possible et faut juste que quelqu'un qui a bcp de patience se lance :-))
    mais je suis sur que d'autre vrai developeur se pose les meme questions :-))

    perso, je travaille sur differents projets open source sur lesquel j'apprend bcp. Participer a Dolphin serait pas trop possible pour moi (faute de temps et certainment de connaissance ;-) ).


    et merci pour ces precisions. :-)

+ Répondre à la discussion
Cette discussion est résolue.
Page 3 sur 4 PremièrePremière 1234 DernièreDernière

Discussions similaires

  1. Programmer encore en VB 6 c'est pas bien ? Pourquoi ?
    Par Nektanebos dans le forum Débats sur le développement - Le Best Of
    Réponses: 85
    Dernier message: 10/03/2009, 14h43
  2. TEdit (encore)
    Par dj.motte dans le forum C++Builder
    Réponses: 5
    Dernier message: 23/12/2002, 19h02
  3. TPalette (encore)
    Par Flipper dans le forum Langage
    Réponses: 3
    Dernier message: 28/11/2002, 23h45

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