Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/385.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用延时将Swing组件中字符串数组的内容显示为迭代。JAVA_Java_Swing_User Interface_Iteration - Fatal编程技术网

使用延时将Swing组件中字符串数组的内容显示为迭代。JAVA

使用延时将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

我有一个字符串数组,我正试图在JavaSwing组件中以幻灯片的形式(一个接一个)显示这些字符串。我还试图在迭代之间添加延迟时间

我试图通过使用JTextArea来实现这一点,并在其中添加了一个动作侦听器。以下是我现在掌握的代码:

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