Включение экземпляра типа GUI останавливает EDT

В настоящее время я делаю визуализатор алгоритмов и пытаюсь поместить все остальные алгоритмы в другой класс. я получал эту ошибку

Включающий экземпляр типа GUI недоступен.

Поэтому я добавил gui в строку (в классе алгоритмов):

GUI.SortWorker sw = gui.new SortWorker(items);

Он исправил ошибку, но не обновляет EDT. Я также пытался сделать все статическим, но при перерисовке возникли проблемы со ссылками на статические и нестатические объекты. Я пытался заменить repaint() на gui.repaint() или frame.repaint(), но это тоже не помогло, так что я вернулся к исходной точке. Вот мой код (восклицание: код был сокращен):

package proj;

@SuppressWarnings("serial")
class GUI extends JPanel
{
    static int screenWidth = 1276;
    static int screenHeight = 720;
    static int[] listArr = new int[126];
    
    public void setItems(int[] listArr)
    {
        GUI.listArr = listArr;
        repaint();
    }
    
    public void sort() {
        new SortWorker(listArr).execute();
    }
    
    public class SortWorker extends SwingWorker<Void, int[]> {
        private int[] items;
        public boolean isPub = false;

        public SortWorker(int[] unsortedItems) {
            items = Arrays.copyOf(unsortedItems, unsortedItems.length);
        }
        
        public void publishData(int[] items) {
            super.publish(Arrays.copyOf(items, items.length));
        }
        
        protected Void doInBackground() {
            Algorithims.HeapSort(items);
            return null;
        }
        

        @Override
        protected void process(List<int[]> list) {
            int[] items = list.get(list.size() - 1);
            setItems(items);
        }

        @Override
        protected void done() {}
    }

    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        this.setBackground(Color.darkGray);
        int width = 10;
        int x = 0;
        for (int i = 0; i < (screenWidth - 15) / width; i++) {
            g.setColor(Color.white);
            g.fillRect(x, (screenHeight - listArr[i]) - 40, width, listArr[i]);
            g.setColor(Color.black);
            g.drawRect(x, (screenHeight - listArr[i]) - 40, width, listArr[i]);
            x += width;
        }
        
    }
    
    public static void showGUI() {
        listArr = shuffleRectangles();
        JFrame frame = new JFrame();
        GUI gui = new GUI();
        gui.sort();
        
        
        frame.setTitle("Algorithim Visualizer");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(screenWidth, screenHeight); 
        frame.setResizable(false);
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
        frame.add(gui);
    }
    
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        EventQueue.invokeLater( () -> showGUI() );
        
    }
    
}

Вот код из другого класса (тот же пакет)

package proj;

import proj.GUI.SortWorker;

public class Algorithims {

    public static void HeapSort(int[] items) {
        GUI gui = new GUI();
        GUI.SortWorker sw = gui.new SortWorker(items);

        for (int i = 0; i < items.length; i++) {
            for (int j = 0; j < items.length; j++) {
                if (items[i] < items[j]) {
                    //swapping i and j
                    int temp = items[i];
                    items[i] = items[j];
                    items[j] = temp;
                    
                    sw.publishData(items);
                    
                    try {
                        Thread.sleep(1); 
                    } catch (Exception e) {}
                }
            }
        }   
    }
}

Любая помощь будет принята с благодарностью. Спасибо за чтение.


person Anon214    schedule 15.03.2021    source источник
comment
См.: Анимация пузырьковой сортировки для примеров двух разных подходов.   -  person camickr    schedule 15.03.2021