一个关于getGraphics()的问题 急!

freebirdlib 2004-07-25 08:19:49
为什么下面这段代码用getGraphics()得到的Graphics2D的对象为null?
应该怎样做才能通过调用JPanel的getGraphics()方法得到一个Graphics2D
的对象g,使得g.drawLine(...)能把一条直线画到面板上?最好能有代码。
非常感谢!
(请不要回“up”或是“强烈关注”这样的话,谢谢!)


import javax.swing.*;
import java.awt.*;
public class Edge extends JFrame{
public Edge(){

super("Drawing");
setSize(1000,1000);
JPanel pane=new JPanel(){
public void paint(Graphics g){
//添加绘图代码;
}
Graphics2D g=(Graphics2D)pane.getGraphics();
if(g==null){
System.out.println("null");
}
else g.drawRect(100,100,300,300);
setContentPane(pane);
}
public static void main(String[] args) {
Edge frame=new Edge();
frame.show();
}
}
...全文
924 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
freebirdlib 2004-07-26
  • 打赏
  • 举报
回复
to jackkui(阿黄)
你贴出的这段代码让我深受启发,也解决了我想要解决的问题,getGraphics()一般要
写在一些响应事件函数中比如鼠标事件中才有效。受你启发也帮我解决了另外一个困惑我
很久的问题,再次表示感谢!

to registered(已注册)
这段代码是从我的测试程序里截出来的,当然不能保证其完成正确(但是测试程序是运行正确的),一些很明显的错误就不用管了吧,我相信问题问的很清楚啊
xjffj 2004-07-25
  • 打赏
  • 举报
回复
其实最主要的原因是在JFrame没有show之前,所有JFrame上的组件都无法得到Graphics,因为这时Graphics还不存在呢,当然是null了。
registered 2004-07-25
  • 打赏
  • 举报
回复
在 getGraphics() 得到的 Graphics 上面 draw 出来的东西都是临时的
只要 repaint() 一被调用你上面画的东西就没了
所以要想画最好的办法就是 override paint 系列函数
如果不相信可以到 sun 的技术论坛问一下
还有测试也没有你这样测试的,给的代码自己都没有运行过,全是错误

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

public class Edge extends JFrame {
public Edge() {
super("Drawing");

JPanel pane = new JPanel() {
public void paint(Graphics g) {
//添加绘图代码;
}
};
pane.setPreferredSize(new Dimension(600, 600));
setContentPane(pane);

//**********************
pack();
//**********************

Graphics g = this.getGraphics();
if (g == null) {
System.out.println("null");
} else {
g.drawRect(100, 100, 300, 300);
}
}

public static void main(String[] args) {
Edge frame = new Edge();
frame.setDefaultCloseOperation(EXIT_ON_CLOSE);
frame.show();
}
}

这是你想要的结果吗?
freebirdlib 2004-07-25
  • 打赏
  • 举报
回复
申明一下,这段代码只是测试getGraphics()用的,我的目的并不是要在JPanel上绘图,在paint()或paintComponent()方法中画图这我肯定知道,要不然也不会散分100,
请各位看清楚题目,请继续回答,谢谢!!!
jackkui 2004-07-25
  • 打赏
  • 举报
回复
这段代码供你参考。

import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.Graphics2D;
public class TestPanel extends JFrame {
JPanel panel = new JPanel();
JPanel pnlCtl = new JPanel();
JButton button = new JButton("Draw line");
JButton button2 = new JButton("Clear all");
public TestPanel() {
Container cp = this.getContentPane();
cp.add(panel,BorderLayout.CENTER);
button.addMouseListener(new MouseAdapter(){
public void mouseClicked(MouseEvent me)
{
Graphics2D g2 = (Graphics2D) panel.getGraphics();
g2.drawRect(20,20,100,300);
}
});
button2.addMouseListener(new MouseAdapter(){
public void mouseClicked(MouseEvent me)
{
panel.getGraphics().clearRect(0,0,700,400);
}
});
pnlCtl.add(button);
pnlCtl.add(button2);
cp.add(pnlCtl,BorderLayout.NORTH);
setSize(800,600);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.show();
}
public static void main(String[] args) {
TestPanel testPanel = new TestPanel();
}
}
registered 2004-07-25
  • 打赏
  • 举报
回复
public void paintComponent(Graphics g) {
g.drawRect(100, 100, 300, 300);
}
用传进来的这个 g draw
registered 2004-07-25
  • 打赏
  • 举报
回复
import javax.swing.*;
import java.awt.*;

public class Edge extends JFrame {
public Edge() {

super("Drawing");
setSize(600, 600);

JPanel pane = new JPanel() {
public void paintComponent(Graphics g) {
g.drawRect(100, 100, 300, 300);
}
};

getContentPane().add(pane);
}

public static void main(String[] args) {
Edge frame = new Edge();
frame.show();
}
}

62,616

社区成员

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

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