2013-08-16 14 views
5

Quando il mio jTextArea è a fuoco, consente l'evidenziazione del testo, ma non mostra la selezione del testo quando perde lo stato attivo. È possibile continuare a visualizzare l'evidenziazione del testo anche se l'utente sposta lo stato attivo su un altro componente sulla relativa jFrame?jTextArea smette di mostrare l'evidenziazione sul testo dopo aver perso lo stato attivo

+2

Per una migliore aiuto prima, pubblicare il tuo codice come [SSCCE] (http://www.sscce.org) che dimostra il tuo problema. Ciò consente agli utenti di copiare/incollare e riprodurre il problema. –

+0

Penso che sia possibile, ma non con i widget inclusi standard. Dovrai scrivere una sottoclasse di 'JTextArea' per quello. – 11684

risposta

3

ma non mostra la selezione sul testo quando perde la messa a fuoco.

ci sono tre modi:

enter image description here

  • o programatically ignorare Highlighter

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

Una soluzione semplice per la selezione del punto di inserimento è un semplice subclassing di DefaultCaret:

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

Questo ha funzionato perfettamente. Serve solo il momento saliente per rimanere dopo che l'attenzione è stata persa. –