突出显示java中的单词

时间:2012-11-20 17:39:19

标签: java swing timer highlight jtextpane

我正在试图突出显示一个单词,但只有.length() - 第一次使用2,延迟然后是最后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();
        }
    });
   }
 }

2 个答案:

答案 0 :(得分:4)

我不认为你理解我。

使用my newest example我做了这个(注意这是上一个问题中示例的更新代码。现在只使用Swing Timers):

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

enter image description here

enter image description here

enter image description here

enter image description here

enter image description here

enter image description here

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

答案 1 :(得分:2)

您只需调整Timer的延迟,即可通过一个Timer实现此目的。只需从@DavidKroukamp中获取代码并删除其中一个Timer实例

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JTextPane;
import javax.swing.SwingUtilities;
import javax.swing.Timer;
import javax.swing.text.BadLocationException;
import javax.swing.text.DefaultHighlighter;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.concurrent.atomic.AtomicBoolean;

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 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;
    }

    Timer t = new Timer( timings[0], new ActionListener() {
      private int currentIndex = 0;
      @Override
      public void actionPerformed( ActionEvent e ) {
        clearHighlights();
        highlightWord( currentIndex );
        currentIndex++;
        if ( currentIndex < timings.length ){
          ( ( Timer ) e.getSource() ).setDelay( timings[currentIndex] );
          ( ( Timer ) e.getSource() ).restart();
        } else {
          ( ( Timer ) e.getSource() ).stop();
        }
      }
    } );
    t.setRepeats( true );

    t.start();
  }

  private void highlightWord( int index ){
    int sp = 0;
    for (int i = 0; i < index; i++) {
      sp += words[i].length();
    }
    try {
      jtp.getHighlighter().addHighlight(sp, sp + words[index].length(), highlightPainter);
    } catch (BadLocationException ex) {
      ex.printStackTrace();
    }
  }
  private void clearHighlights(){
    jtp.getHighlighter().removeAllHighlights();
  }

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