Как сохранить выделенный текст в JTextField при потере фокуса?
Теперь я заканчиваю свое всплывающее меню, но проблема в том, что если я выделю какой-нибудь текст в JTextField
и нажмите кнопку мыши, чтобы отобразить всплывающее меню, затем фокус будет перенесен во всплывающее окно, а выделенный ранее текст больше не будет выделен. Когда фокус вернется к JTextField
- выделенный текст снова будет выделен. Как сделать выделенный текст выделенным при потере фокуса?
1 ответ
затем фокус переносится во всплывающее окно, а выделенный текст перед ним больше не подсвечивается. Когда фокус вернется к JTextField - выделенный текст снова будет выделен. Как сделать выделенный текст выделенным при потере фокуса?
Вы можете переопределить DefaultCaret для JTextComponents
Вы можете переопределить Highlighter для JTextComponents
пример кода из DefaultCaret
class HighlightCaret extends DefaultCaret {
private static final Highlighter.HighlightPainter unfocusedPainter = new DefaultHighlighter.DefaultHighlightPainter(Color.RED);
private static final Highlighter.HighlightPainter focusedPainter = new DefaultHighlighter.DefaultHighlightPainter(Color.YELLOW);
private static final long serialVersionUID = 1L;
private boolean isFocused;
@Override
protected Highlighter.HighlightPainter getSelectionPainter() {
return isFocused ? focusedPainter/*super.getSelectionPainter()*/ : unfocusedPainter;
}
@Override
public void setSelectionVisible(boolean hasFocus) {
if (hasFocus != isFocused) {
isFocused = hasFocus;
super.setSelectionVisible(false);
super.setSelectionVisible(true);
}
}
}
с выходом
из кода
import java.awt.*;
import javax.swing.*;
import javax.swing.text.DefaultCaret;
import javax.swing.text.DefaultHighlighter;
import javax.swing.text.Highlighter;
public class TestTextComponents {
private static final long serialVersionUID = 1L;
private JTextField jTextField1;
private JTextField jTextField2;
private JFrame frame = new JFrame("Default Caret");
public TestTextComponents() {
jTextField1 = new JTextField();
jTextField2 = new JTextField();
jTextField1.setText("jTextField1");
jTextField2.setText("jTextField2");
jTextField1.setCaret(new HighlightCaret());
jTextField2.setCaret(new HighlightCaret());
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
frame.setResizable(false);
frame.setLayout(new FlowLayout());
frame.add(new JLabel("Please skip between text fields and watch persistent selection: "));
frame.add(jTextField1);
frame.add(jTextField2);
frame.setTitle("Text component persistent selection");
frame.pack();
frame.setVisible(true);
}
public static void main(String args[]) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new TestTextComponents();
}
});
}
}
class HighlightCaret extends DefaultCaret {
private static final Highlighter.HighlightPainter unfocusedPainter = new DefaultHighlighter.DefaultHighlightPainter(Color.RED);
private static final Highlighter.HighlightPainter focusedPainter = new DefaultHighlighter.DefaultHighlightPainter(Color.YELLOW);
private static final long serialVersionUID = 1L;
private boolean isFocused;
@Override
protected Highlighter.HighlightPainter getSelectionPainter() {
setBlinkRate(500); // otherwise is disabled, stopped
return isFocused ? focusedPainter/*super.getSelectionPainter()*/ : unfocusedPainter;
}
@Override
public void setSelectionVisible(boolean hasFocus) {
if (hasFocus != isFocused) {
isFocused = hasFocus;
super.setSelectionVisible(false);
super.setSelectionVisible(true);
}
}
}
РЕДАКТИРОВАТЬ должны восстановить Caret.setBlinkRate (500);