[英]How to retain selected text in JTextField when focus lost?
Now finishing my custom menu popup, but the problem is that if I select some text in JTextField
and click mouse button to show popup menu, then focus is transferred to popup window, AND selected text before are no longer highlighted. 现在完成我的自定义菜单弹出,但问题是,如果我在
JTextField
选择一些文本并单击鼠标按钮以显示弹出菜单,则焦点将转移到弹出窗口,之前选定的文本不再突出显示。 When focus is back to JTextField
- selected text become highlighted again. 当焦点回到
JTextField
- 所选文本将再次突出显示。 How to make the selected text stay highlighted on focus lost? 如何在焦点丢失时突出显示所选文本?
then focus is transferred to popup window, AND selected text before are no longer highlighted.
然后焦点转移到弹出窗口,之前选定的文本不再突出显示。 When focus is back to JTextField - selected text become highlighted again.
当焦点回到JTextField时 - 所选文本将再次突出显示。 How to make the selected text stay highlighted on focus lost?
如何在焦点丢失时突出显示所选文本?
you can to override DefaultCaret for JTextComponents 您可以为JTextComponents覆盖DefaultCaret
you can to override Highlighter for JTextComponents 您可以为JTextComponents覆盖Highlighter
code example from DefaultCaret 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);
}
}
}
with output 与输出
from code 来自代码
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);
}
}
}
EDIT have to restore Caret.setBlinkRate(500); 编辑必须恢复Caret.setBlinkRate(500);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.