我的目标是创建以下内容:一系列同心圆,每个圆都有一个随机颜色作为轮廓,希望能创造出漂亮的东西。我这样做的方法是绘制一系列直径逐渐增大的椭圆(未填充),范围从变量 innerDiameter 到 outerDiameter 。
我遇到了一些问题,并且会以这样一种方式对其进行说明:其他人可以从这个帖子中获取信息,而不是仅仅帮助我。
1)在Eclipse上,我的JPanel声明旁边有一个感叹号: mainPanel ,表示它从未被使用过,当它明显在代码中。我在这一行旁边发表评论,以使其更清晰。我已经尝试关闭eclipse并剪切和重新编写源代码等等所以我猜它是愚蠢的。
2)我正在抛出 NullPointerExceptions ,首先是在尝试将 y 的值分配给帧的高度减去变量 i <的行/ em>的。我不知道为什么会这样;据我所知,在第一轮循环中, y 的值将为零,但为什么这意味着发生错误我不知道。再次看到关于来源的评论。
3)为了检查这一点,我将 y 的值更改为一个常数,此时下一行会抛出错误,我老实说不知道为什么并且为此一会儿。
4)调试没有帮助,我在一个方法的开头放了一个断点,并尝试逐行“跳过”,只是为了找到调试器跳过并最终得到上面提到的错误。知道为什么会这样吗?很高兴重新编辑或编辑帖子以使其对其他人更有用,我是Java的新手,所以感谢大家在这里提供的所有帮助。感谢
import java.awt.*;
import javax.swing.*;
public class CircleGenerator {
private int outerDiameter;
private int innerDiameter;
private int colorRange;
private Color bgColor;
private JFrame frame; // 1)this is where my first point occurs.
private JPanel mainPanel;
//private JButton nextCircleButton;
private CircleDrawer drawer;
public CircleGenerator(int outer, int inner, int colorRange, Color bgColor) {
this.outerDiameter = outer;
this.innerDiameter = inner;
this.colorRange = colorRange;
this.bgColor = bgColor;
}
public static void main(String[] args) {
CircleGenerator myGenerator = new CircleGenerator(30,3,200,Color.RED);
myGenerator.setupGUI();
//myGenerator.genCircle();
}
public void setupGUI() {
// Sets up the environment for the circles to be drawn
JFrame frame = new JFrame("Beautiful Circles");
JPanel mainPanel = new JPanel();
mainPanel.setBackground(bgColor);
//JButton nextCircleButton = new JButton("Next Circle"); //will use later to regenerate more circles
CircleDrawer drawer = new CircleDrawer();
mainPanel.add(drawer);
frame.getContentPane().add(mainPanel);
frame.setSize(outerDiameter+innerDiameter, outerDiameter+innerDiameter);
frame.setVisible(true);
genCircle();
}
private void genCircle() {
// generate the necessary parameters to send to the Circle Drawer
for (int i = innerDiameter; i < outerDiameter+1; i++) {
int red = (int) (Math.random() * colorRange) + 1;
int green = (int) (Math.random() * colorRange + 1);
int blue = (int) (Math.random() * colorRange + 1);
int x = i - innerDiameter;
int y = frame.getContentPane().getHeight() - i; //2) the first NullPointerException
drawer.updateValues(i, x, y, red, green, blue); //3) where another NullPointerException is thrown.
drawer.repaint();
}
}
class CircleDrawer extends JPanel {
private int diameter;
private int x; // the two x and y values are for the
private int y; // coordinates of the upper left corner of the oval.
private int red;
private int green;
private int blue;
void updateValues(int diameter, int x, int y, int red, int green, int blue) {
this.diameter = diameter;
this.x = x;
this.y = y;
this.red = red;
this.green = green;
this.blue = blue;
}
@Override
protected void paintComponent(Graphics g) {
g.setColor(new Color(red,green,blue));
g.drawOval(x,y,diameter,diameter);
}
}
}