关于Swing的绘图(新手问题,必给分!)

andrew80 2006-07-28 07:47:36
本人新手.
想请教如何用Swing绘图(如,直线,矩形等).
Swing的jpanel与Graphic对象是什么关系?
我想用Swing的双缓冲,绘制图形,不知道该怎么作?那位指点一下!
多谢了
...全文
562 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
andrew80 2006-08-02
  • 打赏
  • 举报
回复
第二个程序:不能擦除
package swing;

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

public class Applet1 extends Applet {
private boolean isStandalone = false;
ClassPanel mypanel = new ClassPanel();
//Get a parameter value
public String getParameter(String key, String def) {
return isStandalone ? System.getProperty(key, def) :
(getParameter(key) != null ? getParameter(key) : def);
}

//Construct the applet
public Applet1() {
}
//Initialize the applet
public void init() {
try {
jbInit();
}
catch(Exception e) {
e.printStackTrace();
}
}
//Component initialization
private void jbInit() throws Exception {
this.setLayout(null);
this.add(mypanel,null);
mypanel.setBounds(new Rectangle(0, 10, 450, 255 ));
}
//Get Applet information
public String getAppletInfo() {
return "Applet Information";
}
//Get parameter info
public String[][] getParameterInfo() {
return null;
}

void jButton1_mouseClicked(MouseEvent e) {
this.mypanel.start();
}


}

class ClassPanel extends JPanel implements Runnable
{
int i=0;
Thread panelthread=null;
public void start()
{
if (panelthread==null)
{
panelthread=new Thread (this);
panelthread.start();
}
}

public void stop()
{
panelthread.stop();
panelthread=null;
}

public void run()
{
while(true)
{
repaint();
try{Thread.sleep(100);}
catch(InterruptedException e){}
}
}

public void paint(Graphics g)
{

g.drawString(Integer.toString(i),30,240);
i++;

}
}
andrew80 2006-08-02
  • 打赏
  • 举报
回复
第一个程序:可以正常显示
package drawline;

import java.awt.*;
import java.applet.*;
import java.util.Date;
import javax.swing.*;
public class Applet1 extends Applet implements Runnable
{
private boolean isStandalone = false;
//Get a parameter value
public String getParameter(String key, String def) {
return isStandalone ? System.getProperty(key, def) :
(getParameter(key) != null ? getParameter(key) : def);
}

int i=0;
Thread clockthread=null;

public void start()
{
if (clockthread==null)
{
clockthread=new Thread (this);
clockthread.start();
}
}

public void stop()
{
clockthread.stop();
clockthread=null;
}

public void run()
{
while(true)
{
repaint();
try{Thread.sleep(100);}
catch(InterruptedException e){}
}
}

public void paint(Graphics g)
{
g.drawString(Integer.toString(i),30,240);//将它打印出来!
i++;
}

public Applet1() {
try {
jbInit();
}
catch(Exception e) {
e.printStackTrace();
}
}
private void jbInit() throws Exception {
}
}

andrew80 2006-08-02
  • 打赏
  • 举报
回复
多谢大家!问题解决了一定给分,不够再加,不好意思只能用分来谢了呵呵。

我首先在一个clock程序的基础上实现了我需要的画曲线的功能,因为要相应界面,所以我使用了多线程,当我用swing的jpanel时,发现不能实时擦除上一次迭代画的界面,为了清楚的说明问题,我把程序简化为用graphics显示一个累加的变量。第一个程序可以正常的显示,擦除,再显示;而第二个使用swing的程序则累加显示,不只那位大哥可以指点一下。

to UnAgain():我就是看了你(翻译?)的文章才知道Swing支持双缓冲,可以由于新手基础太差,看不太懂,所以还请多指教。
cuij7718 2006-08-01
  • 打赏
  • 举报
回复
可以看看
http://www.blogjava.net/sunfruit/archive/2006/02/19/31501.html

先执行'演示',在线看看效果,会弹出一个证书认证点击'Y'就行了,不会有问题的
andrew80 2006-07-31
  • 打赏
  • 举报
回复
我消化一下,等我搞定了就结贴,谢谢大家
  • 打赏
  • 举报
回复
C:\Program Files\Java\jdk1.5.0_04\demo\applets\GraphicsTest


看了没有,调试了没与?
  • 打赏
  • 举报
回复
C:\Program Files\Java\jdk1.5.0_04\demo\applets\GraphicsTest

一大堆,不知道你看到了没有?调试过了没有?
sunqihui24 2006-07-31
  • 打赏
  • 举报
回复
正在做swing的程序,andrew80 (竹林) ,趁你的东风,也问个问题:
即 可不可以用graphics 在jpanel上以一定的角度也来写一行数据,而不是水平的写?
UnAgain 2006-07-31
  • 打赏
  • 举报
回复
哦,原来是你啊,呵呵

你出了100分,我只回答了两句话,值多少分啊?

^_^
Moon 2006-07-30
  • 打赏
  • 举报
回复
关注
我也在做图形学的作业……
Pigwen 2006-07-29
  • 打赏
  • 举报
回复
Graphics相当于笔,JPanel相当于纸,用笔(Graphics)在纸(JPanel)上画你想要的东西
diggywang 2006-07-29
  • 打赏
  • 举报
回复
要说起来就多得去了,还是建议楼主好好看看java2d,说的很详细的
UnAgain 2006-07-29
  • 打赏
  • 举报
回复
关于双缓冲,你可以参考一下这篇文章--“AWT和Swing中的绘画”(http://blog.csdn.net/UnAgain/archive/2006/05/13/727474.aspx)
JaboR 2006-07-29
  • 打赏
  • 举报
回复
Swing的JComponent都是已经实现好了双缓冲,不用像在awt中得自己去实现,你只要在画图的时候,调用一下父类的同一个方法就行了.如在JPanel中画图,用方法
protected void paintComponent(Graphics g) {
super.paintComponent(g);  // 调用父类的方法,这个方法已经实现了双缓冲,如果你     不调用,那么你的程序就没有双缓冲.一般情况下看不出来,但是在有动画的情况下,如果不调用这个方法,你画出来的东西很多地方就会是一片黑,乱七八糟的.
g.drawOval(0, 0, 100, 100); // 画一个圆
}

62,629

社区成员

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

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