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 :

Affichage instable avec les composants SWING


Sujet :

AWT/Swing Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Inscrit en
    Juillet 2005
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 8
    Par défaut Affichage instable avec les composants SWING
    Bonjour,

    Je suis bloque sur un problem que je n'arrive pas resoudre:

    J'ai une fenetre JFrame avec un composant JTable dedans, cette JTable
    utilise un TableCellRenderer personnalise. Tout va bien et tout fonctionne
    a merveil, sauf que quand je veux afficher une deuxime fenetre du type
    JDialog ayant comme fenetre mere la JFrame principale, les deux fenetres
    (la JFrame et la JDialog) deviennet totalement instables, les differents
    composants (JButton, JList, etc.) des fenetres s'affichent a moitie et c'est
    pas jolie du tout...

    J'ai fait un test et j'ai desactive la rendu (TableCelleRenderer) de la JTable
    et hop, tout va bien les deux fenetres s'affichent correctement.

    Y'a t-il un moyen d'utiliser un TableCelleRenderer personnalise de sorte
    que ca ne creer pas d'instablilite sur le fonctionnement d'affichage des
    fenetres en Java.

    D'apres ce que j'ai compris la TableCelleRenderer tourne en continue dans
    la JVM et effectue les changements necessaires a la JTable, c'est comme s'il bouclait dans la JVM et je pense que c'est ca qui rends l'affichage instable...

    Merci d'avance pour votre aide,

    ValFajr.

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

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 770
    Par défaut
    Eh bien apparemment tu as commis une grave erreur dans ton TableCelleRenderer. Il faudrait que tu nous montres ton code source.

  3. #3
    Membre du Club
    Inscrit en
    Juillet 2005
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 8
    Par défaut
    Voici mon code:

    ..........

    final String[] columns = {"ID", "Name", "Val", "Type", "Mon", "State"};
    final Object[][] data = new Object[30][6];

    class MyCellRendererGreen extends DefaultTableCellRenderer {
    public Component getTableCellRendererComponent(JTable table,Object value,
    boolean isSelected,boolean hasFocus,int row,int column) {
    JLabel label = (JLabel) super.getTableCellRendererComponent(table,value,isSelected,hasFocus,row,column);
    setBackground(Color.green) ;
    table.repaint() ;
    return label ;
    }
    }

    class MyCellRendererRed extends DefaultTableCellRenderer {
    public Component getTableCellRendererComponent(JTable table,Object value,
    boolean isSelected,boolean hasFocus,int row,int column) {
    JLabel label = (JLabel) super.getTableCellRendererComponent(table,value,isSelected,hasFocus,row,column);
    setBackground(Color.red) ;
    table.repaint() ;
    return label ;
    }
    }

    final TableCellRenderer myCellRendererGreen = new MyCellRendererGreen();
    final TableCellRenderer myCellRendererRed = new MyCellRendererRed();

    table = new JTable(data, columns) {
    public TableCellRenderer getCellRenderer(int row, int column) {

    if ((table.getValueAt(row, 5) != null)) {
    if (table.getValueAt(row, 5).equals("ON")) return myCellRendererGreen ;
    if (table.getValueAt(row, 5).equals("OFF")) return myCellRendererRed ;
    }
    return super.getCellRenderer(row, column);
    }
    };

    table.setPreferredScrollableViewportSize(new Dimension(650, 300));
    table.getTableHeader().setReorderingAllowed(false);
    table.setOpaque(true) ;

    table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);

    ListSelectionModel rowSM = table.getSelectionModel();
    rowSM.addListSelectionListener(new ListSelectionListener() {
    public void valueChanged(ListSelectionEvent e) {
    //Ignore extra messages.
    if (e.getValueIsAdjusting()) return;
    ListSelectionModel lsm = (ListSelectionModel)e.getSource();
    if (lsm.isSelectionEmpty()) {
    System.out.println("No rows are selected.");
    turn(false) ;
    } else {
    int selectedRow = lsm.getMinSelectionIndex();
    currentSelection = (String) table.getValueAt(selectedRow, 1) ;
    if (currentSelection != null) {
    currentRow = selectedRow ;
    turn(true) ;
    }
    else {
    turn(false) ;
    }
    System.out.println("selected= "+currentSelection);
    }
    }
    });


    ............


    Merci,

  4. #4
    Membre du Club
    Inscrit en
    Juillet 2005
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 8
    Par défaut
    Arf, c'etait juste a cause des repaint() dans les deux classes TableCelleRenderer.

    En fait vu que la les instances des classes TableCelleRenderer tournent en continue dans la JVM et qu'elle comportaient un repaint() ca faisait repaint() en boucle sur la JTable et ca rendait l'affichage instable .

    J'ai enlevait les repaint() et tout va bien

    Par contre je ne comprends pas pourquoi ils ont complique a ce point la personnalisation des JTable. Car changer la couleur d'une ligne dans une JTable a mon humble avis ne doit pas avoir besoin de la creation de tout un ensemble de nouvelles classes

    A++
    Val.

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

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 770
    Par défaut
    Je ne comprends pas ce que tu veux dire par "tournent en continu". Effectivement tu réalisais une boucle infinie. Enfin si cela peut paraître un peu lourd pour changer une couleur, tu verras rapidement que c'est extrêmement puissant et que JTable permet de faire des choses assez impressionnantes grâce à ce sytème.

  6. #6
    Membre du Club
    Inscrit en
    Juillet 2005
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 8
    Par défaut
    J'ai trouve ceci dans la javadoc sur le site de sun:

    Class DefaultTableCellRenderer

    Implementation Note: This class inherits from JLabel, a standard component class. However JTable employs a unique mechanism for rendering its cells and therefore requires some slightly modified behavior from its cell renderer. The table class defines a single cell renderer and uses it as a as a rubber-stamp for rendering all cells in the table; it renders the first cell, changes the contents of that cell renderer, shifts the origin to the new location, re-draws it, and so on. The standard JLabel component was not designed to be used this way and we want to avoid triggering a revalidate each time the cell is drawn. This would greatly decrease performance because the revalidate message would be passed up the hierarchy of the container to determine whether any other components would be affected. As the renderer is only parented for the lifetime of a painting operation we similarly want to avoid the overhead associated with walking the hierarchy for painting operations. So this class overrides the validate, invalidate, revalidate, repaint, and firePropertyChange methods to be no-ops and override the isOpaque method solely to improve performance. If you write your own renderer, please keep this performance consideration in mind.


    D'apres ce que je comprend le Renderer est une sorte de Thread qui tourne en continue dans la JVM est fait des modifs quand necessaires. Par exemple dans mon cas j'avais specifie que si la valeur d'une cellule devient egale a "ON" alors changer la couleur de la ligne a laquelle la cellule appartien. Si la Renderer n'est pas une Thread qui tourne en continu dans la JVM alors je ne voit pas comment elle peut savoir qu'il y a eu modifs et qu'elle doit intervenir... D'ailleur c'est pour cela que tout ce que tu met dans la Renderer sera execute en boucle

    A++
    Val.

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

Discussions similaires

  1. Gestion des transactions avec les composants DOA
    Par lper dans le forum Bases de données
    Réponses: 2
    Dernier message: 01/12/2008, 16h06
  2. Probleme avec les composant socket de builder
    Par lol733 dans le forum C++Builder
    Réponses: 4
    Dernier message: 07/10/2006, 12h22
  3. Problème Update Base de données avec les composants ADO
    Par lingli dans le forum Bases de données
    Réponses: 5
    Dernier message: 20/04/2006, 00h41
  4. Violation d'accès avec les composants Word 97/ 2000
    Par edechaux dans le forum Composants VCL
    Réponses: 3
    Dernier message: 07/03/2006, 09h48
  5. Réponses: 13
    Dernier message: 19/01/2006, 10h06

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