当前位置: 首页 > 面试题库 >

如何重写DefaultCaret#setBlinkRate()

师腾
2023-03-14
问题内容
  • 我的插入符号有问题,没有获得focusGained(请参见Swing Action中的代码)到第二,插入符号就不会闪烁。JTextField并回到1st。JTextField

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

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

  • 在win7_32b,Java7.011 / 025 / Java6上测试

  • 也使用了一些自定义的标准L&F进行了测试,每一个都是相同的问题

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

问题答案:

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

focusGained/focusLostDefaultCaret
的方法使用这两种方法控制插入符的行为。默认情况下,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();
            }
        });
    }
}

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



 类似资料:
  • 问题内容: 每当抛出javascript异常时,我们还想做一些额外的事情。 从以下文档: 角度表达式中任何未捕获的异常都委托给此服务。默认的实现只是将$ log.error委托给浏览器控制台。 它说“默认实现”的事实使我认为有一种方法可以为服务提供我们自己的实现,并在引发异常时做我们想要的事情。我的问题是,你如何做到这一点?我们如何使所有异常都保留给该服务,然后提供我们希望发生的功能? 问题答案:

  • 我需要扩展AbstractTableModel来表示表中的一些数据。我有一个类< code>Car,它应该代表表中的一个项目(行): 这些对象存储在中,它驻留在中: 就我所知,我需要在AbstractTableModel中覆盖至少3个方法。如何为HashSet重写getValueAt?关于HashSet的rowIndex和columnIndex参数是什么?如果我们不能通过一个索引从一个哈希表中获取

  • 问题内容: 通用方法: 所需的覆盖方法: 实现此目的的Java语法是什么? 问题答案: 更好的设计是。

  • 问题内容: 我正在尝试在我的PHP应用程序中实现URL重写。有人可以分享在PHP和MySQL中实现URL重写的分步过程吗? 在我的应用程序中,我想实现以下URL重写,我想重定向 至 请告诉我如何以上述任何一种方式实现这两个URL重写。 根据以下两种类型中的SEO,管理,应用程序的观点,哪个URL最好是另一件事。 问题答案: 通常,这只不过是启用mod_rewrite模块(您可能已经在主机上启用了该

  • 如何编写一个toString()方法,为三名员工打印名称和computePay,小数点后两位?在我添加StringBuilder之前,该程序正在工作(将名称和周支付打印到命令行)。感谢任何帮助。

  • 问题内容: 我有一个AlertDialog dlgDetails从另一个显示AlertDialog dlgMenu。如果用户按下dlgDetails中的“后退”按钮,我希望能够再次显示dlgMenu,如果他在对话框外按下,则仅退出对话框。 我认为最好的方法是onBackPressed为dlgDetails覆盖,但是我不确定该怎么做,因为必须使用Builder间接创建AlertDialogs。 我正