突出显示JTextArea的某个部分

时间:2015-03-10 16:17:53

标签: java highlight

我试图在我创建的文本区域中突出显示文本的某一部分。我的程序所做的是它显示在文本区域中延迟的一系列数字(对于此代码,它是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);
      }

但它会突出显示所有数字。任何想法?

1 个答案:

答案 0 :(得分:0)

类名应以大写字母开头。不要因为这是一个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);}
            }
        }
    }
}

不要使用空挡块。你怎么知道什么时候出错?