Вопрос по java, thread-sleep, swing – Качели JForm зависает до завершения действия [дубликат]

0

На этот вопрос уже есть ответ здесь:

поворотное окно зависает, не отображается контент 1 ответ

Я хочу создать приложение Java, которое визуализирует сортировку слиянием, используя компоненты Swing. Пока ямы написали это:

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.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextArea;

public class MergeSort extends JFrame {

    private int[] helper;

    private int[] heights;
    private JPanel mainPanel;
    private JTextArea[] areas;
    private JTextArea txtSpeed;
    private JLabel lblSpeed;
    private JButton btnStart;

    private Random rnd;

    private final int FRAME_HEIGHT = 550;
    private final int FRAME_WIDTH = 1100;

    private final int ELEMENTS_TO_SORT = 100;

    private final int BAR_WIDTH = 7;

    private final int SPACING = 10;

    private int SLEEP_TIME = 50;

    public MergeSort() {
        super("Merge Sort Visualisation");
        helper = new int[ELEMENTS_TO_SORT];
        mainPanel = new JPanel();
        mainPanel.setLayout(null);
        rnd = new Random();

        areas = new JTextArea[ELEMENTS_TO_SORT];

        heights = new int[areas.length];

        for (int i = 0; i < areas.length; i++) {
            areas[i] = new JTextArea();
            heights[i] = rnd.nextInt(FRAME_HEIGHT - 100);
            mainPanel.add(areas[i]);
            areas[i].setSize(BAR_WIDTH, heights[i]);

            areas[i].setLocation((i + 1) * SPACING,
                    FRAME_HEIGHT - areas[i].getHeight());
            areas[i].setText(toDigits(heights[i]));
        }

        btnStart = new JButton("Start");
        btnStart.addActionListener(
                new ActionListener() {
                    @Override
                    public void actionPerformed(ActionEvent e) {
                        try {
                            setSleepTime(Integer.parseInt(txtSpeed.getText()));
                            sort();

                        } catch (NumberFormatException ex) {
                            //s
                        } catch (InterruptedException ex) {
                            //i
                        }

                    }
                }
        );

        mainPanel.add(btnStart);
        btnStart.setSize(100, 25);
        btnStart.setLocation(0, 25);

        txtSpeed = new JTextArea("50");
        mainPanel.add(txtSpeed);
        txtSpeed.setSize(100, 25);
        txtSpeed.setLocation(0, 0);

        lblSpeed = new JLabel("Sleep Time");
        mainPanel.add(lblSpeed);
        lblSpeed.setSize(100, 25);
        lblSpeed.setLocation(110, 0);

        this.add(mainPanel);

        this.setSize(FRAME_WIDTH, FRAME_HEIGHT);

    }

    private void setSleepTime(int x) {
        if (x >= 0) {
            SLEEP_TIME = x;
        } else {
            SLEEP_TIME = 0;
        }
    }

    public void sort() throws InterruptedException {
        mergesort(0, heights.length - 1);
    }

    private void mergesort(int low, int high) throws InterruptedException {

        if (low < high) {

            int middle = low + (high - low) / 2;

            mergesort(low, middle);

            mergesort(middle + 1, high);

            merge(low, middle, high);
        }
    }

    private void merge(int low, int middle, int high) throws InterruptedException {

        for (int i = low; i 
Дон»т использовать.sleep(), Использовать качелиTimer Paul Samsotha
Об этом спрашивали многие,много,много раз здесь. Попробуйте поискать, прежде чем спрашивать Hovercraft Full Of Eels
Например, это возможный дубликатповоротное окно зависает, не отображается контент, ТакжеВот, а такжеВот.... и многое другое. Голосование закрыть этот вопрос как дубликат. Hovercraft Full Of Eels
@HovercraftFullOfEels прав, есть много одинаковых вопросов, ищите и читайте их. alex2410
Также смэтот аналогичный вопрос David Kroukamp

Ваш Ответ

1   ответ
3

EDT в вашемActionListener, потому что ваш кадр зависает доactionPerformed() метод будет завершен. Когда вы используетеThread.sleep(...) это нет помощьSwing перекрасить вашу рамку.

Кажется, вам нужно использоватьсвингTimer для обновления. Также вы можете использоватьSwingWorker в течение длительного времени фоновые процессы.

Прочитать оКонкуренция в Swing.

Похожие вопросы