В настоящее время я делаю визуализатор алгоритмов и пытаюсь поместить все остальные алгоритмы в другой класс. я получал эту ошибку
Включающий экземпляр типа 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) {}
}
}
}
}
}
Любая помощь будет принята с благодарностью. Спасибо за чтение.