使用延时将Swing组件中字符串数组的内容显示为迭代。JAVA
我有一个字符串数组,我正试图在JavaSwing组件中以幻灯片的形式(一个接一个)显示这些字符串。我还试图在迭代之间添加延迟时间 我试图通过使用JTextArea来实现这一点,并在其中添加了一个动作侦听器。以下是我现在掌握的代码:使用延时将Swing组件中字符串数组的内容显示为迭代。JAVA,java,swing,user-interface,iteration,Java,Swing,User Interface,Iteration,我有一个字符串数组,我正试图在JavaSwing组件中以幻灯片的形式(一个接一个)显示这些字符串。我还试图在迭代之间添加延迟时间 我试图通过使用JTextArea来实现这一点,并在其中添加了一个动作侦听器。以下是我现在掌握的代码: private class myActionListener implements ActionListener { public void actionPerformed(ActionEvent e) { // A BUNCH OF TEXT
private class myActionListener implements ActionListener {
public void actionPerformed(ActionEvent e) {
// A BUNCH OF TEXT PROCESSING
//NOTE: myInfo.getContents() returns an ArrayList<myType>.
Iterator<myType> iterator = myInfo.getContents().iterator();
int i = 0;
while (iterator.hasNext()) {
myTextArea.setText(iterator.next().toString());
// to add time betweeen iterations i wanted to use the thread
// delay method.
}
}
}
私有类myActionListener实现ActionListener{
已执行的公共无效操作(操作事件e){
//一堆文本处理
//注意:myInfo.getContents()返回一个ArrayList。
迭代器迭代器=myInfo.getContents().Iterator();
int i=0;
while(iterator.hasNext()){
myTextArea.setText(iterator.next().toString());
//为了在迭代之间增加时间,我想使用线程
//延迟法。
}
}
}
我的代码不起作用,因为JTextArea没有动作侦听器
更新
注意:很多回复都说我应该为JTextArea使用ActionListener;然而,Eclipse并没有告诉我JTextArea有一个名为addActionListener的方法
我有点困在这里,您认为哪个Java Swing组件最适合这种情况?
数组中的文本可能很长,因此单线标签不是一个好的选择
我还有什么其他选择或方法
非常感谢,非常感谢您的帮助和建议。将您的
ActionListener
与javax.Swing.Timer
结合使用。分配给计时器的ActionListener
将以指定的延迟定期调用
有关更多信息,请参见这是一个基于@Robin发布的建议的基本示例
public class TestDisplayString {
public static void main(String[] args) {
new TestDisplayString();
}
public TestDisplayString() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException ex) {
} catch (InstantiationException ex) {
} catch (IllegalAccessException ex) {
} catch (UnsupportedLookAndFeelException ex) {
}
JFrame frame = new JFrame("Test");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new BorderLayout());
frame.add(new TestPane());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public class TestPane extends JPanel {
private JTextArea textArea;
private List<String> content;
private Iterator<String> iterator;
public TestPane() {
readText();
setLayout(new BorderLayout());
textArea = new JTextArea(10, 40);
textArea.setLineWrap(true);
textArea.setWrapStyleWord(true);
add(new JScrollPane(textArea));
iterator = content.iterator();
Timer timer = new Timer(1000, new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if (iterator.hasNext()) {
textArea.setText(iterator.next());
} else {
((Timer)e.getSource()).stop();
}
}
});
timer.setRepeats(true);
timer.setCoalesce(true);
timer.start();
}
protected void readText() {
content = new ArrayList<>(25);
BufferedReader reader = null;
try {
reader = new BufferedReader(new InputStreamReader(getClass().getResourceAsStream("/Text.txt")));
String text = null;
while ((text = reader.readLine()) != null) {
if (text.trim().length() > 0) {
content.add(text);
}
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
reader.close();
} catch (Exception e) {
}
}
}
}
}
摆动计时器非常容易使用。当您创建计时器时,您可以
指定计时器“关闭”时要通知的操作侦听器。
此侦听器中的actionPerformed方法应包含以下代码
无论你需要完成什么任务。创建计时器时,
您还可以指定计时器触发之间的毫秒数。如果
如果希望计时器只关闭一次,可以调用
设置在计时器上重复(错误)。要启动计时器,请调用其start
方法要暂停,请呼叫停止
请注意,Swing timer的任务是在事件分派中执行的
线这意味着任务可以安全地操作组件,但是
这也意味着任务应该快速执行。如果任务可能
花一段时间来执行,然后考虑使用SWIFWER,而不是
或者除了计时器之外。有关说明,请参见Swing中的并发
关于使用SwingWorker类以及有关使用Swing的信息
多线程程序中的组件
让我们看一个使用计时器定期更新
组成部分TumbleItem小程序使用计时器在以下时间更新其显示:
定期。(若要查看此小程序是否正在运行,请转到“如何创建”
小程序。此小程序首先创建并启动计时器:
定时器=新定时器(速度,此);timer.setInitialDelay(暂停);
timer.start()
速度和暂停变量表示小程序参数,如下所示:
在另一页上配置,分别为100和1900,因此
第一个计时器事件将在大约1.9秒后发生,
并每0.1秒重复一次。将此指定为第二个参数
对于计时器构造函数,TumbleItem指定它是操作
计时器事件的侦听器
启动计时器后,TumbleItem开始加载一系列图像
在后台线程中。同时,计时器事件开始发生,
导致actionPerformed方法执行:
已执行的公共无效操作(操作事件e){
//如果仍在加载,则无法设置动画。
如果(!worker.isDone()){
回来
}
loopslot++;
if(环槽>=nimgs){
环槽=0;
off+=偏移量;
如果(关闭<0){
off=宽度-最大宽度;
}否则如果(关闭+最大宽度>宽度){
关=0;
}
}
animator.repaint();
if(loopslot==nimgs-1){
timer.restart();
} }
在加载映像之前,worker.isDone返回false,因此timer
事件被有效地忽略。事件处理的第一部分
代码只是设置动画控件的
paintComponent方法:loopslot(图中下一个图形的索引
动画)和关闭(下一个图形的水平偏移)
最终,loopslot将到达映像阵列的末端并开始
当这种情况发生时,将执行操作结束时的代码
重新启动计时器。执行此操作会导致计时器启动前的短暂延迟
动画序列再次开始
通过让它休眠():)来获取想法。bonCodigo,获取线程。sleep(),这很快。谢谢它解决了你的问题吗?我可以把它作为一个答案发布吗:)顺便说一句,你可以使用System.currentTimeMillis()
实现你自己的延迟,我在上面提供的链接中也解释了这一点。我将使用Thread.Sleep(arg)来延迟迭代器的迭代。我最重要的问题是找到合适的JavaSwing组件来显示本文。因为它是多行的,而acitonLIstener不是由JTextArea实现的。那么我的主要问题是,我应该使用什么来代替动作监听器,因为JTextArea不支持动作监听器。@动作监听器连接到计时器,计时器在延迟过期后调用action listener,并且action listener应该用于更新文本区域。如果您查看以下网站:,您会发现JTextArea不支持ActionListener。我正在试图找到合适的swing组件,它允许我这样做。@theSun如果你花时间阅读Robin提供的链接,你会发现
To perform a task once, after a delay.
For example, the tool tip manager uses Swing timers to determine when to show a tool tip and when to hide it.
To perform a task repeatedly.
For example, you might perform animation or update a component that displays progress toward a goal.
loopslot++;
if (loopslot >= nimgs) {
loopslot = 0;
off += offset;
if (off < 0) {
off = width - maxWidth;
} else if (off + maxWidth > width) {
off = 0;
}
}
animator.repaint();
if (loopslot == nimgs - 1) {
timer.restart();
} }