Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/365.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
我正在尝试创建一个Java程序,使字母在JLabel中一次显示一个_Java - Fatal编程技术网

我正在尝试创建一个Java程序,使字母在JLabel中一次显示一个

我正在尝试创建一个Java程序,使字母在JLabel中一次显示一个,java,Java,我试图用java创建一个程序,使字符串中的字母一次一个地出现在JLabel中,但每次都会同时出现文本。线程上的延迟越大。Sleep();,它出现的时间越长。我想现在发生的是,它把所有的内容都写出来,然后打印到标签上,但我仍然不知道该怎么做来修复它。代码如下: package uiTesting; import java.awt.BorderLayout; import java.awt.EventQueue; import javax.swing.JFrame; import javax.s

我试图用java创建一个程序,使字符串中的字母一次一个地出现在JLabel中,但每次都会同时出现文本。线程上的延迟越大。Sleep();,它出现的时间越长。我想现在发生的是,它把所有的内容都写出来,然后打印到标签上,但我仍然不知道该怎么做来修复它。代码如下:

package uiTesting;

import java.awt.BorderLayout;
import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.AbstractButton;
import javax.swing.JButton;
import java.awt.Font;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import javax.swing.JLabel;
import javax.swing.SwingConstants;

public class ScrollingText extends JFrame {

private JPanel contentPane;

        //Variables and values

public static String ThingToBePrinted = "You look down the gigantic hallway, the cold breath of spirits breathing down your neck. "
        + "Its nothing you haven't felt before. The spirits of those long past were always closer here, where many of them met"
        + " their end. Maybe you would be one of them, someday. But not today. Today, there was still too much to be done to rest.";

public static String ThingPrinted = "";

public static int Mili = 100;

public String html1 = "<html><body style='width: ";

public String html2 = "px'>";
/**
 * Launch the application.
 */
public static void main(String[] args) {
    System.out.println(ThingToBePrinted.length());
    EventQueue.invokeLater(new Runnable() {
        public void run() {
            try {
                ScrollingText frame = new ScrollingText();
                frame.setVisible(true);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    });
}


/**
 * Create the frame.
 */
public ScrollingText() {
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setBounds(100, 100, 719, 504);
    contentPane = new JPanel();
    contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
    setContentPane(contentPane);
    contentPane.setLayout(null);
        //The only Label
    JLabel Scrolling_L1 = new JLabel("");
    Scrolling_L1.setFont(new Font("Tahoma", Font.PLAIN, 15));
    Scrolling_L1.setVerticalAlignment(SwingConstants.TOP);
    Scrolling_L1.setBounds(10, 11, 693, 354);
    contentPane.add(Scrolling_L1);

        //The only Button
    JButton Master_B1 = new JButton("Print Text");
    Master_B1.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent arg0) {
            try {
                //scrolling function
                for (int i = 0; i < ThingToBePrinted.length(); i++) {
                    String x = String.valueOf(ThingToBePrinted.charAt(i));
                    ThingPrinted = ThingPrinted + x;
                    Scrolling_L1.setText(html1 + "500" + html2 + ThingPrinted); //Html for wrapping text
                    Thread.sleep(Mili); //Delay between letters
                }
            }catch (Exception e){
                JOptionPane.showMessageDialog(null, "Error");
            }
        }
    });
    Master_B1.setFont(new Font("Tahoma", Font.PLAIN, 25));
    Master_B1.setBounds(164, 385, 375, 70);
    contentPane.add(Master_B1);

}
}
软件包测试;
导入java.awt.BorderLayout;
导入java.awt.EventQueue;
导入javax.swing.JFrame;
导入javax.swing.JOptionPane;
导入javax.swing.JPanel;
导入javax.swing.border.EmptyBorder;
导入javax.swing.AbstractButton;
导入javax.swing.JButton;
导入java.awt.Font;
导入java.awt.event.ActionListener;
导入java.awt.event.ActionEvent;
导入javax.swing.JLabel;
导入javax.swing.SwingConstants;
公共类ScrollingText扩展了JFrame{
私有JPanel内容窗格;
//变量和值
publicstaticstringthingtobeprinted=“你俯瞰巨大的走廊,冰冷的灵魂气息从你的脖子上呼出。”
+“没有什么是你以前没有感觉到的。那些很久以前的灵魂总是离这里更近,他们中的许多人在这里相遇”
+“他们的结局。也许有一天你会成为他们中的一员。但不是今天。今天,还有太多事情要做。”;
公共静态字符串ThingPrinted=“”;
公共静态整数Mili=100;
公共字符串html1=“”;
/**
*启动应用程序。
*/
公共静态void main(字符串[]args){
System.out.println(ThingToBePrinted.length());
invokeLater(新的Runnable(){
公开募捐{
试一试{
ScrollingText frame=新的ScrollingText();
frame.setVisible(true);
}捕获(例外e){
e、 printStackTrace();
}
}
});
}
/**
*创建框架。
*/
公共滚动文本(){
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
立根(100100719504);
contentPane=newjpanel();
setboorder(新的EmptyBorder(5,5,5,5));
setContentPane(contentPane);
contentPane.setLayout(null);
//唯一的标签
JLabel滚动_L1=新JLabel(“”);
滚动_L1.setFont(新字体(“Tahoma”,Font.PLAIN,15));
滚动设置垂直对齐(SwingConstants.TOP);
滚动1.setBounds(10,11693354);
contentPane.add(滚动显示);
//唯一的按钮
JButton Master_B1=新JButton(“打印文本”);
Master_B1.addActionListener(新ActionListener(){
已执行的公共无效操作(操作事件arg0){
试一试{
//滚动功能
for(int i=0;i

在这一点上,我非常感谢任何解决方案,我已经排除了几个小时的故障

您的问题与Swing中并发的工作方式有关。一个(不完美的)解决方案是使用SwingWorker。您可以将操作侦听器更改为:

Master_B1.addActionListener(event -> {
    SwingWorker<Object, Void> worker = new SwingWorker<Object, Void>() {
        @Override
        protected String doInBackground() throws InterruptedException {

            for (int i = 0; i < ThingToBePrinted.length(); i++) {
                ThingPrinted += ThingToBePrinted.charAt(i);
                Scrolling_L1.setText(html1 + "500" + html2 + ThingPrinted); // Html for wrapping text
                Thread.sleep(Mili); //Delay between letters
            }

            return null;
        }
    };

    worker.execute();

});
Master\u B1.addActionListener(事件->{
SwingWorker worker=新SwingWorker(){
@凌驾
受保护的字符串doInBackground()引发InterruptedException{
for(int i=0;i

阅读本教程:以更好地理解该主题。(您可能还想了解Java中的并发性,请参见示例)。

您的问题与Swing中并发性的工作方式有关。一个(不完美的)解决方案是使用SwingWorker。您可以将操作侦听器更改为:

Master_B1.addActionListener(event -> {
    SwingWorker<Object, Void> worker = new SwingWorker<Object, Void>() {
        @Override
        protected String doInBackground() throws InterruptedException {

            for (int i = 0; i < ThingToBePrinted.length(); i++) {
                ThingPrinted += ThingToBePrinted.charAt(i);
                Scrolling_L1.setText(html1 + "500" + html2 + ThingPrinted); // Html for wrapping text
                Thread.sleep(Mili); //Delay between letters
            }

            return null;
        }
    };

    worker.execute();

});
Master\u B1.addActionListener(事件->{
SwingWorker worker=新SwingWorker(){
@凌驾
受保护的字符串doInBackground()引发InterruptedException{
for(int i=0;i

阅读本教程:以更好地理解该主题。(您可能还想了解Java中的并发性,请参见示例)。

这是因为您正在从事件处理程序更新UI线程本身中的JLabel。更好的方法是在事件处理程序中启动一个新线程,然后从这个新线程更新JLabel。以下是您需要在代码中使用的部分。我已经测试过了,它是有效的

Master_B1.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent arg0) {
            try { // Start new thread here for updating JLabel.
                new Thread() {
                    public void run() {
                         //scrolling function
                        for (int i = 0; i < ThingToBePrinted.length(); i++) {
                            String x = String.valueOf(ThingToBePrinted.charAt(i));
                            ThingPrinted = ThingPrinted + x;
                            Scrolling_L1.setText(html1 + "500" + html2 + ThingPrinted); //Html for wrapping text
                            try {
                                Thread.sleep(Mili); // Delay between letters
                            } catch (Exception e) {
                            }
                        }
                    }
                }.start();
            }catch (Exception e){
                JOptionPane.showMessageDialog(null, "Error");
            }
        }
});
Master_B1.addActionListener(新ActionListener(){
已执行的公共无效操作(操作事件arg0){
尝试{//在此处启动新线程以更新JLabel。
新线程(){
公开募捐{
//滚动功能
for(int i=0;i