所以我在尝试为我的挥杆程序创建电传打字效果时遇到了一些麻烦。我本质上想用一个新的字母以40ms的增量更新一个JFrame,向用户“输入”一条消息。但是,当我尝试这样做时,它会闪烁很多。方法如下:
public static void animateTeletype(String input, JTextArea displayArea)
throws InterruptedException {
displayArea.setText("");
String s = "";
for(int i = 0; i<input.length(); i++) {
s += input.substring(i, i+1);
displayArea.setText(textToDisplay);
Thread.sleep(40);
displayArea.update(displayArea.getGraphics());
}
}
我认为问题源于更快地更新文本,并且必须更新它可以处理的更多。我不确定如何处理这个问题,因为缩短刻度时间会使文本滚动得太慢。任何建议表示赞赏!
**我已经解决了这个问题。这是我的新代码:
static Timer timer = null;
public static void animateTeletype(final String input, final JTextArea displayArea) throws InterruptedException
{
final String[] s = new String[1];
s[0] = " ";
final int[] i = new int[1];
i[0] = 0;
displayArea.setText("");
timer = new Timer(30, new ActionListener()
{
@Override
public void actionPerformed(ActionEvent e)
{
s[0] = input.substring(i[0], i[0]+1);
i[0]++;
displayArea.append(s[0]);
if(displayArea.getText().equals(input))
timer.stop();
}
});
timer.start();
}
答案 0 :(得分:3)
displayArea.update(displayArea.getGraphics());
不要使用update()方法。从来没有任何理由这样做。摆脱那种说法。
Swing组件会自动重新绘制。
displayArea.setText(textToDisplay);
不要使用setText(...)添加新文本。
相反,你应该使用:
displayArea.append( "some more text" );
不要将Thread.sleep(40)用于动画。你想要动画然后使用Swing Timer来安排动画。
我建议您查看Swing基础知识教程的其他部分。也许像How to Use Text Fields
。