【问题标题】:Delayed text color change in Swing text fieldSwing 文本字段中的延迟文本颜色更改
【发布时间】:2012-04-05 21:57:44
【问题描述】:

是否可以更改文本字段中文本的颜色?我正在尝试构建一个解释器,所以我想知道如何实时更改文本的颜色。 例如,我在文本字段中输入的单词是:

printf("hi");

单词printf 几秒钟后变成绿色。

有可能吗?

【问题讨论】:

    标签: java swing textfield keyword


    【解决方案1】:

    package test;
    
    import java.awt.Color;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    
    import javax.swing.JOptionPane;
    import javax.swing.JTextField;
    import javax.swing.SwingUtilities;
    import javax.swing.Timer;
    
    public class BlinkColorTextField {
    
        BlinkColorTextField() {
            final JTextField blinkingText = new JTextField("Red & Blue");
            ActionListener blinker = new ActionListener() {
                boolean isRed = true;
                public void actionPerformed(ActionEvent ae) {
                    if (isRed) {
                        blinkingText.setForeground(Color.BLUE);
                    } else {
                        blinkingText.setForeground(Color.RED);
                    }
                    isRed = !isRed;
                }
            };
            Timer timer = new Timer(1000, blinker);
            timer.start();
            JOptionPane.showMessageDialog(null, blinkingText);
        }
    
        public static void main(String[] args) {
            SwingUtilities.invokeLater(new Runnable(){
                public void run() {
                    new BlinkColorTextField();
                }
            });
        }
    
    }
    

    【讨论】:

    • setForeground 调用确实改变了文本颜色,但改变了文本字段中的所有文本。根据问题,他只希望部分文本采用不同的颜色,Stefan Lindenberg 的回答很好地说明了这一点
    • Eh..(耸耸肩)我的展示了 Timer 的实现,尽管 OP 当然想要一个非重复实例。
    • 好点。我忽略了问题中的“几秒钟后”部分。对于漂亮的代码和图片的这个答案+1
    • 实际上,我正要否决其他答案,但我想我会先举个例子。只是在发布之后,我才注意到问题中的微妙之处,即仅指定文本的 part 为绿色。但到那时,我有代码和动画 GIF,所以我想我会留下它(而不是否决其他答案)。 ;)
    • +1,我从来没想过,Timer可以用来创造如此美妙的效果。大声笑,太棒了:-)
    【解决方案2】:

    试试这个:

    HighlightPainter greenPainter = new DefaultHighlighter.DefaultHighlightPainter(Color.GREEN);
    
    //in a thread...    
    Highlighter h = tf.getHighlighter();
    h.addHighlight(offset, offset+length, greenPainter); 
    

    【讨论】:

      【解决方案3】:

      您必须使用JEditorPane / JTextPane 而不是 JTextField,您还可以通过覆盖 paintComponent 方法来绘制文本/字符串。

      【讨论】:

      • 对于实时元素,您需要创建一个新的计时器并使用它来休眠给定的时间长度。
      • 我第一次读到你建议覆盖paintComponent()JEditorPaneJTextPane。您可以编辑以使其更清晰吗?
      猜你喜欢
      • 2018-06-21
      • 1970-01-01
      • 2011-10-17
      • 1970-01-01
      • 2022-09-29
      • 2019-11-05
      • 1970-01-01
      • 1970-01-01
      • 2014-08-04
      相关资源
      最近更新 更多