Java GUI编程题求解(还存在一点问题)

题目:编写程序,在用户单击鼠标的位置输出一个颜色、大小随机变化的圆。若用户单击多次,那么要输出多个圆。我的问题:以下是我自己完成好的了,只是绘图的背景居然总是透明的。请教... 题目:编写程序,在用户单击鼠标的位置输出一个颜色、大小随机变化的圆。若用户单击多次,那么要输出多个圆。
我的问题:以下是我自己完成好的了,只是绘图的背景居然总是透明的。请教高手怎么在JFrame框架中显示出来,那样绘图的背景就不是透明的:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class DrawCircle extends JFrame {
int xValue=100, yValue=75; // 保留鼠标位置( X,Y )

public DrawCircle() { // 构造函数
super("点击画圆"); // 调用JFrame类中的构造函数
setSize(400, 350);
setVisible(true);
addMouseListener(new MouseAdapter() {
public void mousePressed(MouseEvent e) {
xValue = e.getX();
yValue = e.getY();
repaint(); // 调用paint( )方法
}
});

addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
}

public void paint(Graphics g) {
int i = (int) (Math.random() * 256);
int j = (int) (Math.random() * 256);
int k = (int) (Math.random() * 256);
Color c = new Color(i, j, k);
g.setColor(c);
g.drawOval(xValue, yValue, 75, 75); // 画圆
}

public static void main(String args[]) {
DrawCircle obj = new DrawCircle();
// obj.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}
展开
 我来答
菜茑阿八
2009-05-12 · TA获得超过227个赞
知道小有建树答主
回答量:271
采纳率:0%
帮助的人:132万
展开全部
在public void paint(Graphics g)
下加上
{
super.paint(g);
.......
....
}
加上这句后才能调用父类,
1。 因为用的是swing里的JFrame(子类)。

2。 所以重绘时,只是重绘窗口边框和paint方法里的东西,窗口的背景并没有显示,所以看到窗口是所谓透明。(只是没绘制)

3。 repaint后上一帧图片不会自动清除,而是与下一帧重叠。

简单,往往才是精髓。给分吧!
372766897
2009-05-12 · 超过22用户采纳过TA的回答
知道答主
回答量:77
采纳率:0%
帮助的人:65.6万
展开全部
如果使用awt包里面的Frame类来构建窗口的话,上面的方法没有问题,但如果用他的子类swing里的JFrame的话,每次重绘,只是重绘窗口边框和paint方法里的东西,窗口的背景并没有被绘制出来,所以会看到窗口里显示的是下一层窗口里要显示的东西,是“透明”的。而且,如果你写的程序是动画效果时,repaint后上一帧的图像不会自动被清除,而是跟下一帧图像重叠。也就说明他的父类对象Frame可以完成工作(刷新屏幕)没有做。
所以,我们要先调用其父对象也就是java.awt.Frame的paint方法,
super.paint(Graphics g);
这样就OK了.
或者,我们也可以手工在paint里加上刷新屏幕的代码:
g.setColor(this.getBackground());
g.fillRect(0, 0, 窗口宽,窗口高);
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
daay1986
2009-05-12 · TA获得超过6018个赞
知道大有可为答主
回答量:2208
采纳率:0%
帮助的人:1469万
展开全部
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class DrawCircle extends JFrame {
int xValue=100, yValue=75; // 保留鼠标位置( X,Y )

public DrawCircle() { // 构造函数
super("点击画圆"); // 调用JFrame类中的构造函数
setSize(400, 350);
setVisible(true);
addMouseListener(new MouseAdapter() {
public void mousePressed(MouseEvent e) {
xValue = e.getX();
yValue = e.getY();
repaint(); // 调用paint( )方法
}
});

addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
}

public void paint(Graphics g) {
super.paint(g);
int i = (int) (Math.random() * 256);
int j = (int) (Math.random() * 256);
int k = (int) (Math.random() * 256);
Color c = new Color(i, j, k);
g.setColor(c);
g.drawOval(xValue, yValue, 75, 75); // 画圆
}

public static void main(String args[]) {
DrawCircle obj = new DrawCircle();
// obj.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}
调用父类的paint就好了。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
szmneo
2009-05-12 · TA获得超过157个赞
知道答主
回答量:111
采纳率:0%
帮助的人:93.2万
展开全部
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
/**
*
* @author szmneo
*/
public class DrawCircle0 {
static JFrame frame = new JFrame();
static DrawPanel p = new DrawPanel();
static JButton b = new JButton("清屏");
static JPanel p1 = new JPanel();
static int xValue,yValue;
public static void main(String[] args){
p1.add(b);
frame.setLayout(new BorderLayout());
frame.add(p,BorderLayout.CENTER);
frame.add(p1,BorderLayout.SOUTH);

frame.setTitle("Draw Circles");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(500,400);
frame.setVisible(true);

p.addMouseListener(new MouseAdapter() {
public void mousePressed(MouseEvent e) {
xValue = e.getX();
yValue = e.getY();
p.setX(xValue);
p.setY(yValue);
p.repaint();
frame.repaint();
frame.setVisible(true);
}
});
b.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
ClearAction();
}
});
}
static void ClearAction(){
p.Clear();
p.repaint();
frame.repaint();
frame.setVisible(true);
}
static class DrawPanel extends JPanel{
int x,y;
float r=40f;
ArrayList CircleData = new ArrayList();
void setX(int x){
this.x=x;
}
void setY(int y){
this.y=y;
Circle circle = new Circle();
circle.setR(r);
circle.setX(x);
circle.setY(y);
int ColorR = (int) (Math.random() * 256);
int ColorG = (int) (Math.random() * 256);
int ColorB = (int) (Math.random() * 256);
Color c = new Color(ColorR,ColorG, ColorB);
circle.setColor(c);
CircleData.add(circle);
}
void Clear(){
CircleData = new ArrayList();
repaint();
}
public void paintComponent(Graphics g){
super.paintComponent(g);
for(int i=0;i<CircleData.size();i++){
int a =((Circle)CircleData.get(i)).getX();
int b =((Circle)CircleData.get(i)).getY();
int d =(int)(2*((Circle)CircleData.get(i)).getR());
Color c = ((Circle)CircleData.get(i)).getColor();
g.setColor(c);
g.drawArc(a, b, d, d, 0, 360);
}
}
}
}
class Circle {
int x,y;
float r=0f;
Color c;
void setR(float r){
this.r=r;
}
void setX(int x){
this.x=x;
}
void setY(int y){
this.y=y;
}
void setColor(Color c){
this.c=c;
}
float getR(){
return r;
}
int getX(){
return x;
}
int getY(){
return y;
}
Color getColor(){
return c;
}

}

昨天写的个画圆的,改了下;
你的问题就如前面的人说的,paint出错了,并非是透明,你移动下就知道了,虽然调用父类可以画,但是你的程序没有你说的多次单击出现多个圈,呵呵
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式