当焦点丢失时,如何在JTextField中保留选定的文本? [英] How to retain selected text in JTextField when focus lost?
问题描述
现在完成我的自定义菜单弹出窗口,但是问题是,如果我在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); } } }
编辑必须恢复 查看全文