Gdy moja jTextArea jest aktywna, umożliwia podświetlenie tekstu, ale nie pokazuje wyboru tekstu, gdy traci ostrość. Czy możliwe jest dalsze wyświetlanie podświetlania tekstu, nawet jeśli użytkownik przenosi fokus na inny komponent w powiązanym jFrame?jTextArea przestaje pokazywać podświetlanie tekstu po utracie ostrości
5
A
Odpowiedz
3
ale nie pokazuje zaznaczenia tekstu po utracie ostrości.
istnieją trzy sposoby:
najłatwiejsze w przypadku, gdy mówimy o wyborze jak malowanie artefakt z myszy Event zobaczyć moje pytanie Jak zastąpić DefaultCaret#setBlinkRate(), great knowledge and answer by @camickr
- lub programowo zastąpić 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
Jedno proste obejście wyboru karetki jest proste podklasy z DefaultCaret:
textArea.setCaret(new DefaultCaret() {
@Override
public void setSelectionVisible(boolean visible) {
super.setSelectionVisible(true);
}
});
+0
To działało idealnie. Po prostu trzeba było, aby podświetlenie pozostało po utracie ostrości. –
Dla lepszej pomocy wcześniej, zamieścić swoje kod jako [SSCCE] (http://www.sscce.org), który demonstruje twój problem. Dzięki temu użytkownicy mogą kopiować/wklejać i reprodukować swój problem. –
Myślę, że to możliwe, ale nie ze standardowymi dołączonymi widżetami. Będziesz musiał napisać do tego podklasę 'JTextArea'. – 11684