gpt4 book ai didi

java - 如何覆盖 DefaultCaret#setBlinkRate()

转载 作者:塔克拉玛干 更新时间:2023-11-02 07:49:17 30 4
gpt4 key购买 nike

  • 我对 Caret 有疑问,Caret 在 focusGained(参见 Swing Action 中的代码)到 2nd 时不会眨眼。 JTextField 并回到第一个。 JTextField

  • 如何正确覆盖 DefaultCaret#setBlinkRate()

  • (不覆盖插入符号)默认情况下是文档末尾的插入符号,并在第一个闪烁。获得焦点



我的SSCCE

import java.awt.*;
import java.awt.event.ActionEvent;
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 Timer timer;
private JTextField jTextField0 = new JTextField();
private JTextField jTextField1 = new JTextField();
private JTextField jTextField2 = new JTextField();
private JFrame frame = new JFrame("Default Caret");
private JPanel panel = new JPanel();

public TestTextComponents() {
jTextField0.setText("jTextField0");
jTextField1.setText("jTextField1");
jTextField2.setText("jTextField2");
jTextField1.setCaret(new HighlightCaret());
jTextField2.setCaret(new HighlightCaret());
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
panel.add(new JLabel("Please skip between text fields and watch persistent selection: "));
panel.add(jTextField0);
panel.add(jTextField1);
panel.add(jTextField2);
frame.add(panel);
frame.setTitle("Text component persistent selection");
frame.pack();
frame.setVisible(true);
/*timer = new javax.swing.Timer(250, updateCol());
timer.setRepeats(false);
timer.start();*/
}

private Action updateCol() {
return new AbstractAction("Hello World") {
private static final long serialVersionUID = 1L;

@Override
public void actionPerformed(ActionEvent e) {
jTextField2.grabFocus();
jTextField2.requestFocusInWindow();
jTextField1.grabFocus();
jTextField1.requestFocusInWindow();
}
};
}

private class HighlightCaret extends DefaultCaret {

private static final long serialVersionUID = 1L;
private final Highlighter.HighlightPainter unfocusedPainter = new DefaultHighlighter.DefaultHighlightPainter(Color.RED);
private final Highlighter.HighlightPainter focusedPainter = new DefaultHighlighter.DefaultHighlightPainter(Color.ORANGE);
private boolean isFocused;

@Override
protected Highlighter.HighlightPainter getSelectionPainter() {
return isFocused ? focusedPainter /*super.getSelectionPainter()*/ : unfocusedPainter;
}

@Override
public void setSelectionVisible(boolean hasFocus) {
super.repaint();
super.setBlinkRate(500);
if (hasFocus != isFocused) {
isFocused = hasFocus;
super.setSelectionVisible(false);
super.setSelectionVisible(true);
}
}
}

public static void main(String args[]) {
/*try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (Exception e) {
e.printStackTrace();
}
try {
for (UIManager.LookAndFeelInfo laf : UIManager.getInstalledLookAndFeels()) {
if ("Nimbus".equals(laf.getName())) {
UIManager.setLookAndFeel(laf.getClassName());
}
}
} catch (Exception e) {
e.printStackTrace();
}*/
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new TestTextComponents();
}
});
}
}

最佳答案

闪烁的插入符号由 DefaultCaret 的 setVisible() 方法控制。所选文本由 setSelectionVisible() 方法控制。

DefaultCaret 的 focusGained/focusLost 方法使用这两个方法控制插入符号的行为。默认情况下,focusGained 的两个属性都设置为 true。在 focusLost 上,它们被设置为 false。使用不同荧光笔的基本逻辑,您可以执行以下操作:

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.text.*;

public class SelectionCaret extends DefaultCaret
{
private final Highlighter.HighlightPainter unfocusedPainter = new DefaultHighlighter.DefaultHighlightPainter(Color.RED);
private final Highlighter.HighlightPainter focusedPainter = new DefaultHighlighter.DefaultHighlightPainter(Color.ORANGE);

public SelectionCaret()
{
setBlinkRate( UIManager.getInt("TextField.caretBlinkRate") );
}

@Override
protected Highlighter.HighlightPainter getSelectionPainter()
{
return getComponent().hasFocus() ? focusedPainter : unfocusedPainter;
}

@Override
public void focusGained(FocusEvent e)
{
setSelectionVisible(false);
super.focusGained(e);
}

@Override
public void focusLost(FocusEvent e)
{
super.focusLost(e);
setSelectionVisible(true);
}

private static void createAndShowUI()
{
JTextField textField1 = new JTextField("Text Field1 ");
JTextField textField2 = new JTextField("Text Field2 ");
JTextField textField3 = new JTextField("Non Editable ");
textField3.setEditable(false);

textField1.setCaret(new SelectionCaret());
textField2.setCaret(new SelectionCaret());
textField3.setCaret(new SelectionCaret());

textField1.select(5, 11);
textField2.select(5, 11);
textField3.select(5, 11);
((DefaultCaret)textField1.getCaret()).setSelectionVisible(true);
((DefaultCaret)textField2.getCaret()).setSelectionVisible(true);
((DefaultCaret)textField3.getCaret()).setSelectionVisible(true);

JPanel north = new JPanel();
north.add( new JTextField("Text Field0 ") );
north.add(textField1);
north.add(textField2);
north.add(textField3);

JFrame frame = new JFrame("Selection Caret");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add( north );
frame.pack();
frame.setLocationByPlatform( true );
frame.setVisible( true );
}

public static void main(String[] args)
{
EventQueue.invokeLater(new Runnable()
{
public void run()
{
createAndShowUI();
}
});
}
}

现在,两个文本字段中的任何文本都将被选中,但只有具有焦点的文本字段会闪烁。

关于java - 如何覆盖 DefaultCaret#setBlinkRate(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18243101/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com