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

Composants Java Discussion :

JTable & Look and feel


Sujet :

Composants Java

  1. #1
    Membre à l'essai
    Profil pro
    Architecte IT
    Inscrit en
    Janvier 2006
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Architecte IT

    Informations forums :
    Inscription : Janvier 2006
    Messages : 24
    Points : 23
    Points
    23
    Par défaut JTable & Look and feel
    Bonjour,
    j'ai crée un look and feel spécifique et sur les JTable, les renderers et editors ne prennent pas par défaut le bon composant UI pour les composants genre JComboBox et continuent d'être ceux de Metal.

    J'ai donc redéfini les renderers et forcé le setUI sur chaque objet "exotique" de la table (par exemple une JComboBox), pour les renderers.

    N'y a-t-il pas une méthode plus simple ? Doit-on faire un traitement particulier pour forcer la prise en compte des composants UI dans la JTable ?

    En effet, l'analyse des performances s'avère assez mauvaise avec cette méthode (pas mal d'instances créées).

    Merci d'avance.

  2. #2
    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
    tu dois dire un peu plus si tu veut de l'aide.

    1- tu as crer un Look and feel complet ? (t'es sur c'est pas un theme pour le laf metal?)
    2- tu extend d'un laf existant?
    3- si c'est un laf complet tu dois avoir une table de UIDefaults pour chaque composant? tu a fait ca?

    si tu veut de l 'aide, faut expliquer comment tu a fait ton laf ;-)

  3. #3
    Membre à l'essai
    Profil pro
    Architecte IT
    Inscrit en
    Janvier 2006
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Architecte IT

    Informations forums :
    Inscription : Janvier 2006
    Messages : 24
    Points : 23
    Points
    23
    Par défaut
    Oui j'aurais du préciser excusez-moi.

    En fait j'ai créé un L&F complet qui étends Metal. J'ai créé les classes UI qui vont bien (ButtonUI etc...), j'ai assigné chaque composant UI avec la bonne classe dans mon L&F dans la méthode initClassDefaults de la classe du L&F.

    J'ai donc une table AvTableUI qui étends BasicTableUI.

    Lorsque j'essaie de mettre un bouton dans une table (avec un model qui renvoie la bonne valeur dans le getColumnClass et que je crée un renderer pour le JButton), il s'affiche en Metal lorsque je met mon L&F, l'editor est aussi celui du bouton Metal.
    (Note, si je suis en L&F Metal, Motif ou Windows le bouton s'affiche pareil dans la JTable)

    Dans la méthode installUI, j'ai donc forcé l'installation de renderers spécifiques et forcé un setUI sur ma classe UI si une cellule est de type Button, ComboBox...

    Ma question est donc: n'y a-t-il pas moyen d'éviter celà en faisant en sorte que chaque composant dans la JTable prenne le bon composant UI ? Peut-être il y a-t-il une manière spécifique de coder le renderer ?

  4. #4
    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 ComponentUI utiliser pour dessiner un composant vient des UIDefaults. si tu as mis

    table.put("ButtonUI", "package.sub.package.MyButtonUI")

    (table c'est la table UIDefaults de ton Laf)


    si tu as fait ca, c'est cette classe qui doit etre utiliser. ca vient de la sauf si tu change pour un composant en faisant un setUI dessus. c'est tu a mis dans ton UIDefaults la bonne classe et que t'a encore un probleme, le probleme vient de quelque part d'autre alors (normalement :-) )

  5. #5
    Membre à l'essai
    Profil pro
    Architecte IT
    Inscrit en
    Janvier 2006
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Architecte IT

    Informations forums :
    Inscription : Janvier 2006
    Messages : 24
    Points : 23
    Points
    23
    Par défaut
    Oui j'ai bien fait cela, j'ai bien associé chaque composant avec son UI et mon bouton normal s'affiche comme je veux mais dans une JTable.

    Pas d'idée particulière ? les composants UI sont les mêmes dans la JTable non ?

  6. #6
    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 viens de faire le test.

    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
     
    import java.awt.BorderLayout;
    import java.awt.Color;
    import java.awt.Component;
    import static java.awt.EventQueue.invokeLater;
    import java.awt.Graphics;
    import java.awt.Graphics2D;
    import java.awt.Rectangle;
    import java.awt.EventQueue;
    import java.text.MessageFormat;
    import java.lang.reflect.InvocationTargetException;
     
    import javax.swing.AbstractButton;
    import javax.swing.JButton;
    import javax.swing.JComponent;
    import javax.swing.JFrame;
    import javax.swing.JScrollPane;
    import javax.swing.JTable;
    import javax.swing.UIManager;
    import javax.swing.plaf.ComponentUI;
    import javax.swing.plaf.metal.MetalButtonUI;
    import javax.swing.table.TableCellRenderer;
     
    /**
     * Created by IntelliJ IDEA.
     * User: bebe
     * Date: 21-Oct-2006
     * Time: 10:23:43
     *
     * THIS IS A REALLY REALLY DIRTY CODE !
     * ONLY FOR TEST PURPOSE !
     *
     */
    public class MyButtonUI extends MetalButtonUI {
     
        private final static MyButtonUI buttonUI = new MyButtonUI();
     
        public static ComponentUI createUI(JComponent c) {
            return buttonUI;
        }
     
        public void paint(Graphics g, JComponent c) {
            Graphics2D g2D = (Graphics2D) g;
            Rectangle rec1 = new Rectangle(0, 0, c.getWidth(), c.getHeight());
     
            g2D.setColor(Color.WHITE);
            g2D.fill(rec1);
     
            super.paintText(g, c, rec1, ((AbstractButton) c).getText());
        }
     
        /**
         * @param args
         */
        public static void main(String[] args) {
     
            /* First put the following try/catch in comment. (stop your comment just
               before next comment).
               See what's happen. (you should see the default OceanTheme in action :-)) ).
     
               Uncomment these lines again, and you should see the button UI (MyButtonUI) in action.
               */
            try {
                EventQueue.invokeAndWait(new Runnable() {
                    public void run() {
                        UIManager.put("ButtonUI", "MyButtonUI");
                    }
                });
            } catch (InterruptedException e) {
                e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
            } catch (InvocationTargetException e) {
                e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
            }
            /* comment till here */
     
            invokeLater(new Runnable() {
                public void run() {
                    JFrame myFrame = new JFrame("This is my frame");
     
                    Object[][]o = {
                            {"Hello", "The", "World"},
                            {"I'm", "dizzy", "this morning"}
                    };
                    String[] columnNames = {"1", "2", "3"};
     
                    JTable myTable = new JTable(o, columnNames) {
                        public Component prepareRenderer(TableCellRenderer renderer, int row, int column) {
                            return new JButton(MessageFormat.format("row {0}, col {1}", new Object[]{row, column}));
                        }
                    };
     
                    myFrame.add(new JScrollPane(myTable));
                    myFrame.add(new JButton("I am a button"), BorderLayout.SOUTH);
                    myFrame.pack();
                    myFrame.setLocationRelativeTo(null);
                    myFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     
                    myFrame.setVisible(true);
                }
            });
        }
    }
    essaye avec ton ButtonUI et dis moi qu'est ce que t'a comme resultat.

    je repete que ceci est un code vraiment pas propre du tout et ne gere rien du tout.

  7. #7
    Membre à l'essai
    Profil pro
    Architecte IT
    Inscrit en
    Janvier 2006
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Architecte IT

    Informations forums :
    Inscription : Janvier 2006
    Messages : 24
    Points : 23
    Points
    23
    Par défaut
    Tout d'abord merci pour ton code.
    J'ai bien le fond en blanc sur les boutons de la table + le bouton à part.
    Mais si tu remplaces ta méthode paint en faisant un:

    c.setBackground(Color.RED);

    seul le bouton à part a un fond rouge...

    Cela continue à me faire penser qu'il y a un truc étrange... une idée ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    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
    package monpackage;
     
     
    import java.awt.BorderLayout;
    import java.awt.Color;
    import java.awt.Component;
    //import static java.awt.EventQueue.invokeLater;
    import java.awt.Graphics;
    import java.awt.Graphics2D;
    import java.awt.Rectangle;
    import java.awt.EventQueue;
    import java.text.MessageFormat;
    import java.lang.reflect.InvocationTargetException;
     
    import javax.swing.AbstractButton;
    import javax.swing.JButton;
    import javax.swing.JComponent;
    import javax.swing.JFrame;
    import javax.swing.JScrollPane;
    import javax.swing.JTable;
    import javax.swing.UIManager;
    import javax.swing.plaf.ComponentUI;
    import javax.swing.plaf.metal.MetalButtonUI;
    import javax.swing.table.TableCellRenderer;
     
    /**
     * Created by IntelliJ IDEA.
     * User: bebe
     * Date: 21-Oct-2006
     * Time: 10:23:43
     *
     * THIS IS A REALLY REALLY DIRTY CODE !
     * ONLY FOR TEST PURPOSE !
     *
     */
    public class MyButtonUI extends MetalButtonUI {
     
        private final static MyButtonUI buttonUI = new MyButtonUI();
     
        public static ComponentUI createUI(JComponent c) {
            return buttonUI;
        }
     
        public void paint(Graphics g, JComponent c) {
     
            super.paint(g,c);
     
        	c.setBackground(Color.RED);
        }
     
        /**
         * @param args
         */
        public static void main(String[] args) {
     
            /* First put the following try/catch in comment. (stop your comment just
               before next comment).
               See what's happen. (you should see the default OceanTheme in action :-)) ).
     
               Uncomment these lines again, and you should see the button UI (MyButtonUI) in action.
               */
            try {
                EventQueue.invokeAndWait(new Runnable() {
                    public void run() {
                        UIManager.put("ButtonUI", "monpackage.MyButtonUI");
                    }
                });
            } catch (InterruptedException e) {
                e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
            } catch (InvocationTargetException e) {
                e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
            }
            /* comment till here */
     
            EventQueue.invokeLater(new Runnable() {
                public void run() {
                    JFrame myFrame = new JFrame("This is my frame");
     
                    Object[][]o = {
                            {"Hello", "The", "World"},
                            {"I'm", "dizzy", "this morning"}
                    };
                    String[] columnNames = {"1", "2", "3"};
     
                    JTable myTable = new JTable(o, columnNames) {
                        public Component prepareRenderer(TableCellRenderer renderer, int row, int column) {
                            return new JButton(MessageFormat.format("row {0}, col {1}", new Object[]{new Integer(row), new Integer(column)}));
                        }
                    };
     
                    myFrame.getContentPane().add(new JScrollPane(myTable));
                    myFrame.getContentPane().add(new JButton("I am a button"), BorderLayout.SOUTH);
                    myFrame.pack();
                    myFrame.setLocationRelativeTo(null);
                    myFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     
                    myFrame.setVisible(true);
                }
            });
        }
    }
    Petite précision: je suis en 1.4.2 j'ai donc du un peu adapter le code (genre les imports static ça passe pas).

  8. #8
    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
    bonjour mikaMike,

    est ce que tu peut expliquer qu'est ce que t'essaye de faire??? je comprend plus rien

    l'exemple que j'ai mis c'est un truc fais de facon sale. c'est pas un truc que tu dois faire, je voulais juste te montrer que ce que tu disais ca marche. que c'est la meme classe UI appeler
    mais c'est pas comme ca que tu met un renderer JButton dans ta JTable. tu dois passer par un VRAI renderer.

    un truc comme ca
    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
     
    MyButtonCellRenderer extends JButton implements TableCellRenderer {
     
        public MyButtonCellRenderer() {
            setHorizontalAlignment(JLabel.CENTER);
            setBackground, setForeground, ....
        }
     
        public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
            if (value != null) {
                setText(String.valueOf(value));
            } else {
                setText("");
            }
     
            if (isSelected) ... 
            if (hasFocus)....
     
     
            return this;
        }
    }
    de plus le test que j'avais mis c'est un truc rapide. j'avais pas fait les methode paintFocus, paintButtonPressed... c'est un truc trop rapide pour etre utiliser. c'est alors normal que des truc Metal s'affiche. ;-)

    pars de ton code et explique ce que t'essaye de faire. sinon moi je sais pas qu'est ce que tu veut faire...

    ps: j'ai jamais utiliser java 1.4

Discussions similaires

  1. Ligne d'une jTable avec look and feel du header
    Par nddvlp dans le forum Composants
    Réponses: 5
    Dernier message: 05/11/2013, 11h46
  2. [Look and feel] Texte des JLabels en gras
    Par aliasjcdenton dans le forum AWT/Swing
    Réponses: 11
    Dernier message: 26/01/2006, 11h49
  3. [JTable]Problême de Look and Feel???
    Par D-Phaz dans le forum Composants
    Réponses: 1
    Dernier message: 05/08/2005, 15h24
  4. Nouveau look and feel
    Par julian_ross dans le forum JBuilder
    Réponses: 6
    Dernier message: 16/12/2003, 15h55
  5. Jbuilder9 Look and feel de borland
    Par wsrudmen dans le forum JBuilder
    Réponses: 6
    Dernier message: 26/06/2003, 18h07

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