Java 当焦点丢失时,如何在JTextField中保留选定的文本?
现在完成自定义菜单弹出,但问题是如果我在Java 当焦点丢失时,如何在JTextField中保留选定的文本?,java,swing,selection,jtextfield,caret,Java,Swing,Selection,Jtextfield,Caret,现在完成自定义菜单弹出,但问题是如果我在JTextField中选择一些文本并单击鼠标按钮以显示弹出菜单,则焦点将转移到弹出窗口,之前选择的文本将不再突出显示。当焦点回到JTextField-所选文本再次突出显示。如何使所选文本在焦点丢失时保持高亮显示 然后焦点转移到弹出窗口,并在选择文本之前 不再突出显示。当焦点回到JTextField时-选中 文本再次突出显示。如何使所选文本保持不变 重点关注焦点丢失 您可以为设置覆盖 您可以为设置覆盖 来自DefaultCaret的代码示例 class
JTextField
中选择一些文本并单击鼠标按钮以显示弹出菜单,则焦点将转移到弹出窗口,之前选择的文本将不再突出显示。当焦点回到JTextField
-所选文本再次突出显示。如何使所选文本在焦点丢失时保持高亮显示
然后焦点转移到弹出窗口,并在选择文本之前
不再突出显示。当焦点回到JTextField时-选中
文本再次突出显示。如何使所选文本保持不变
重点关注焦点丢失
- 您可以为设置覆盖
- 您可以为设置覆盖
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);
}
}
}
编辑必须恢复哇,这么简单,我印象深刻:)再次感谢@mKorbel!问题在几秒钟内解决:)@Ernestas Gruodis很高兴在我设置
textField.setCaret(new HighlightCaret())后能帮助您代码>我注意到插入符号停止闪烁。。在Caret
类中可能有一些设置?现在正试图深入挖掘DefaultCaret
类。是的,正如我所预料的那样,public HighlightCaret(){setBlinkRate(500);}
成功了。现在插入符号再次闪烁:)test whats返回getBlinkRate(),但如果这可能是使用JTextPane的另一个原因,那么光标是可见的,请看,不是更好吗