热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

用java画布画玫瑰花

RoseCanvas类packageyan03;importjava.awt.Canvas;importjava.awt.Color;importjava.awt.Grap

 

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[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)
                  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的圆就是一个点
            }
    }
}

推荐阅读
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • 前景:当UI一个查询条件为多项选择,或录入多个条件的时候,比如查询所有名称里面包含以下动态条件,需要模糊查询里面每一项时比如是这样一个数组条件:newstring[]{兴业银行, ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • Spring源码解密之默认标签的解析方式分析
    本文分析了Spring源码解密中默认标签的解析方式。通过对命名空间的判断,区分默认命名空间和自定义命名空间,并采用不同的解析方式。其中,bean标签的解析最为复杂和重要。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • 在重复造轮子的情况下用ProxyServlet反向代理来减少工作量
    像不少公司内部不同团队都会自己研发自己工具产品,当各个产品逐渐成熟,到达了一定的发展瓶颈,同时每个产品都有着自己的入口,用户 ... [详细]
  • 本文介绍了一个在线急等问题解决方法,即如何统计数据库中某个字段下的所有数据,并将结果显示在文本框里。作者提到了自己是一个菜鸟,希望能够得到帮助。作者使用的是ACCESS数据库,并且给出了一个例子,希望得到的结果是560。作者还提到自己已经尝试了使用"select sum(字段2) from 表名"的语句,得到的结果是650,但不知道如何得到560。希望能够得到解决方案。 ... [详细]
  • 个人学习使用:谨慎参考1Client类importcom.thoughtworks.gauge.Step;importcom.thoughtworks.gauge.T ... [详细]
  • 带添加按钮的GridView,item的删除事件
    先上图片效果;gridView无数据时显示添加按钮,有数据时,第一格显示添加按钮,后面显示数据:布局文件:addr_manage.xml<?xmlve ... [详细]
  • 抽空写了一个ICON图标的转换程序
    抽空写了一个ICON图标的转换程序,支持png\jpe\bmp格式到ico的转换。具体的程序就在下面,如果看的人多,过两天再把思路写一下。 ... [详细]
  • 第一步:PyQt4Designer设计程序界面该部分设计类同VisvalStudio内的设计,改下各部件的objectName!设计 ... [详细]
  • 本文介绍了一个Java猜拳小游戏的代码,通过使用Scanner类获取用户输入的拳的数字,并随机生成计算机的拳,然后判断胜负。该游戏可以选择剪刀、石头、布三种拳,通过比较两者的拳来决定胜负。 ... [详细]
  • 本文讨论了如何使用IF函数从基于有限输入列表的有限输出列表中获取输出,并提出了是否有更快/更有效的执行代码的方法。作者希望了解是否有办法缩短代码,并从自我开发的角度来看是否有更好的方法。提供的代码可以按原样工作,但作者想知道是否有更好的方法来执行这样的任务。 ... [详细]
author-avatar
任乔彦
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有