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
5
A
risposta
3
ma non mostra la selezione sul testo quando perde la messa a fuoco.
ci sono tre modi:
più semplice nel caso in cui si parla di selezione come la pittura manufatto da Topo Evento vedere la mia domanda Come ignorare DefaultCaret#setBlinkRate(), great knowledge and answer by @camickr
- o programatically ignorare Highlighter
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. –
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. –
Penso che sia possibile, ma non con i widget inclusi standard. Dovrai scrivere una sottoclasse di 'JTextArea' per quello. – 11684