gpt4 book ai didi

java - 当我尝试运行我的程序时,GUI 无法加载,我不明白为什么

转载 作者:行者123 更新时间:2023-12-01 09:59:27 25 4
gpt4 key购买 nike

这部分代码在不使用数组或数组列表时工作正常。

import javax.swing.*;
public class GUI
{
public static void main(String[] args) {
JFrame frame = new JFrame("01");
frame.getContentPane().add(new Panel());
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setResizable(false);
frame.setVisible(true);
}
}

这部分代码在不使用数组或数组列表时工作正常

import java.awt.*;
import javax.swing.*;
import java.awt.event.*;

public class Panel extends JPanel
{
private Shapes shapes;

public Panel () {
setFocusable(true);
requestFocusInWindow();
setPreferredSize(new Dimension(500,500));
}

public void paintComponent(Graphics gc) {
super.paintComponent(gc);
shapes.draw(gc);
}
}

在这个类中,如果我不使用数组或数组列表,它可以正常运行,但我无法使其与它们一起使用。

import java.awt.*;
import java.util.ArrayList;
import javax.swing.*;
import java.awt.event.*;

public class Shapes
{

ArrayList <int[]> blocks = new ArrayList <int[]>();

int[] arr;
int w,x,y,z;

public void draw(Graphics gc) {
gc.setColor(Color.black);
blocks();
for(int i=0; i<blocks.size()-1; i++){
w=blocks.get(i)[0];
x=blocks.get(i)[1];
y=blocks.get(i)[2];
z=blocks.get(i)[3];
gc.fillRect(w, x, y, z);
}
}

public void blocks() {
popBlocks(100,500,300,30);
popBlocks(300,400,150,30);
popBlocks(500,300,150,30);
popBlocks(700,200,150,30);
popBlocks(900,100,150,30);
}

private void popBlocks(int a, int b, int c, int d) {
arr[0] = a;
arr[1] = b;
arr[2] = c;
arr[3] = d;
blocks.add(arr);
}
}

最佳答案

NullPointerExceptionPanel#paintComponent因为shapes未初始化...

public class Panel extends JPanel {

private Shapes shapes;

public Panel() {
shapes = new Shapes();

NullPointerExceptionShapes#popBlocks因为arr未初始化

public class Shapes
{
//...
int[] arr = new int[4];
//...

但是等等,这只绘制了一个形状?!这一切所做的就是更新 arr 的实例添加一些新值并将其添加到 blocks List

private void popBlocks(int a, int b, int c, int d) {
arr[0] = a;
arr[1] = b;
arr[2] = c;
arr[3] = d;
blocks.add(arr);
}

这意味着您有 5 个 block ,其值为 900,100,150,30 .

您应该使用 arr 而不是使用实例字段方法级别字段,例如...

public class Shapes
{
//...
//int[] arr;
//...

private void popBlocks(int a, int b, int c, int d) {
int[] arr = new int[4];
arr[0] = a;
arr[1] = b;
arr[2] = c;
arr[3] = d;
blocks.add(arr);
}
}

此外,for-loopdraw方法错误,应该是从 0-size - 1 开始循环,不是0-size - 2 ,例如

public void draw(Graphics gc) {
//...
for(int i=0; i < blocks.size(); i++){
//...

关于java - 当我尝试运行我的程序时,GUI 无法加载,我不明白为什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36928122/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com