0

我想在我的 java 程序中做的是,当我按下按钮时,它会textfield每隔一段时间显示文本。即我按下按钮然后jFrame弹出一个标签,其中显示如下文本:第一秒:“1st”然后是1秒的时间滞后,然后是第二件事:“2nd”

我是一个新手,我试图用谷歌搜索这个问题,但即使在 3-4 小时后我也找不到解决方案,我尝试了很多东西:睡觉,尝试捕捉......

请把答案写得很简单。

这是我的代码:在下面的代码中,当按下按钮时,jFrame 来了,但里面有一个白屏,当总和结束时,它的屏幕变灰并显示答案....

   private void jButton5ActionPerformed(java.awt.event.ActionEvent evt) {                                         
    See.setVisible(true);//See is the JFrame   
    t007.setVisible(true);//Label in See
    l2.setVisible(true);//TextField in See
    int ran, g, d, col, ran2;
    double y = 1000 * (Double.parseDouble(t2.getText()));
    int x = (int) y;
    d = 0;
    double c = Math.pow(10, Integer.parseInt(t1.getText()));
    col = Integer.parseInt(t3.getText());
    for (g = 0; g < col;) {
        ran = (int) (Math.random() * (c)); // Random Number Creation Starts
        if (ran > (c / 10)) {
            g = g + 1;
            ran2 = ((int) (Math.random() * 10)) % 2;
            if (ran2 == 1) {
                ran = ran * (-1);
            }
            d = d + ran;
            if (d < 0) {
                ran = ran * (-1);
                d = d + (2 * ran);
            }
            l2.setVisible(true);
            t007.setText("" + ran);
            System.out.println("" + ran);
            jButton6.doClick();
            //Pausing (Sleep)
            try {
                  Thread.sleep(x);

             } catch (InterruptedException ex) {
            Thread.currentThread().interrupt();
            }
            }
            }
             l2.setText("" + d);
               }                                        
4

4 回答 4

2

Swing 是一个单线程框架,也就是说,对 UI 的所有交互和修改都应该在 Event Dispatching Thread 的上下文中发生。

除其他外,EDT 负责处理重绘请求。

任何阻止 EDT 运行的东西(比如Thread.sleep长时间循环)都会阻止它处理事件,实际上“挂起”你的应用程序,直到它变得畅通无阻......

现在,我试图破译你的程序试图做什么......但失败了,所以相反......我做了一个漂亮的计数器......

在此处输入图像描述

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Random;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.Timer;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class TickOver {

    public static void main(String[] args) {
        new TickOver();
    }

    public TickOver() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                }

                JFrame frame = new JFrame("Testing");
                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 JTextField field;
        private JButton button;
        private int tick; 
        private Timer timer;

        public TestPane() {

            field = new JTextField(10);
            field.setEditable(false);
            button = new JButton("Start");
            button.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    button.setEnabled(false);
                    tick = 0;
                    timer.start();
                }
            });

            timer = new Timer(1000, new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    field.setText(Integer.toString(++tick));
                    if (tick > 4) {
                        timer.stop();
                        button.setEnabled(true);
                    }
                }
            });
            timer.setInitialDelay(0);

            setLayout(new GridBagLayout());
            GridBagConstraints gbc = new GridBagConstraints();
            gbc.gridwidth = GridBagConstraints.REMAINDER;
            add(field, gbc);
            add(button, gbc);

        }
    }
}

仔细查看Swing 中的并发以获取更多详细信息...

于 2013-09-23T08:28:00.520 回答
1

永远不应该在 UI 线程中睡觉,因为它会使UI 滞后。好像这个过程需要时间才能完成,UI 会卡住,用户体验会受到影响。

使用其他机制,例如TimerSwingWorker

Swing 中的并发性

于 2013-09-23T08:08:23.583 回答
0

休眠用户界面线程是非常糟糕的做法。(因为这会导致应用程序变得无响应。)您应该将所有这些代码放在实例的Run()方法中:Runnable

java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                // Your code here.
            }
        });
于 2013-09-23T08:03:47.943 回答
0

问题是您在事件调度线程上运行长时间运行的循环。但这是必须调度应用程序的所有事件(如鼠标或键盘事件)的线程,但也会重新绘制事件,导致您的用户界面在每次“脏”时都被重新绘制。这意味着,当您的 for 循环运行时,不会重新绘制用户界面,也不会处理任何其他事件。您的用户界面冻结!您的 jButton5ActionPerformed 方法应尽快返回,以便事件调度线程可以处理其他事件。您的长时间运行的操作应该由后台的单独线程运行。

一个很好的起点是以下关于 Swing 并发的教程:http: //docs.oracle.com/javase/tutorial/uiswing/concurrency/

也许您可以使用 SwingWorker 类来执行您的后台工作: http ://docs.oracle.com/javase/6/docs/api/javax/swing/SwingWorker.html

于 2013-09-23T08:22:46.913 回答