2016-12-21 1 views
0

Bonjour J'essaie d'afficher une chaîne ("Nombre de caractères:") et un compte de caractères dynamiques en bas de JTextArea. Lorsque j'exécute ce code ci-dessous, un panneau s'ouvre sans characterCountTitle. Seulement quand je commence à taper, CharacterCountTitle s'affiche et le nombre est correctement dynamique.Portée variable de AddDocumentListener lors de la création de deux titres (en utilisant TitledBorder) dans Java Swing

Mon but est d'afficher characterCountTitle (chaîne + nombre de caractères) dès que le panneau est ouvert aux utilisateurs.

private void initComponents() { 
    this.notePanel.getNoteDocument().addDocumentListener(new DocumentListener() { 

     TitledBorder characterCountTitle; 
     Border emptyBorder; 

     public void insertUpdate(DocumentEvent e) { 
      displayEditInfo(e); 
     } 

     public void removeUpdate(DocumentEvent e) { 
      displayEditInfo(e); 
     } 

     public void changedUpdate(DocumentEvent e) { 
      displayEditInfo(e); 
     } 

     private void displayEditInfo(DocumentEvent e) { 
      Document document = e.getDocument(); 

      emptyBorder = BorderFactory.createEmptyBorder(); 

      //displays a string of "Character Count: " and another string of dynamic character count 
      characterCountTitle = BorderFactory.createTitledBorder(emptyBorder, "Character Count: " + document.getLength()); 
      characterCountTitle.setTitlePosition(TitledBorder.BOTTOM); 
      panel.setBorder(characterCountTitle); 
     } 
    }); 

    this.panel.add(notePanel, BorderLayout.CENTER); 
    this.panel.add(navigation.buildPanel(), BorderLayout.SOUTH); 
} 

En raison de cette question, je tentais de créer deux titres; un pour la chaîne (à l'extérieur de addDocumentListener) et un pour le nombre de caractères (à l'intérieur de la méthode displayEditInfo), mais cela perturbe la portée de la variable.

J'apprécierais grandement votre contribution!

Répondre

3

Vous pouvez simplement créer et ajouter votre bordure extérieure de la DocumentListener, et il suffit de changer le texte du titre sur les événements de document:

private void initComponents() { 


     Border emptyBorder = BorderFactory.createEmptyBorder(); 
     final TitledBorder characterCountTitle = BorderFactory.createTitledBorder(emptyBorder, "Character Count:"); 
     characterCountTitle.setTitlePosition(TitledBorder.BOTTOM); 
     panel.setBorder(characterCountTitle); 

     this.notePanel.getNoteDocument().addDocumentListener(new DocumentListener()     { 

     public void insertUpdate(DocumentEvent e) { 
      displayEditInfo(e); 
     } 

     public void removeUpdate(DocumentEvent e) { 
      displayEditInfo(e); 
     } 

     public void changedUpdate(DocumentEvent e) { 
      displayEditInfo(e); 
     } 

     private void displayEditInfo(DocumentEvent e) { 
      Document document = e.getDocument(); 


      //displays a string and dynamic character count 
      characterCountTitle.setTitle("Character Count: " + document.getLength()); 
      panel.repaint(); 

     } 
    }); 

    this.panel.add(notePanel, BorderLayout.CENTER); 
    this.panel.add(navigation.buildPanel(), BorderLayout.SOUTH); 
} 
+0

Merci pour la réponse rapide. J'ai essayé le code que vous avez fourni et il affiche "Nombre de caractères:" dès que le panneau est ouvert. Cependant, il n'y a pas de compte de caractères dynamiques; document.getLength() affiché avant et après la saisie. –

+1

@ In-youngChoung, La partie dynamique fonctionnait avant, vous devez donc avoir changé quelque chose d'autre. Nous ne pouvons pas dire le contexte exact de l'exécution de votre code. Donc, c'est à vous de comprendre la suggestion et de la mettre en œuvre correctement. La suggestion consistait essentiellement à faire ce que vous faisiez auparavant, mais ajouter la bordure au panneau dès que le panneau est créé. Ensuite, vous n'avez jamais besoin de recréer la bordure, il suffit de changer le texte de la bordure. Si vous avez besoin de plus d'aide, alors postez un [mcve] qui démontre le problème, nous ne pouvons pas deviner exactement ce que vous avez changé. – camickr

+1

Notez que vous devrez peut-être appeler 'repaint()' sur le panneau après le texte Border changé pour s'assurer que la frontière soit repeinte. – camickr