Есть ли способ повторно передавать изменяющийся массив в Java Canvas и обновлять экран? - PullRequest
0 голосов
/ 18 мая 2019

Я пытаюсь создать программу для визуализации пузырьковой сортировки.В идеале, после пузырьковой сортировки меняются два числа в массиве, AWT перерисовывает прямоугольники на холсте, чтобы показать обновление массива.

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

import java.awt.Canvas;
import java.awt.Graphics;
import javax.swing.JFrame;

public class VisMain extends Canvas {

    /**
     * 
     */
    private static final long serialVersionUID = 1L;

    private int[] array;

    public static void bubble_srt(int array[]) {
        int n = array.length;
        int k;
        for (int m = n; m >= 0; m--) {
            for (int i = 0; i < n - 1; i++) {
                k = i + 1;
                if (array[i] > array[k]) {
                    swapNumbers(i, k, array);
                }   

            }
        }
    }

    private static void swapNumbers(int i, int j, int[] column) {

        int temp;
        temp = column[i];
        column[i] = column[j];
        column[j] = temp;
        VisMain set = new VisMain();
       set.arraySetter(column);
    }

    public void arraySetter(int[] list) {
        this.array = list;
                repaint();
    }

    public static void main(String[] args) {
            JFrame frame = new JFrame("My Drawing");
            Canvas canvas = new VisMain();
            canvas.setSize(400, 400);
            frame.add(canvas);
            frame.pack();
            frame.setVisible(true);
            int [] input = { 4, 2, 5, 6, 33, 15, 34, 0, 1, 99 };
            VisMain obj = new VisMain();
            obj.arraySetter(input);
            bubble_srt(input);
        }

    public void paint(Graphics g) {
            for(int i = 0; i <= array.length; i++) {
                g.drawRect((i + 1) * 60, 100 , 50, array[i]);
            }

    }
    }

Я ожидалхолст, чтобы хотя бы что-то отобразить, но я получил java.lang.NullpointerException в for() loop в методе paint().

Ответы [ 2 ]

1 голос
/ 18 мая 2019

Эта строка вашего кода ...

frame.setVisible(true);

вызывает ваш метод paint(Graphics g), который вызывает NullPointerException, так как на этом этапе член array класса VisMain по-прежнему равен нулю (согласно опубликованному вами коду).

Следовательно, вам необходимо присвоить значение array перед тем, как вызовет frame.setVisible(true).

Приведенный ниже код работает для меня, т. Е. Нет NullPointerException с использованием JDK 12.0.1 в Windows 10. Это в основном код, который вы опубликовали. Единственная часть, которую я изменил, была в методе main(), но для полноты я публикую весь код, который вы опубликовали, включая мои изменения, чтобы вы могли скопировать / вставить его.

package guitests;

import java.awt.Canvas;
import java.awt.Graphics;
import javax.swing.JFrame;

public class VisMain extends Canvas {
    private static final long serialVersionUID = 1L;
    private int[] array;

    public static void bubble_srt(int array[]) {
        int n = array.length;
        int k;
        for (int m = n; m >= 0; m--) {
            for (int i = 0; i < n - 1; i++) {
                k = i + 1;
                if (array[i] > array[k]) {
                    swapNumbers(i, k, array);
                }
            }
        }
    }

    private static void swapNumbers(int i, int j, int[] column) {
        int temp;
        temp = column[i];
        column[i] = column[j];
        column[j] = temp;
        VisMain set = new VisMain();
        set.arraySetter(column);
    }

    public void arraySetter(int[] list) {
        this.array = list;
        repaint();
    }

    /* Only this method is changed from original code posted by DeusDeus. */
    public static void main(String[] args) {
        JFrame frame = new JFrame("My Drawing");
        int[] input = {4, 2, 5, 6, 33, 15, 34, 0, 1, 99};
        VisMain obj = new VisMain();
        obj.arraySetter(input);
        obj.setSize(400, 400);
        frame.add(obj);
        frame.pack();
        frame.setVisible(true);
        bubble_srt(input);
    }

    public void paint(Graphics g) {
        for (int i = 0; i < array.length; i++) {
            g.drawRect((i + 1) * 60, 100, 50, array[i]);
        }
    }
}
0 голосов
/ 18 мая 2019

Вы получаете java.lang.NullpointerException, поскольку ваш array равен null. Пожалуйста, исправьте это, и ваш код должен работать. Вы не можете получить array.length из нуля.

Я редактирую свой ответ, так как мне нравится ответ, представленный @ Abra

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...