Java 设置椭圆投掷错误
我目前正在处理一个项目,我得到了这个错误Java 设置椭圆投掷错误,java,swing,graphics,nullpointerexception,Java,Swing,Graphics,Nullpointerexception,我目前正在处理一个项目,我得到了这个错误Java.lang.NullPointerException,我不知道当你试图引用一个空对象实例时会发生这个错误,但我不知道如何修复它 这是我的代码: public void paint(Graphics g) { g.setColor(Color.red); g.drawOval(150, 150, 10, 10); } /** Main Method **/ public static void main(String [] args
Java.lang.NullPointerException
,我不知道当你试图引用一个空对象实例时会发生这个错误,但我不知道如何修复它
这是我的代码:
public void paint(Graphics g) {
g.setColor(Color.red);
g.drawOval(150, 150, 10, 10);
}
/** Main Method **/
public static void main(String [] args) {
Run run = new Run();
run.paint(null);
}
请帮我找到一个解决方案,并解释一下,以便我学习。非常感谢。安德烈你做得不对。为了在java中使用图形,您需要构建Swing/AWT组件。当前,您正在以null形式传递图形
run.paint(null);
您需要使用JFrame和其他swing组件来实现这一点。因为您要将
null
发送到paint
,图形g
包含null
(指向任何地方)
然后在
paint(…)
内部调用g
上的setColor(…)
,即null
null.setColor(…)
导致NullPointerException
您不能将null传递给绘制方法!下面是一个小示例,说明如何执行此操作:
import java.awt.Graphics;
import javax.swing.JComponent;
import javax.swing.JFrame;
class MyCanvas extends JComponent {
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawOval (10, 10, 200, 200);
}
}
public class DrawOval {
public static void main(String[] a) {
JFrame window = new JFrame();
window.setBounds(30, 30, 300, 300);
window.getContentPane().add(new MyCanvas());
window.setVisible(true);
}
}
paint
方法(包括paintComponent
),因为这是JVM应该做的事情李>
paint(Graphics g)
方法。此方法“绘制”不仅负责绘制零部件,还负责绘制零部件的边框及其子零部件,如果不小心执行,重写此方法通常会导致不必要的副作用paint(graphics g)
将导致图形抖动,因为默认情况下它不会进行双缓冲paintComponent(Graphics g)
方法,您可以解决这些问题paintComponent(g)
方法来删除任何不需要的先前绘制的图像更好的代码:
import java.awt.Dimension;
import java.awt.Graphics;
import javax.swing.JComponent;
import javax.swing.JFrame;
@SuppressWarnings("serial")
public class MyBetterCanvas extends JComponent {
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawOval(10, 10, 200, 200);
}
public static void main(String[] a) {
MyBetterCanvas canvas = new MyBetterCanvas();
canvas.setPreferredSize(new Dimension(300, 300));
JFrame window = new JFrame("My Better Canvas");
window.getContentPane().add(canvas);
window.setLocationByPlatform(true);
window.pack();
window.setVisible(true);
}
}
更好的是:
import java.awt.Color;
import java.awt.Dimension;
import java.awt.GradientPaint;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Paint;
import java.awt.RenderingHints;
import javax.swing.JComponent;
import javax.swing.JFrame;
@SuppressWarnings("serial")
public class MyBetterStillCanvas extends JComponent {
private static final int PREF_W = 500;
private static final int PREF_H = 500;
private static final int OVAL_X = 10;
private static final int OVAL_Y = OVAL_X;
private static final Paint BG_PAINT = new GradientPaint(0, 20,
Color.black, 20, 0, Color.darkGray, true);
private static final Paint FILL_PAINT = new GradientPaint(0, 0,
Color.blue, 20, 20, Color.red, true);
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2 = (Graphics2D) g;
// to smooth out graphics
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
// let's draw something funky
g2.setPaint(BG_PAINT);
g2.fillRect(0, 0, getWidth(), getHeight());
g2.setPaint(FILL_PAINT);
// avoid use of "magic" numbers
g.fillOval(OVAL_X, OVAL_Y, getWidth() - 2 * OVAL_X, getHeight() - 2
* OVAL_Y);
}
// a cleaner way to set the preferred size of a component
@Override
public Dimension getPreferredSize() {
return new Dimension(PREF_W, PREF_H);
}
public static void main(String[] a) {
JFrame window = new JFrame("My Better Canvas");
window.getContentPane().add(new MyBetterStillCanvas());
window.setLocationByPlatform(true);
window.pack();
window.setVisible(true);
}
}
显示为:
教程:
- 基本Swing图形教程:
- 更多高级图形文章:
null
?然后提供完整的代码,这样我们就可以锁定答案(并在键入时使用“@”通知他人-请参阅帮助
)。只需删除这一行:run.paint(null)代码>。如果需要,您应该使用repaint()
方法调用它:run.repaint()
。通常您不会调用AWT线程调用的paint()
。你想要实现什么?哇,非常感谢你,你的帮助,我想我将从0开始,这样我就真的不需要重新开始,我正在做什么,我将阅读所有java教程,我很年轻,所以我还有很长的未来,再次感谢你