1

我正在尝试突出显示一个单词,但第一次仅突出显示 .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();
        }
    });
   }
 }
4

2 回答 2

4

我不认为你理解我。

使用我的最新示例,我制作了这个(注意这是上一个问题中示例的更新代码。现在仅使用 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

在此处输入图像描述

在此处输入图像描述

在此处输入图像描述

在此处输入图像描述

在此处输入图像描述

在此处输入图像描述

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();
            }
        });
    }
}
于 2012-11-20T18:54:16.530 回答
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();
      }
    });
  }
}
于 2012-11-20T22:53:13.613 回答