大家帮我调试下,共10来行代码。找不出问题。闷。

孤尽JavaSea 2010-03-01 02:34:10
import java.awt.Color;
import java.awt.Graphics;

import javax.swing.JFrame;

public class TestLine extends JFrame{
TestLine(){
setBounds(100, 100, 500, 375);
setVisible(true);
Graphics xx = this.getGraphics();
xx.setColor(Color.RED);
xx.drawLine(100, 100, 200, 200);
}
public static void main(String[] args) {
new TestLine();
}
}


想画一条直线上去,怎么会这么难呢????
...全文
195 16 打赏 收藏 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
mycity21 2010-03-01
  • 打赏
  • 举报
回复
因为程序在运行期间,是会不断地刷新界面,也就是不断地调用程序的paint()方法,界面的显示是按paint()里面的代码绘制,你要画线,也要在paint()里面实现才行。
py330316117 2010-03-01
  • 打赏
  • 举报
回复
这个就是顺序的问题,上面说的很清楚了,专业术语就叫组件重绘
zliuzz 2010-03-01
  • 打赏
  • 举报
回复
对。。。木有graphics对象。。。你用啥子画么。。。graphics相当于一个画笔
netjourney 2010-03-01
  • 打赏
  • 举报
回复
That's funny!
netjourney 2010-03-01
  • 打赏
  • 举报
回复
来了个牛人。

9楼的说的很清楚了,如果了解事件和回调模式,理解起来应该没有问题。
xiesisi3 2010-03-01
  • 打赏
  • 举报
回复
(因为你在构造方法里做的this.getGraphics().drawLine(100,100,200,200)是不可能修改到paint方法的)

多了个没,去掉吧。。。汗…………CSDN不能自己编辑太悲剧了。
netjourney 2010-03-01
  • 打赏
  • 举报
回复
awt是事件编程模型,详细代码的顺序直接决定了事件响应的顺序,我想应该从这方面解释。
具体还是看书吧,因为我对awt不熟,只是当年看书的时候留下的一点记忆,呵呵
xiesisi3 2010-03-01
  • 打赏
  • 举报
回复
是这样的,你源代码的顺序是
setVisible(true);
Graphics xx = this.getGraphics();
xx.setColor(Color.RED);
xx.drawLine(100, 100, 200, 200);

也就是说,先setVisible(true);然后再drawLine(),就是说你先让它显示出来了再再它上面画,从现实中好象逻辑是这样的,但其实它已经输出到屏幕上, 就不能再变化,所以你再在上面画线也是没用的。

有的人会说了,那我把屏幕刷新(就是调用repaint方法)就可以了啊,但这样想大错特错。
repaint方法实际上最后是调用paint方法的,只要你没修改过paint方法(因为你在构造方法里做的this.getGraphics().drawLine(100,100,200,200)是不可能没修改到paint方法的),那么它就会按照原来的样子显示,原来当然就是一张白纸了,什么都没有。

又有的人说了,那么我先画线再显示怎么样啊。
请看下面:
首先getGraphics这个方法,你可以看API,是这样解释的:
public Graphics getGraphics()
Creates a graphics context for this component.This method will return null if this component is currently not displayable.
为组件创建一个图形上下文。如果组件当前是不可显示的,则此方法返回 null。
所以说你拿到的Graphics是一个null值,你是不可能用它来做什么事的。

那么难道就没有解决办法了吗?当然不是,既然我们都已经知道了它是根据paint方法来画的,那我们为什么不修改paint方法呢?

所以就有了2楼的答案。
还有。2楼的paint方法最好改成这样
Color c = g.getColor();
g.setColor(Color.RED);
g.drawLine(100, 100, 200, 200);
g.setColor(c);

维持现场也是比较重要的,切记。

netjourney 2010-03-01
  • 打赏
  • 举报
回复
去看书吧,awt没几页,你会很快发现答案的,不过答案可能也不能令你满意。
深山老叔 2010-03-01
  • 打赏
  • 举报
回复
引用 3 楼 java_gannbare 的回复:
楼上,恳请你解释一下,为什么这样??


应该是重写了paint方法
一头头 2010-03-01
  • 打赏
  • 举报
回复
引用 3 楼 java_gannbare 的回复:
楼上,恳请你解释一下,为什么这样??


我不瞒你说哇 我学艺不精的 我也是跟你差不多的时候开始学Java的
我就知道应该这样 至于为什么 我不是很清楚
深山老叔 2010-03-01
  • 打赏
  • 举报
回复
帮忙顶下。。。

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

public class TextPaneDraw extends JFrame{
private JTextPane textPane = new JTextPane(){
public void paintComponent(Graphics g){
super.paintComponent(g);
g.drawLine(20, 20, 80, 20);
}
};
public TextPaneDraw(){
Container c = getContentPane();
c.setLayout(new BorderLayout());
c.add(textPane, "Center");
}
public static void main(String[] args){
TextPaneDraw ppd = new TextPaneDraw();
ppd.setSize(400, 400);
ppd.setVisible(true);
}
}
xierangh 2010-03-01
  • 打赏
  • 举报
回复
TestLine(){
Graphics xx = this.getGraphics();
xx.setColor(Color.RED);
xx.drawLine(100, 100, 200, 200);
setBounds(100, 100, 500, 375);
setVisible(true);

}
这样也是可以的,2楼写的去看下paint 在哪里调用的就晓得 看看源代码
孤尽JavaSea 2010-03-01
  • 打赏
  • 举报
回复
楼上,恳请你解释一下,为什么这样??
一头头 2010-03-01
  • 打赏
  • 举报
回复
画画的东西要放到paint里面去 就好了

import java.awt.Color;
import java.awt.Graphics;

import javax.swing.JFrame;

public class TestLine extends JFrame {
TestLine() {
setBounds(100, 100, 500, 375);
setVisible(true);



}

public void paint(Graphics g) {
g.setColor(Color.RED);
g.drawLine(100, 100, 200, 200);
}

public static void main(String[] args) {
new TestLine();
}
}
w5325698 2010-03-01
  • 打赏
  • 举报
回复
调用有误,需要在面板上画,而且设置为可见也必须是在最后

62,620

社区成员

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

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