Java 当焦点丢失时,如何在JTextField中保留选定的文本?

Java 当焦点丢失时,如何在JTextField中保留选定的文本?,java,swing,selection,jtextfield,caret,Java,Swing,Selection,Jtextfield,Caret,现在完成自定义菜单弹出,但问题是如果我在JTextField中选择一些文本并单击鼠标按钮以显示弹出菜单,则焦点将转移到弹出窗口,之前选择的文本将不再突出显示。当焦点回到JTextField-所选文本再次突出显示。如何使所选文本在焦点丢失时保持高亮显示 然后焦点转移到弹出窗口,并在选择文本之前 不再突出显示。当焦点回到JTextField时-选中 文本再次突出显示。如何使所选文本保持不变 重点关注焦点丢失 您可以为设置覆盖 您可以为设置覆盖 来自DefaultCaret的代码示例 class

现在完成自定义菜单弹出,但问题是如果我在
JTextField
中选择一些文本并单击鼠标按钮以显示弹出菜单,则焦点将转移到弹出窗口,之前选择的文本将不再突出显示。当焦点回到
JTextField
-所选文本再次突出显示。如何使所选文本在焦点丢失时保持高亮显示

然后焦点转移到弹出窗口,并在选择文本之前 不再突出显示。当焦点回到JTextField时-选中 文本再次突出显示。如何使所选文本保持不变 重点关注焦点丢失

  • 您可以为设置覆盖

  • 您可以为设置覆盖

来自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);
        }
    }
}

编辑必须恢复

哇,这么简单,我印象深刻:)再次感谢@mKorbel!问题在几秒钟内解决:)@Ernestas Gruodis很高兴在我设置
textField.setCaret(new HighlightCaret())后能帮助您我注意到插入符号停止闪烁。。在
Caret
类中可能有一些设置?现在正试图深入挖掘
DefaultCaret
类。是的,正如我所预料的那样,
public HighlightCaret(){setBlinkRate(500);}
成功了。现在插入符号再次闪烁:)test whats返回getBlinkRate(),但如果这可能是使用JTextPane的另一个原因,那么光标是可见的,请看,不是更好吗