Jak zastąpić DefaultCaret # setBlinkRate ()

Mam problem z Caretem, Caret nie mrugnął bez focusGained (patrz kod w Swing Action) na 2. JTextField i powrót do 1. JTextField

jak poprawnie zastąpić DefaultCaret # setBlinkRate ()

(bez nadpisywania Caret) domyślnie Caret na końcu dokumentu i miga na 1. focusGained

testowany na win7_32b, Java7.011 / 025 / Java6

przetestowany z kilkoma standardowymi L&F, również niestandardowy, każdy spowodowany tym samym problemem

zobacz więcej szczegółów moja odpowiedź na pytanieJak zachować wybrany tekst w JTextField, gdy utracono fokus? imożliwe obejście przez @kleopatra

moja 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();
            }
        });
    }
}

questionAnswers(3)

yourAnswerToTheQuestion