封闭的 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,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) {}
                }
            }
        }   
    }
}

任何帮助将不胜感激。感谢阅读。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)