【问题标题】:Highlighting a certain part of a JTextArea突出显示 JTextArea 的某个部分
【发布时间】:2015-03-11 06:04:51
【问题描述】:

我正在尝试突出显示我创建的文本区域中的特定文本部分。我的程序所做的是它在文本区域中显示一系列延迟的数字(对于此代码,它是 0-9)。我想要的是突出数字 2、4、6、8。我将如何使用荧光笔?我不想搜索字符串,因为我可能会突出显示其他数字。 (对于 28,它将突出显示 2)。任何答案表示赞赏。谢谢。

import java.awt.event.*;
import javax.swing.*;
import java.util.List;


public class Test extends JFrame
{
    JPanel panel;
    JButton button;
    JTextArea tArea;
    SwingWorker<Void,String> worker;
    HandlerAction action = new HandlerAction();

    public Test() {
        panel = new JPanel();
        button = new JButton("Start");
        tArea = new JTextArea();
        JScrollPane sPane = new JScrollPane(tArea);
        sPane.setBounds(0,0,100,100);
        button.setBounds(0,110,100,30);
        this.add(button);
        this.add(sPane);
        this.add(panel);
        button.addActionListener(action);
    }

    private class HandlerAction implements ActionListener {
        @Override
        public void actionPerformed(ActionEvent e) {
            if (e.getSource() == button) {
                tArea.setText("");
                worker = new SwingWorker<Void, String>(){
                    @Override
                        protected Void doInBackground() throws Exception {
                            for (int i = 0; i<10; i++) {
                                publish(i + "\n");
                                sleep();
                            }
                            return null;
                        }

                        @Override
                        protected void process(List<String> chunks) {
                            for (String line : chunks) {
                                tArea.append(line);
                                try {
                                     tArea.getHighlighter().addHighlight(0, 3, DefaultHighlighter.DefaultPainter);
                               } catch (BadLocationException err)                   {System.out.println(err)}
                            }
                        }
                    };
                    worker.execute();
                }
            };
        }
        public void sleep() {
            try {
                Thread.sleep(500);
            } catch (InterruptedException err) {}
       }
    public static void main(String[] args) {
        test test = new test();
        test.setSize(200,200);
        test.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        test.setVisible(true);
    }
}

编辑: 我已经添加了这个

try {
    tArea.getHighlighter().addHighlight(0, 3, DefaultHighlighter.DefaultPainter);
} catch (BadLocationException err) {System.out.println(err)}

这里

 @Override    
 protected void process(List<String> chunks) {
     for (String line : chunks) {  
            tArea.append(line);
      }

但它突出显示了所有数字。有什么想法吗?

【问题讨论】:

    标签: java highlight


    【解决方案1】:

    类名应以大写字符开头。不要因为这是 SSCCE 而偷懒。

    我已将此添加到进程()中

    所以更新您的代码以显示您的新逻辑。我们不知道您在方法中的哪个位置添加了代码。

    但它突出显示了所有数字。有什么想法吗?

    添加一个 if 语句来做条件高亮怎么样:

    @Override
    protected void process(List<String> chunks) {
        for (String line : chunks) {
            tArea.append(line);
    
            if  (line.length() == 2)
            {
                char first = line.charAt(0);
    
                if (first == '2'
                ||  first == '4'
                ||  first == '6'
                ||  first == '8')
                {
                    try
                    {
                        int offset = tArea.getDocument().getLength() - 2;
                        tArea.getHighlighter().addHighlight(offset, offset + 1, DefaultHighlighter.DefaultPainter);
                    } catch (BadLocationException err) {System.out.println(err);}
                }
            }
        }
    }
    

    不要使用空的 catch 块。出现错误时如何知道?

    【讨论】:

    • 谢谢。还有其他突出显示它们的方法吗?也许从插入符号位置?因为我将使它成为用户定义的一组数字。所以我不知道他们会做出什么样的投入。非常感谢。
    • @KevinNarra,很高兴它有帮助。不要忘记“接受”答案,这样人们就知道问题已经解决了。我已经给你概念证明,我不知道你的确切要求,所以我不能给你一个确切的解决方案。当然,如果您认为这会有所帮助,您可以使用插入符号位置。此外,我的评论是关于更新原始代码,以便人们可以复制/粘贴代码。我们没有时间将多段代码放在一个类中。我们仍然无法根据您的描述说明您将代码放在哪里。 for 循环之前/之后,append 语句之前/之后。
    • 感谢您的更正 :) 无论如何,当我尝试使用它的插入符号位置时,我最终会突出显示文本的不同部分。我该怎么做?
    • @KevinNarra,我猜插入符号会在文本的末尾,所以你需要像我一样减去 2。但是插入符号的位置可能尚未更新,因此它指向文档中最后一行文本添加之前的位置。在您尝试突出显示文本时进行一些调试以确定其值。
    • 请问这条线的目的是什么? if (line.length() == 2)
    猜你喜欢
    • 2013-10-25
    • 1970-01-01
    • 2012-06-18
    • 1970-01-01
    • 2016-02-15
    • 2012-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多