当焦点丢失时,如何在JTextField中保留选定的文本? [英] How to retain selected text in JTextField when focus lost?

查看:122
本文介绍了当焦点丢失时,如何在JTextField中保留选定的文本?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

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. When focus is back to JTextField - selected text become highlighted again. How to make the selected text stay highlighted on focus lost?

推荐答案

然后将焦点转移到弹出窗口,并且之前选择的文本 不再突出显示.当焦点回到JTextField时-选定 文本再次突出显示.如何保留所选文字 强调失去焦点?

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. How to make the selected text stay highlighted on focus lost?

  • 您可以覆盖 DefaultCaret 用于 JTextComponents

    您可以覆盖突出显示用于 JTextComponents

    DefaultCaret的代码示例

    code example from 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);
            }
        }
    }
    

    编辑必须恢复 查看全文

登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆