关于画直线的问题(进来看下,没你想的那么####)

wuyan19831013 2006-08-15 10:49:55
import javax.swing.*;
import java.awt.*;

public class drawonpanel {
Graphics2D g2d;
public drawonpanel(JPanel p) {
g2d =(Graphics2D) p.getGraphics();
System.out.println("inside of drawonpanel");
g2d.drawString("i am a boy!",50,50);
}
}

import javax.swing.*;
public class Main {
JPanel p;
JFrame f;
drawonpanel pp;
public Main() {
p = new JPanel();
f = new JFrame();
pp = new drawonpanel(p);
f.getContentPane().add(p);
f.pack();
f.show();
}

public static void main(String args[]){
new Main();
}
}


两个类,drawonpanle负责画图,Main负责显示,我把一个JPanle传到drawonpanle里了,但是程序执行到:

g2d.drawString("i am a boy!",50,50);
会有异常显示:
java.lang.NullPointerException

这个问题如何处理?
...全文
188 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
sxnucseven 2006-08-15
  • 打赏
  • 举报
回复
f.getContentPane().add(p);之前加上
f.setSize(300,300);
f.setLayout(new BorderLayout());
应该就行了
千里冰封820 2006-08-15
  • 打赏
  • 举报
回复
/*
* Tests.java
*
* Created on 2006年8月15日, 上午11:09
*
* To change this template, choose Tools | Template Manager
* and open the template in the editor.
*/

package ss;

/**
*
* @author lbf
*/
import java.awt.*;
import javax.swing.*;
public class Tests extends JFrame implements Runnable{
private JPanel jp;
private int arc;
private Color c;
/** Creates a new instance of Tests */
public Tests(){
super("test");
jp=new JPanel();
this.getContentPane().add(jp,BorderLayout.CENTER);
this.setBounds(300,300,400,400);
this.setVisible(true);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
new Thread(this).start();
}
public void run(){
while(true){
try{
arc++;
Thread.sleep(10);
draw(jp);
if(arc==360){
arc=0;
c=new Color((int)(Math.random()*0xffffff));
}

}
catch(Exception exe){
exe.printStackTrace();
}
}
}
private void draw(JPanel p){
Graphics g=p.getGraphics();
g.setColor(c);
g.fillArc(50,50,100,100,0,arc);
}
public static void main(String args[]){
new Tests();
}
}
你试试这个,和你实现是一样的,我这里用了一个线程 一直在画,这样可以看得更清楚些
wuyan19831013 2006-08-15
  • 打赏
  • 举报
回复
多谢楼上的2个兄弟

我改了下,没有异常了,但是还是画不出图形

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

public class drawonpanel {
Graphics2D g2d;
public drawonpanel(JPanel p) {
g2d =(Graphics2D) p.getGraphics();
g2d.setBackground(Color.BLUE);
g2d.drawString("i am a boy!",50,50);
g2d.drawLine(20,30,100,20);
}
}

import javax.swing.*;
public class Main {
JPanel p;
JFrame f;
drawonpanel pp;
public Main() {
p = new JPanel();
f = new JFrame();
f.getContentPane().add(p);
f.pack();
f.show();
pp = new drawonpanel(p);
}

public static void main(String args[]){
new Main();
}
}

Areslp 2006-08-15
  • 打赏
  • 举报
回复
g2d =(Graphics2D) p.getGraphics();
System.out.println("inside of drawonpanel");
这里g2d是null
UnAgain 2006-08-15
  • 打赏
  • 举报
回复
import javax.swing.*;
import java.awt.*;

class drawonpanel extends JPanel{
Graphics2D g2d;
public drawonpanel() {
}
public void paint(Graphics g){
g2d =(Graphics2D) g;
System.out.println("inside of drawonpanel");
g2d.drawString("i am a boy!",50,50);
}
}

public class Main {
JPanel p;
JFrame f;
drawonpanel pp;
public Main() {
//p = new JPanel();
f = new JFrame();
pp = new drawonpanel();
f.getContentPane().add(pp);
f.pack();
f.show();
}

public static void main(String args[]){
new Main();
}
}
千里冰封820 2006-08-15
  • 打赏
  • 举报
回复
i当然会有异常,虽然这个时候你的JPanel已经被构造出来,但是它还是没有图形上下文,
所以你得到的空指针异常应该是Graphics的对象的空指针
你可以先让整个窗口显示出来,然后再调用,这样的话就不会出空指针了
UnAgain 2006-08-15
  • 打赏
  • 举报
回复

错了。

当时的JPanel应该还没有与Graphics相关联,所以g2d为null
UnAgain 2006-08-15
  • 打赏
  • 举报
回复
要有frame,比如把JPanel加到JFrame上
wuyan19831013 2006-08-15
  • 打赏
  • 举报
回复
呵呵呵,回楼上的

保存信息并重绘这个如何实现呢?
d992901 2006-08-15
  • 打赏
  • 举报
回复
不好意思,已画过的线的信息保存这件事是在第一次画这个线的时候做的,重绘的时候,只是取得信息并重绘。。
让我想起刚毕业作画图板的培训了,呵呵。。。
d992901 2006-08-15
  • 打赏
  • 举报
回复
就是将已画过的线的信息保存起来,然后根据保存的信息重新画出来。
比如一条最简单的线可以用4个坐标纪录,当然如果有粗细颜色等,还需要别的属性了。。
wuyan19831013 2006-08-15
  • 打赏
  • 举报
回复
重写paintComponent方法,呵呵,如果是我的代码,那么在重写paintComponent方法里面该如何写呢?

waiting20052005 2006-08-15
  • 打赏
  • 举报
回复
重绘
千里冰封820 2006-08-15
  • 打赏
  • 举报
回复
这个是没有办法的事情,因为你的图形窗口大小一变,系统就会自动调用repaint()方法
这个时候,你的绘制图形不是在paint方法里定义的,所以会消失掉
最好的办法就是重写paint方法,如果是swing下面的组件,那就重写paintComponent方法
这样的话,就不会消失了
wuyan19831013 2006-08-15
  • 打赏
  • 举报
回复
to:Top
lbfhappy(千里冰封)

非常感性你的帮助,现在我可以绘图了,但是当绘制图形的窗口大小改变后,图形就不见了,这个如何解决呢?

谢谢

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧