import java.awt.Canvas;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ComponentEvent;
import java.awt.event.ComponentListener;
import javax.swing.JButton;
import javax.swing.JColorChooser;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.plaf.SliderUI;
public class RoseJFrame extends JFrame implements ActionListener {
private RoseCanvas rose;
private JButton button_color;
public RoseJFrame()
{
super("四叶玫瑰线"); //设置框架标题
Dimension dim=getToolkit().getScreenSize(); //获取屏幕分辨率
this.setBounds(dim.width/4, dim.height/4, dim.width/2, dim.height/2); //设置框架显示位置
this.setDefaultCloseOperation(3); //设置关闭按钮功能为关闭
JPanel jpanel=new JPanel(); //定义一个面板对象
this.getContentPane().add(jpanel, "North"); //将面板对象加入到当前窗口的北方,默认布局管理器为BorderLayout
button_color=new JButton("选择颜色"); //实例化按钮对象,并设置按钮标签文字
jpanel.add(button_color); //向面板容器中添加按钮 面板默认布局管理器为FlowLayout
button_color.addActionListener(this); //对按钮设置事件监听器响应单机事件
rose=new RoseCanvas(Color.red);
this.getContentPane().add(rose, "Center"); //将画布加入到框架的中间位置
this.setVisible(true); //设置框架容器的可见性,true为可见 注意:此行命令应写在框架构造函数的最后,这样才能保证容器中的所有组件可见
}
public void actionPerformed(ActionEvent e) {
Color c=JColorChooser.showDialog(this, "选择颜色", Color.blue); //单击按钮触发的事件,显示颜色对话框,可以具体指定颜色
rose.setColor(c); //调用构造法方法设置颜色
rose.repaint(); //每选择新的颜色,重画一次
}
public static void main(String[] args) {
new RoseJFrame();
}
}
class RoseCanvas extends Canvas implements ComponentListener,Runnable
{
private Color color;
public RoseCanvas(Color color) //带参数的构造方法,构造方法必须和类名称一致
{
this.setColor(color); //设置框架的颜色
this.addComponentListener(this); //添加组件事件监听器
}
public void setColor(Color color)
{
this.color=color;
}
public void paint(Graphics g)
{
int x0=this.getWidth()/2; //设置初始值
int y0=this.getHeight()/2;
g.setColor(color);
g.drawLine(x0,0,x0,y0*2); //画水平直线
g.drawLine(0, y0, x0*2, y0); //画垂直直线
int j=40;
while(j<200)
{
for(int i=0;i<=1023;i++)
{
double angle=i*Math.PI/512; //角度值
double radius=j*Math.sin(2*angle); //设置半径的值 根据公式 r=a*sinb
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, 1, 1); //画椭圆
}
j+=20; //j的值每循环递增20,画一次四叶玫瑰线
}
}
public void componentResized(ComponentEvent e) {
this.repaint(); //重画
}
public void componentMoved(ComponentEvent e) {}
public void componentShown(ComponentEvent e) {}
public void componentHidden(ComponentEvent e) {}
public void run() {
}
}