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 :

JCheckBox : écrire sur plusieurs lignes


Sujet :

Composants Java

  1. #1
    Expert éminent sénior
    Avatar de Auteur
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    7 649
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 7 649
    Points : 11 138
    Points
    11 138
    Par défaut JCheckBox : écrire sur plusieurs lignes
    bonsoir,

    dans mon application java j'utilise une JCheckBox dont je peux personnaliser le contenu. Il s'avère que si le contenu est trop long je dois écrire le texte sur deux lignes.

    J'ai utilisé la syntaxe HTML pour écrire le texte :
    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 MyCheckBox extends JCheckBox
    {
        public MyCheckBox ()
        {
            super();
        }
     
        @Override
        public void setText(String text)
        {
            StringBuilder str = new StringBuilder();
     
            str.append("<html><span>");
            str.append(text);
            str.append("</span></html>");
     
            super.setText(str.substring(0));
     
        }
     
    }
    Mais lorsque je quitte l'application j'ai une exception sur la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    super.setText(str.substring(0));
    Exception while removing reference: java.lang.InterruptedException
    java.lang.InterruptedException
    at java.lang.Object.wait(Native Method)
    at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:118)
    at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:134)
    at sun.java2d.Disposer.run(Disposer.java:127)
    at java.lang.Thread.run(Thread.java:662)

    Si je rajoute un try catch() l'exception n'est plus levée. Où est mon erreur

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    107
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 107
    Points : 120
    Points
    120
    Par défaut
    Salut,

    je viens de tester ton bout de code et il marche très bien chez moi. Je l'ai même mis sur 5 ligne, et ca passe.

    Ca ne viendrait pas plutot de ta méthode qui appelle le setText() ?

  3. #3
    Expert éminent sénior
    Avatar de Auteur
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    7 649
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 7 649
    Points : 11 138
    Points
    11 138
    Par défaut
    j'avoue que je ne sais pas
    Peut-être est-ce la surcharge de la fonction...

    Ce qui est surprenant c'est que genre d'exception survient si un thread a été mal arrêté non ? L'appel à setText() ne se fait pas dans un thread que j'aurais pu créer...

    D'après le message l'erreur survient au moment d'un "dispose()". Donc voici le contexte :

    Le checkBox en question est sur ma Frame principale : lorsque je fais un clic droit sur le composant un JDialog me permet de changer l'intitulé du checkbox.
    La méthode setText() évite donc à l'utilisateur de taper les balises et est appelée aussi bien dans la Frame principale que dans le JDialog.

    Le problème ne survient uniquement lorsque je quitte mon application : là je fais des dispose() sur mes JDialog. Est-ce un appel à setText() au moment où le JDialog est détruit qui provoque cette erreur ?

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    107
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 107
    Points : 120
    Points
    120
    Par défaut
    A chaque fois que j'utilise un jDialog, je libère ses ressources juste après utilisation en faisant un dispose.

    Je viens de tester en faisant un dispose à la fermeture de mon JDialog. et je n'ai pas rencontré ton problème.

    Et j'ai également tester en faisant mes disposes lors de la fermeture du programme.

    Le problème viendrait peu être de l'ordre d'appel de tes disposes. Peu etre qu'un de tes JDialog est en train de modifier un checkBox. Enfin la j'avoue que je ne sais pas non plus d'ou pourrait provenir l'erreur.

    Moi ce que je te conseil c'est qu'a chaque fois que tu fais un setVisible(false) tu fais suivre cette instruction d'un dispose().

    faire un truc du genre dans le JDialog:
    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
     
    public final static int OK = 0;
        public final static int NOK = 1;
        public int reponse = NOK;
    public String nom_du_check="";
     
    public void close(int rep){
     
            reponse = rep;
            setVisible(false);
            dispose();
        }
     
    /**bouton valider*/
    private void ValiderActionPerformed(java.awt.event.ActionEvent evt) {
     
            if(!jTextField1.getText().equals("")){
                nom_du_check = jTextField1.getText();
            }
            close(OK);
        }
     
    /**bouton annuler*/
        private void AnnulerActionPerformed(java.awt.event.ActionEvent evt) {
     
            close(NOK);
        }

    et dans ton programme sur le clique droit :

    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
     
    private void monCheckBoxMousePressed(java.awt.event.MouseEvent evt) {
     
            if (evt.getButton() == MouseEvent.BUTTON3) {
                //clique droit
     
                DialChangeNomCheckBox monDial = new DialChangeNomCheckBox(null, true);
                monDial.setVisible(true);
     
                if (monDial.reponse == DialChangeNomCheckBox.OK) {
    //changement du nom du checkBox
                    monCheckBox.setText(monDial.nom_du_check);
                }
            }
        }

  5. #5
    Expert éminent sénior
    Avatar de Auteur
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    7 649
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 7 649
    Points : 11 138
    Points
    11 138
    Par défaut
    Je viens de réaliser un test : le bug se produit avec le look and feel Metal.
    Avec un autre LAF (Windows) je n'ai pas de problème.

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    107
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 107
    Points : 120
    Points
    120
    Par défaut
    Ah interessant ca. Je suis sous linux là donc je ne peux pas t'aider pour le moment. Mais si tu trouve quelque chose fait le savoir car je suis interessé. Merci

  7. #7
    Expert éminent sénior
    Avatar de Auteur
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    7 649
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 7 649
    Points : 11 138
    Points
    11 138
    Par défaut
    Plus de précision peut-être :
    Le JCheckBox est inclus dans un JPanel avec un TitleBorder. Lorsque j'écris sur plusieurs lignes, il arrive que le texte passe au-dessus de la bordure (bref le composant sort du JPanel).
    Du coup je me demande si le bug ne viendrait pas d'une fonction paintComponent() Je précise également que je ne surcharge pas les fonctions graphiques.

    [edit]
    à propos du dispose() : tu exécutes donc cette fonction après chaque setVisible(false).
    Dispose() permet bien de libérer les ressources ou je me trompe ?
    Je pensais qu'il fallait faire un dispose() lors de la fermeture du programme, non ?
    [/edit]

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    107
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 107
    Points : 120
    Points
    120
    Par défaut
    Pour ce qui est du dispose,

    effectivement, cette fonction libère les ressources graphiques alloué à ton composant.

    Dans le cas que je t'ai montré, je dispose() juste apres le setVisible car dans mon idée je sais que je ne vais pas ouvrir régulièrement cette fenetre.

    Mais si tu as besoin d'ouvrir régulièrement cette fenetre ( genre toutes les minutes) alors ne fait pas de dispose.
    Car lors du setVisible(true) java alloue la mémoire nécessaire à l'affichage à ton composant.
    Donc ca peu prendre du temps en fonction de ton interface.

    Ensuite, je pense également que le garbage collector dispose automatiquement un composant si celui ci n'a pas été utilisé depuis un moment. Mais la je ne suis pas sur. A confirmer.

    Mais attention, si tu instancie plusieurs fois ton composant ( dans notre cas le JDialog) et que tu ne dispose pas l'ancien, tu risque d'avoir un soucis mémoire.

  9. #9
    Expert éminent sénior
    Avatar de Auteur
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    7 649
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 7 649
    Points : 11 138
    Points
    11 138
    Par défaut
    Citation Envoyé par Rhadamenthys Voir le message
    Pour ce qui est du dispose,

    effectivement, cette fonction libère les ressources graphiques alloué à ton composant.
    Ok c'est bien ce qu'il me semblait, merci pour la confirmation

    Citation Envoyé par Rhadamenthys Voir le message
    Mais attention, si tu instancie plusieurs fois ton composant ( dans notre cas le JDialog) et que tu ne dispose pas l'ancien, tu risque d'avoir un soucis mémoire.
    Je l'instancie une fois : dans ma classe principale j'ai 1 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    JDialog jd = new JDialog();
    ensuite si j'en ai besoin je fais un setVisible(true) et lors de la fermeture un setVisible(false), le dispose est à la fermeture de l'application.


    Sinon pour en revenir au LAF Metal, sous Linux il doit fonctionner puisque c'est du Swing ?

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    107
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 107
    Points : 120
    Points
    120
    Par défaut
    Bah comme je suis au boulot, ca je le testerais quand j'aurais un trou Mais je te tiens au courant.

    Pour complément au dispose, Si tu dispose un JDialog et qu'a l'interieur tu as des JTextField par exemple, tu aura toujours acces aux valeurs des jTextFiled.

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

Discussions similaires

  1. [POI / JXL] écrire sur plusieurs lignes dans excel
    Par LinoaHeart dans le forum Documents
    Réponses: 0
    Dernier message: 30/09/2009, 11h52
  2. Comment écrire la commande d'un job sur plusieurs lignes ?
    Par clementratel dans le forum Microsoft BI
    Réponses: 4
    Dernier message: 10/11/2008, 17h02
  3. comment écrire une équation sur plusieurs lignes?
    Par nunuss35 dans le forum Mathématiques - Sciences
    Réponses: 7
    Dernier message: 29/09/2008, 18h07
  4. écrire sur plusieurs lignes dans un fichier
    Par kenny49 dans le forum Langage
    Réponses: 3
    Dernier message: 06/04/2007, 11h47
  5. écrire le texte d'un label sur plusieurs lignes
    Par sweetdreamer dans le forum Composants VCL
    Réponses: 9
    Dernier message: 03/05/2006, 14h11

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