IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

AWT/Swing Java Discussion :

JXTable: le renderer redessiné en permanence


Sujet :

AWT/Swing Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Octobre 2010
    Messages
    205
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 205
    Par défaut JXTable: le renderer redessiné en permanence
    Bonjour,

    J'ai un JXTable, j'ai deux points que je souhaiterai éclairer:
    1) dès lors que je bouge ma souris sur une ligne, le renderer est redessiné, est-ce normal? Je souhaiterai éviter ça car je pense que ça peut être la raison à un autre problème que je recontre. Voici mon renderer:
    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
     
    public class ProgressBarTableRenderer extends DefaultTableCellRenderer {
     
        public ProgressBarTableRenderer() {
    	super();
    	setOpaque(true);
    	panel = new ProgressBarTablePanel();
        }
     
        @Override
        public Component getTableCellRendererComponent(JTable table, Object value,
    	    boolean isSelected, boolean hasFocus, int row, int column) {
    	System.out.println(0);
    	if (((ProgressContext) value).getProgress() < 100) {
    	    panel.getProgressBar().setValue(
    		    ((ProgressContext) value).getProgress());
    	}
    	return panel;
        }
     
        private ProgressBarTablePanel panel;
    }
    2) Mon renderer contient un jtooglebutton, je clique sur celui-ci appartenant à une ligne (il devient alors enfoncé), je clique sur un autre jtogglebutton d'une autre ligne, celui-ci devient enfoncé, le précédent bouton perd l'état de bouton enfoncé, comment cela se fait-il?

    Merci de votre aide,
    Babas007

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

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Par défaut
    Pour la JXTable il est fortement recommandé de ne pas utilsier les renderer standard.

    Il faut passer par le mécanisme de providers.

    Petit exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
     
    package swingx.renderer;
     
    import javax.swing.BorderFactory;
    import javax.swing.JFrame;
    import javax.swing.JProgressBar;
    import javax.swing.JScrollPane;
    import javax.swing.UIManager;
    import javax.swing.UnsupportedLookAndFeelException;
    import javax.swing.table.DefaultTableModel;
     
    import org.jdesktop.swingx.JXTable;
    import org.jdesktop.swingx.renderer.CellContext;
    import org.jdesktop.swingx.renderer.CheckBoxProvider;
    import org.jdesktop.swingx.renderer.ComponentProvider;
    import org.jdesktop.swingx.renderer.DefaultTableRenderer;
     
    public class ProgressBarProvider extends ComponentProvider<JProgressBar> {
     
        @Override
        protected void format(CellContext context) {
     
        }
     
        @Override
        protected void configureState(CellContext context) {
            rendererComponent.setValue((Integer) context.getValue());
        }
     
        @Override
        protected JProgressBar createRendererComponent() {
            JProgressBar b = new JProgressBar();
            b.setStringPainted(false);
            b.setBorderPainted(false);
            b.setBorder(BorderFactory.createEmptyBorder());
            return b;
        }
     
        public static void main(String[] args) {
     
            try {
                UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
            } catch (ClassNotFoundException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (InstantiationException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (UnsupportedLookAndFeelException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            String[] titles = { "Hello", "progress", "status" };
            Object[][] values = { { "a", 99, true }, { "b", 68, false },
                    { "c", 25, true } };
            DefaultTableModel m = new DefaultTableModel(values, titles) {
                @Override
                public Class<?> getColumnClass(int columnIndex) {
                    // TODO Auto-generated method stub
                    if (columnIndex == 0) {
                        return String.class;
                    } else if (columnIndex == 1) {
                        return Integer.class;
                    } else {
                        return Boolean.class;
                    }
                }
            };
     
            JXTable table = new JXTable(m);
            table.setDefaultRenderer(Integer.class, new DefaultTableRenderer(
                    new ProgressBarProvider()));
            table.setDefaultRenderer(Boolean.class, new DefaultTableRenderer(
                    new CheckBoxProvider()));
     
            JFrame f = new JFrame();
            f.add(new JScrollPane(table));
            f.pack();
            f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
            f.setLocationRelativeTo(null);
            f.setVisible(true);
        }
    }
    Autre conseil, pour les états booléens, les checkbox sont vachement plus lisibles que les JToggleButton dans une JTable.

    Les JToggleButton seraient plutôt à réserver aux toolbars dans l'ensemble.

Discussions similaires

  1. [JXTable] Renderer pour JButton
    Par rednik dans le forum Composants
    Réponses: 6
    Dernier message: 20/08/2008, 11h26
  2. [jxtable] Renderer pour masquer certaines colonnes
    Par Renaud-62 dans le forum Composants
    Réponses: 9
    Dernier message: 17/07/2008, 21h58
  3. [Jtable] renderer?
    Par britou dans le forum Composants
    Réponses: 5
    Dernier message: 18/05/2004, 12h10
  4. Render to texture???
    Par sebh dans le forum OpenGL
    Réponses: 2
    Dernier message: 17/01/2004, 09h50
  5. redessiner une Image1 avant de poursuivre
    Par jakouz dans le forum Composants VCL
    Réponses: 4
    Dernier message: 18/11/2003, 16h57

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