0

私のJavaプログラムでやりたいことは、ボタンを押すとtextfield、一定の間隔でテキストが表示されることです。つまり、ボタンを押すとjFrameポップアップが表示され、次のようなテキストを示すラベルがあります。

私は初心者で、この問題をグーグルで検索しようとしましたが、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 に対するすべての対話と変更は、イベント ディスパッチ スレッドのコンテキスト内で発生することが期待されます。

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 が動かなくなり、ユーザー エクスペリエンスが損なわれます。

Timerまたはなどの他のメカニズムを使用するSwingWorker

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 ループが実行されている間、ユーザー インターフェイスは再描画されず、他のイベントも処理されません。UI がフリーズします。イベント ディスパッチ スレッドが他のイベントを処理できるように、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 に答える