0

ASCII 文字を生成する Java プログラムを作成しました。

試してみたい場合は、次のコードをご覧ください。

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class asciiTable implements ActionListener {
    private static JButton exebouton;
    private JTextArea ecran = new JTextArea();
    private JScrollPane scrollecran = new JScrollPane(ecran);
    String line = "-------------";

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

    private asciiTable() {
        // Window
        JFrame frame = new JFrame("Name");
        frame.setBounds(400, 350, 625, 355);
        frame.setLayout(null);

        Container container = frame.getContentPane();

        // Panel
        JPanel panneau = new JPanel();
        panneau.setLayout(null);
        panneau.setBounds(2, 42, 146, 252);
        frame.add(panneau);

        JLabel nglabel = new JLabel("Click");
        nglabel.setBounds(5, 0, 200, 20);
        panneau.add(nglabel);

        // Button
        exebouton = new JButton("Execute");
        exebouton.setBounds(4, 18, 138, 47);
        exebouton.addActionListener(this);
        panneau.add(exebouton);

        // Text Area
        ecran.setEditable(false);
        ecran.setLineWrap(true);
        scrollecran.setBounds(150, 42, 467, 252);
        container.add(scrollecran);

        // Show
        frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        Object test = e.getSource();    

        ecran.setText(ecran.getText() + line + '\n'
                    + "[ASCII TABLE]" + '\n'
                    + line + '\n');
        for (int i = 32, j = 0; i <= 800; i++, j++){ // WARNING: Big loop might lag your computer
            String putzero = "";
            if (i < 100){
                putzero = "0";
            }
            if (j >= 5){
                ecran.setText(ecran.getText() + "\n");
                j = 0;
            }
            ecran.setText(ecran.getText() + "[" + putzero + i + "] " + Character.toString ((char) i) + "\t");
        }
        ecran.setText(ecran.getText() + "\n");
    }

}

私の質問は次のとおりです。Java GUI の大きなループが原因で、コンピューターが遅延またはフリーズするのはなぜですか? 速度を改善する方法はありますか?

4

5 に答える 5

3

Swing のアクションは、すべてのイベントを処理しているスレッドで実行しないでください。

http://docs.oracle.com/javase/tutorial/uiswing/concurrency/worker.htmlを参照してください。

于 2013-03-31T15:41:40.373 に答える
2

Swing はシングルスレッドです。EDTUI の更新を防止するために、リソースを大量に消費するアクションを実行しています。SwingWorkerなどの Swing の同時実行メカニズムの 1 つを使用して、この機能を処理します。

于 2013-03-31T15:41:57.773 に答える
0

GUIスレッドでループを実行しているためです。そのように別のスレッドで処理する必要があります。GUI はハングアップしません。

于 2013-03-31T15:42:41.830 に答える