首页 > 解决方案 > 有没有办法将不断变化的数组反复传递给 Java Canvas 并让它更新屏幕?

问题描述

我正在尝试创建一个程序来可视化冒泡排序。理想情况下,冒泡排序交换数组中的两个数字后,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.NullpointerExceptionfor() loop一个paint()

标签: javaarraysnullpointerexception

解决方案


这行代码...

frame.setVisible(true);

导致您的paint(Graphics g)方法被调用,这导致NullPointerException在此阶段,arrayVisMain的成员仍然为空(根据您发布的代码)。

因此,您需要array 调用frame.setVisible(true).

下面的代码适用于我,即NullPointerException在 Windows 10 上不使用 JDK 12.0.1。它基本上是您发布的代码。我唯一更改的部分是方法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]);
        }
    }
}

推荐阅读