RoseCanvas类
package yan03;
import java.awt.Canvas;
import java.awt.Color;
import java.awt.Graphics;
public class RoseCanvas extends Canvas //四叶玫瑰线画布组件
{
private Color color; //颜色
public RoseCanvas(Color color)
{
this.setColor(color);
}
public void setColor(Color color)
{
this.color = color;
}
public void paint(Graphics g) //在Canvas上作图
{
int x0 = this.getWidth()/2; //(x0,y0)是组件正中点坐标
int y0 = this.getHeight()/2;
g.setColor(this.color); //设置画线颜色
g.drawLine(x0,0,x0,y0*2); //画X轴
g.drawLine(0,y0,x0*2,y0); //画Y轴
for (int j=40; j<200; j+=20) //画若干圈四叶玫瑰线
for (int i=0; i<1023; i++) //画一圈四叶玫瑰线的若干点
{
double angle = i*Math.PI/512;
double radius = j*Math.sin(2*angle); //四叶玫瑰线
int x =(int)Math.round(radius * Math.cos(angle)*2);
int y =(int)Math.round(radius * Math.sin(angle));
g.fillOval(x0+x,y0+y,2,2); //画直径为1的圆就是一个点
}
}
}
RoseJFrame类
package yan03;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class RoseJFrame extends JFrame implements ActionListener
{
private RoseCanvas canvas; //自定义画布组件
public RoseJFrame()
{
super("四叶玫瑰线"); //框架边布局
Dimension dim=this.getToolkit().getScreenSize(); //获得屏幕分辨率
this.setBounds(dim.width/4,dim.height/4,dim.width/2,dim.height/2); //窗口居中
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
JPanel jpanel = new JPanel(); //面板流布局,居中
this.getContentPane().add(jpanel,"North");
JButton button_color = new JButton("选择颜色");
jpanel.add(button_color);
button_color.addActionListener(this);
this.canvas = new RoseCanvas(Color.red); //创建自定义画布组件
this.getContentPane().add(this.canvas,"Center");
this.setVisible(true);
}
public void actionPerformed(ActionEvent ev) //按钮动作事件处理方法
{
Color c=JColorChooser.showDialog(this,"选择颜色",Color.blue); //弹出JColorChooser颜色选择对话框,返回选中颜色
this.canvas.setColor(c);
this.canvas.repaint(); //调用canvas的paint(Graphics)方法,重画
}
public static void main(String arg[])
{
new RoseJFrame();
}
}
RoseNJFrame类
package yan03;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class RoseNJFrame extends JFrame implements ActionListener,ComponentListener
{
private JRadioButton radiobutton[]; //单选按钮
private JCheckBox checkbox; //复选框
private RoseNCanvas canvas; //自定义画布组件
public RoseNJFrame()
{
super("多叶玫瑰线"); //框架边布局
Dimension dim=getToolkit().getScreenSize(); //获得屏幕分辨率
this.setBounds(dim.width/4,dim.height/4,dim.width/2,dim.height/2); //窗口居中
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
this.addComponentListener(this); //注册组件事件监听器
JToolBar toolbar=new JToolBar(); //创建工具栏,默认水平方向
this.getContentPane().add(toolbar,"North"); //工具栏添加到框架内容窗格北部
String rosestr[]={"一叶","四叶","三叶","八叶","五叶","十二叶","七叶","十六叶","九叶"};
ButtonGroup bgroup = new ButtonGroup(); //按钮组
radiobutton = new JRadioButton[rosestr.length]; //单选按钮数组
for (int i=0; i<radiobutton.length; i++)
{
radiobutton[i]=new JRadioButton(rosestr[i]); //单选按钮
radiobutton[i].addActionListener(this);
bgroup.add(radiobutton[i]); //单选按钮添加到按钮组
toolbar.add(radiobutton[i]); //单选按钮添加到工具栏
}
radiobutton[0].setSelected(true); //设置单选按钮的选中状态
checkbox = new JCheckBox("Y轴",false); //复选框
toolbar.add(checkbox);
checkbox.addActionListener(this); //复选框注册动作事件监听器
JButton button_color = new JButton("选择颜色");
toolbar.add(button_color);
button_color.addActionListener(this);
canvas = new RoseNCanvas(1,Color.red); //创建自定义画布组件
this.getContentPane().add(canvas,"Center");
this.setVisible(true);
}
public void actionPerformed(ActionEvent e) //按钮动作事件处理方法
{
if (e.getSource() instanceof JRadioButton) //选择一个颜色复选框
for (int i=0; i<radiobutton.length; i++)
if (e.getSource()==radiobutton[i])
{
canvas.setLeaf(i+1);
break;
}
if (e.getSource()==checkbox)
{
canvas.setAxis(checkbox.isSelected());
if (e.getActionCommand().equals("Y轴"))
checkbox.setText("X轴");
else
checkbox.setText("Y轴");
}
if (e.getActionCommand().equals("选择颜色"))
{
Color c=JColorChooser.showDialog(this,"选择颜色",Color.blue); //弹出JColorChooser颜色选择对话框,返回选中颜色
canvas.setColor(c);
}
canvas.repaint(); //重画
}
public void componentResized(ComponentEvent e) //改变组件大小时
{
canvas.repaint(); //重画
}
public void componentMoved(ComponentEvent e) {}
public void componentHidden(ComponentEvent e) {}
public void componentShown(ComponentEvent e) {}
public static void main(String arg[])
{
new RoseNJFrame();
}
}
class RoseNCanvas extends Canvas //画布组件
{
private int leaf; //多叶玫瑰线的叶数
private boolean axis; //轴,默认Y轴
private Color color; //颜色
public RoseNCanvas(int leaf, Color color)
{
this.axis = false;
this.setLeaf(leaf);
this.setColor(color);
}
void setLeaf(int leaf)
{
this.leaf = leaf;
}
void setAxis(boolean axis)
{
this.axis = axis;
}
void setColor(Color color)
{
this.color = color;
}
public void paint(Graphics g) //在Canvas上作图
{
int x0 = this.getWidth()/2; //(x0,y0)是组件正中点坐标
int y0 = this.getHeight()/2;
g.setColor(this.color); //设置画线颜色
g.drawLine(x0,0,x0,y0*2); //画X轴
g.drawLine(0,y0,x0*2,y0); //画Y轴
for (int j=40; j<200; j+=20) //画若干圈多叶玫瑰线
for (int i=0; i<1023; i++) //画一圈多叶玫瑰线的若干点
{
double angle = i*Math.PI/512, radius;
if (!axis)
radius = j*Math.sin(this.leaf*angle); //多叶玫瑰线沿X轴
else
radius = j*Math.cos(this.leaf*angle); //多叶玫瑰线沿Y轴
int x =(int)Math.round(radius * Math.cos(angle));
int y =(int)Math.round(radius * Math.sin(angle));
g.fillOval(x0+x,y0+y,2,2); //画直径为1的圆就是一个点
}
}
}
天晴了,起飞吧