用java画布画玫瑰花

 

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的圆就是一个点
            }
    }
}
posted @ 2019-05-03 12:59  yyer  阅读(5592)  评论(0编辑  收藏  举报