编程语言
首页 > 编程语言> > 突出显示Java中的单词

突出显示Java中的单词

作者:互联网

我正在尝试突出显示一个单词,但是第一次只显示.length()-2,延迟然后显示最后两个单词.突出显示第一个单词,但延迟后不突出显示最后两个单词.请帮助.
这是代码:

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.AbstractAction;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JTextPane;
import javax.swing.SwingUtilities;
import javax.swing.Timer;
import javax.swing.text.BadLocationException;
import javax.swing.text.DefaultHighlighter;

public class newkarao {

private int[] timings = {600, 1000, 400,50};
private String[] words = new String[]{"Hellojjkhl", "java", "whoooooh","bye"};
private DefaultHighlighter.DefaultHighlightPainter highlightPainter = new       DefaultHighlighter.DefaultHighlightPainter(Color.GREEN);
private int count = 0;
private int xx=0,tlength,spe;
private boolean fisrTime = true;
private JFrame frame;
private JTextPane jtp;
JButton startButton;

public newkarao() {
    initComponents();
}

private void initComponents() {
    frame = new JFrame();
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setResizable(false);

    jtp = new JTextPane();

    for (String s : words) {
        String tmp = jtp.getText();
        if (tmp.equals("")) {
            jtp.setText(s);
        } else {
            jtp.setText(tmp + " " + s);
        }
    }

    startButton = new JButton("Start");
    startButton.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent ae) {
            startKaraoke();
        }
    });

    frame.add(jtp, BorderLayout.CENTER);
    frame.add(startButton, BorderLayout.SOUTH);

    frame.pack();
    frame.setVisible(true);
   }

   private void startKaraoke() {
    if (fisrTime) {
        startButton.setEnabled(false);
        fisrTime = false;
    }
    new Thread(new Runnable() {
        @Override
        public void run() {

            Timer t = null;
            try {
                t = createAndStartTimer(timings[count], count);
            } catch (InterruptedException ex) {
                Logger.getLogger(newkarao.class.getName()).log(Level.SEVERE, null, ex);
            }

            while (t.isRunning()) {//wait for timer to be done
                try {
                    Thread.sleep(1);
                } catch (InterruptedException ex) {
                    Logger.getLogger(newkarao.class.getName()).log(Level.SEVERE, null, ex);
                }
            }

            SwingUtilities.invokeLater(new Runnable() {
                @Override
                public void run() {
                    count++;
                    if (count == timings.length) {
                        JOptionPane.showMessageDialog(frame, "Done");
                        startButton.setEnabled(true);
                        count = 0;
                    } else {
                        startKaraoke();
                    }
                }
            });

        }
    }).start();
   }

  private Timer createAndStartTimer(int delay, final int count) throws InterruptedException {

    try {
        int sp = 0;
        for (int i = 0; i < count; i++) {
            sp += words[i].length() + 1;
            spe=sp;
        }
   //     int a=timings[xx];xx++;
        System.out.println("jfd");
        tlength=words[count].length();//Thread.currentThread().sleep(5000);
        jtp.getHighlighter().addHighlight(sp, sp + words[count].length()-2, highlightPainter);
        System.out.println(sp + words[count].length()-2);
    } catch (BadLocationException ex) {
        ex.printStackTrace();
    }

    Timer t = new Timer(delay, new AbstractAction() {
        @Override
        public void actionPerformed(ActionEvent ae) {
            try {System.out.println(spe + words[count].length());
                jtp.getHighlighter().addHighlight(spe, spe + words[count].length(), highlightPainter);
                System.out.println("sleep");
               //    Thread.currentThread().sleep(5000);

                jtp.getHighlighter().removeAllHighlights();
            } catch (BadLocationException ex) {
                Logger.getLogger(newkarao.class.getName()).log(Level.SEVERE, null, ex);
            }


        }
    });
    t.setRepeats(false);
    t.start();
    return t;
   }

   public static void main(String[] args) {
    SwingUtilities.invokeLater(new Runnable() {
        @Override
        public void run() {
            new newkarao();
        }
    });
   }
 }

解决方法:

我不认为你了解我.

使用my newest example,我做了这个(请注意,这是上一个问题中示例的更新代码.现在仅使用Swing计时器):

private int[] timings = {2000, 4000, 0, 3000, 2000};//word timings
private String[] words = {"Hel", "lo", " ", "wor", "ld"};//each indiviaul word

private String sentence = "Hello world";//entire string for writing to JSCrollPane
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.concurrent.atomic.AtomicBoolean;
import javax.swing.AbstractAction;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JTextPane;
import javax.swing.SwingUtilities;
import javax.swing.Timer;
import javax.swing.text.BadLocationException;
import javax.swing.text.DefaultHighlighter;

public class KaraokeTest {

    private int[] timings = {2000, 4000, 0, 3000, 2000};//word timings
    private String[] words = {"Hel", "lo", " ", "wor", "ld"};//each indiviaul word
    private String sentence = "Hello world";//entire string for writing to JSCrollPane
    private DefaultHighlighter.DefaultHighlightPainter highlightPainter = new DefaultHighlighter.DefaultHighlightPainter(Color.YELLOW);
    private int count = 0;
    private boolean fisrTime = true;
    private JFrame frame;
    private JTextPane jtp;
    private JButton startButton;
    private AtomicBoolean done = new AtomicBoolean(false);

    public KaraokeTest() {
        initComponents();
    }

    private void initComponents() {
        frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setResizable(false);

        jtp = new JTextPane();

        jtp.setText(sentence);
        jtp.setEditable(false);

        startButton = new JButton("Start");
        startButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent ae) {
                startKaraoke();
            }
        });

        frame.add(jtp, BorderLayout.CENTER);
        frame.add(startButton, BorderLayout.SOUTH);

        frame.pack();
        frame.setVisible(true);
    }

    private void startKaraoke() {
        if (fisrTime) {
            startButton.setEnabled(false);
            fisrTime = false;
        }

        createAndStartTimer(timings[count], count);

        Timer t = new Timer(1, new AbstractAction() {
            @Override
            public void actionPerformed(ActionEvent ae) {
                if (done.get()) {
                    count++;
                    if (count == timings.length) {
                        JOptionPane.showMessageDialog(frame, "Done");
                        startButton.setEnabled(true);
                        count = 0;
                        fisrTime = true;
                        done.getAndSet(false);
                        ((Timer) ae.getSource()).stop();
                    } else {
                        ((Timer) ae.getSource()).stop();
                        startKaraoke();
                    }
                }
            }
        });
        done.getAndSet(false);//to synchronize when the remove highlight timer is done so a clash between adding highlights before the timer is done doesnt occur
        t.start();
    }

    private void createAndStartTimer(int delay, final int count) {
        int sp = 0;
        for (int i = 0; i < count; i++) {
            sp += words[i].length();
        }
        try {
            jtp.getHighlighter().addHighlight(sp, sp + words[count].length(), highlightPainter);
        } catch (BadLocationException ex) {
            ex.printStackTrace();
        }

        Timer t = new Timer(delay, new AbstractAction() {
            @Override
            public void actionPerformed(ActionEvent ae) {
                jtp.getHighlighter().removeAllHighlights();
                done.getAndSet(true);//so that out other timer knows we are done completly and can add new higlights
            }
        });
        t.setRepeats(false);
        t.start();
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new KaraokeTest();
            }
        });
    }
}

标签:jtextpane,java,highlight,swing,timer
来源: https://codeday.me/bug/20191009/1880808.html