2013-08-16 3 views
5

Lorsque mon jTextArea est activé, il permet la mise en surbrillance du texte, mais il n'affiche pas la sélection de texte lorsqu'il perd le focus. Est-il possible de continuer à afficher le texte en surbrillance même si l'utilisateur déplace le focus sur un autre composant du jFrame associé?jTextArea ne montre plus de surlignage sur le texte après avoir perdu le focus

+2

Pour mieux aider plus tôt, poster votre code en tant que [SSCCE] (http://www.sscce.org) qui illustre votre problème. Cela permet aux utilisateurs de copier/coller et de reproduire votre problème. –

+0

Je pense que c'est possible, mais pas avec les widgets standard inclus. Vous devrez écrire une sous-classe de 'JTextArea' pour cela. – 11684

Répondre

3

mais n'affiche pas la sélection sur le texte lorsque la mise au point est perdue.

Il y a trois façons:

enter image description here

  • ou programatically passer outre surligneur

enter image description here

import java.awt.BorderLayout; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JScrollPane; 
import javax.swing.JTextArea; 
import javax.swing.JTextField; 
import javax.swing.SwingUtilities; 
import javax.swing.text.BadLocationException; 
import javax.swing.text.DefaultHighlighter; 
import javax.swing.text.Highlighter; 
import javax.swing.text.JTextComponent; 

public class MultiHighlight implements ActionListener { 

    private JTextComponent comp; 
    private String charsToHighlight; 

    public MultiHighlight(JTextComponent c, String chars) { 
     comp = c; 
     charsToHighlight = chars; 
    } 

    @Override 
    public void actionPerformed(ActionEvent e) { 
     Highlighter h = comp.getHighlighter(); 
     h.removeAllHighlights(); 
     String text = comp.getText().toUpperCase(); 
     for (int j = 0; j < text.length(); j += 1) { 
      char ch = text.charAt(j); 
      if (charsToHighlight.indexOf(ch) >= 0) { 
       try { 
        h.addHighlight(j, j + 1, DefaultHighlighter.DefaultPainter); 
       } catch (BadLocationException ble) { 
       } 
      } 
     } 
    } 

    public static void main(String args[]) { 
     final JFrame frame = new JFrame("MultiHighlight"); 
     frame.add(new JTextField("Another focusable JComponents"), BorderLayout.NORTH); 
     JTextArea area = new JTextArea(10, 20); 
     area.setText("This is the story\nof the hare who\nlost his spectacles." 
       + "\nThis is the story\nof the hare who\nlost his spectacles."); 
     frame.getContentPane().add(new JScrollPane(area), BorderLayout.CENTER); 
     JButton b = new JButton("Highlight All Vowels"); 
     b.addActionListener(new MultiHighlight(area, "aeiouAEIOU")); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.getContentPane().add(b, BorderLayout.SOUTH); 
     SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       frame.pack(); 
       frame.setVisible(true); 
      } 
     }); 
    } 
} 
7

Une solution simple pour la sélection de caret est un simple sous-classement de DefaultCaret:

textArea.setCaret(new DefaultCaret() { 
    @Override 
    public void setSelectionVisible(boolean visible) { 
     super.setSelectionVisible(true); 
    } 
}); 
+0

Cela a fonctionné parfaitement. Juste besoin de mettre en évidence pour rester après la mise au point a été perdue. –

Questions connexes