【问题标题】:highlighting words in java在java中突出显示单词
【发布时间】:2012-11-01 20:41:44
【问题描述】:

我想在特定的时间突出显示这些词(就像在卡拉 OK 应用中一样)。 每个单词都有一个特定的突出显示时间。我可以计时,但没有找到任何地方。如何在特定的持续时间内突出显示一个单词。在 stackoverflow 和谷歌上搜索了很多,但死路一条。 我可以求助于 java 脚本或 html 吗? 请帮帮我。 这是我如何计时的一段代码:

millis mil=new millis();
if(true){

if(flag==1)
    flag=0;
else flag=1;
if(flag==0)
value=mil.done(flag,start);
start=value;
if(flag==1)
value=mil.done(flag,start);//function to calculate duration
}System.out.println("val:"+(value-3086610));
   // System.out.println("gyjghjghjghj"+(System.nanoTime()-start2));
    String s = textArea.getText();

    char[] words=s.toCharArray();


    for(i=last;words[i]!=' '&&words[i]!='\n';i++,last=i)
    {

    }
 try {//System.out.println(acount);
            hilit.addHighlight(first, last, painter);

        last++;   first=last;

        } catch (BadLocationException ex) {
            Logger.getLogger(newh.class.getName()).log(Level.SEVERE, null, ex);
        }

这就是我能够为每个单词计时的方式。
谢谢。

【问题讨论】:

  • 它是桌面应用程序或小程序 (java) 还是 Web 应用程序 (javascript)?
  • 您使用的是哪种 UI 技术?摇摆?安卓? HTML 的东西?
  • yup m 使用秋千、小程序。请帮忙。
  • 使用特定时间段的计时器为文本的背景/前景设置颜色。
  • 很好地尝试了那个计时器,我使用的是 System.nanoTime();并突出显示,直到纳秒结束。没有多大用处。

标签: java swing text highlight


【解决方案1】:

+1 对 StanislavL 的回答。

做了一个简短的例子希望对你有帮助。

在这里我创造了我的词和它们的时间:

int[] timings = {2000, 1000, 4000};
String[] words = new String[]{"Hello", "java", "whoooooh"};

点击开始按钮后:

2000 毫秒后:

1000 之后:

4000 毫秒后:

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
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, 1000, 4000};
    private String[] words = new String[]{"Hello", "java", "whoooooh"};
    private DefaultHighlighter.DefaultHighlightPainter highlightPainter = new DefaultHighlighter.DefaultHighlightPainter(Color.GREEN);
    private int count = 0;
    private boolean fisrTime = true;
    private JFrame frame;
    private JTextPane jtp;
    JButton startButton;

    public KaraokeTest() {
        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 = createAndStartTimer(timings[count], count);

                while (t.isRunning()) {//wait for timer to be done
                    try {
                        Thread.sleep(1);
                    } catch (InterruptedException ex) {
                        ex.printStackTrace();
                    }
                }

                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) {

        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                int sp = 0;
                for (int i = 0; i < count; i++) {
                    sp += words[i].length() + 1;
                }
                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();
            }
        });
        t.setRepeats(false);
        t.start();
        return t;
    }

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

更新:

修复了上面的代码,使其能够在指定的时间内突出显示句子中的单个字符:

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
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, 1000, 4000, 2000, 3000};//char timings
    private String[] words = {"H", "e", "l", "l", "o"};//each indiviaul word
    private String sentence = "Hello";//entire string for writing to JSCrollPane
    private DefaultHighlighter.DefaultHighlightPainter highlightPainter = new DefaultHighlighter.DefaultHighlightPainter(Color.GREEN);
    private int count = 0;
    private boolean fisrTime = true;
    private JFrame frame;
    private JTextPane jtp;
    JButton startButton;

    public KaraokeTest() {
        initComponents();
    }

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

        jtp = new JTextPane();

        jtp.setText(sentence);

        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 = createAndStartTimer(timings[count], count);

                while (t.isRunning()) {//wait for timer to be done
                    try {
                        Thread.sleep(1);
                    } catch (InterruptedException ex) {
                        ex.printStackTrace();
                    }
                }

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

            }
        }).start();
    }

    private Timer createAndStartTimer(int delay, final int count) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                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();
            }
        });
        t.setRepeats(false);
        t.start();
        return t;
    }

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

【讨论】:

  • +1 为例。我宁愿不写代码,而是让作者写,但你的例子真的很好!
  • 嘿,请不要错过理解我。希望这会让你清楚我想要这样的东西:link
  • @StanislavL 我知道这很糟糕,但我喜欢编码,谢谢:)。
  • @joeyrohan 我现在已经展示了如何对单词进行计时,您可以轻松地更改此示例以适用于字符。付出一些努力你知道吗?
  • 好的,谢谢:) 会尽力回到这篇文章。但是,我能做的这些事情:/.. 时间一开始就设定好了,对于每个单词。然后卡拉 OK 是播放。所以可以播放任何卡拉 OK。所以我不必为每个字符设置时间。每次..数据问题。
【解决方案2】:

您可以从链接http://java-sl.com/blink.html开始

为 JTextArea 添加高亮并让它们闪烁一段时间。

【讨论】:

  • 根据计时器更改颜色,使其具有闪烁效果。对吧??
  • 好主意,但如果我能根据歌曲突出显示它们会更好..:))
  • 不是眨眼效果...这个词应该在给定的时间内突出显示...不是眨眼..并且没有 2 使用 jtext 区域!来吧!
  • 是一样的。如果您不想眨眼,只需添加一段时间的高光,然后删除并再添加一个高光。只需使用 Timer 来添加和删除亮点
  • @StanislavL 是的,但不能完全匹配高升的时间。例如:-“单独”一词应突出显示 4 88888 纳秒。那么,我应该能够 2 看到它被突出显示,ALone ..如何匹配 dis 的东西??
猜你喜欢
  • 2011-12-20
  • 1970-01-01
  • 2014-08-07
  • 1970-01-01
  • 1970-01-01
  • 2011-02-25
  • 1970-01-01
  • 2013-08-25
相关资源
最近更新 更多