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);
}
} 展开
我的问题:以下是我自己完成好的了,只是绘图的背景居然总是透明的。请教高手怎么在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);
}
} 展开
4个回答
展开全部
如果使用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, 窗口宽,窗口高);
所以,我们要先调用其父对象也就是java.awt.Frame的paint方法,
super.paint(Graphics g);
这样就OK了.
或者,我们也可以手工在paint里加上刷新屏幕的代码:
g.setColor(this.getBackground());
g.fillRect(0, 0, 窗口宽,窗口高);
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
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就好了。
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就好了。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
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出错了,并非是透明,你移动下就知道了,虽然调用父类可以画,但是你的程序没有你说的多次单击出现多个圈,呵呵
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出错了,并非是透明,你移动下就知道了,虽然调用父类可以画,但是你的程序没有你说的多次单击出现多个圈,呵呵
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询