Swing界面实现心形

Swing界面实现心形

       一直想用Java中的swing组件通过Graphics实现在界面上画一个心形,请教了一位学姐,终于成功了。现在做个总结。

       主要是算法设计,其实也称不上算法,因为我在实现的时候是通过界面运行结果来调整坐标,根本没有什么可移植性,不过应该可以通过简单的平面几何设计算法。今天就先看看这个半产品吧。

这个大致思路是在界面上先用Graphics画出两个相交的圆(相交程度根据运行结果调整尴尬),在两交点连线延长线上截取适当距离选点,通过这点分别画出两圆的切线。然后把两圆与两线围起的图形填充。OK,心形”完美“呈现。由于计算值与像素点整数值总是有相当大的差别。因此我建议调整很重要,尽管很麻烦。具体代码如下:

package 界面心形;

import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.Graphics;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;

public class Heart extends JFrame {
	  Graphics  g ;
      public void Init(){
    	  //创建界面
    	  this.setTitle("love");
    	  this.setSize(500, 500);
    	  this.setLocationRelativeTo(null);
    	  FlowLayout flow = new FlowLayout();
    	  this.setLayout(flow);
    	  JButton jbu = new JButton("按我");
    	  this.setDefaultCloseOperation(3);
    	  this.add(jbu);
    	  this.getContentPane().setBackground(Color.black);
    	  this.setVisible(true);
    	  
    	  try {
			Thread.sleep(100);
		} catch (InterruptedException e1) {
			e1.printStackTrace();
		}
    	  
         g = this.getGraphics();
         ActionListener l = new MyListener(g) ;
         jbu.addActionListener(l);
         

      }
      
      public static void main(String[] args) {
		Heart heart = new Heart();
		heart.Init();
	}
}

 

package 界面心形;

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class MyListener implements ActionListener {
	Graphics g;
     public MyListener(Graphics g) {
		
    	 this.g = g;
	}
	
	public void actionPerformed(ActionEvent e) {
		
		if("按我".equals(e.getActionCommand())){
			
		g.setColor(Color.red);
		 
		//去掉锯齿状,后来发现不去更好一些,使偏差不明显
    //((Graphics2D) g).setRenderingHint(RenderingHints.KEY_ANTIALIASING , RenderingHints.VALUE_ANTIALIAS_ON);
       
		//画两圆
		int x1=100, y1=100, r=30;
        g.fillOval(x1-r, y1-r, 2*r, 2*r);
        g.fillOval((int)x1+r-10, y1-r, 2*r, 2*r);
        //画切线
        g.drawLine(125, y1+5/2*r, (int)(126-30*Math.sqrt(3)), 115);
        //循环填充
        for(int i=125;i<=228;i++){
        	g.drawLine(125, y1+5/2*r, (int)(i-30*Math.sqrt(3)), 115);
        }
        //浪一下,设置“love”字体,因为有的地方画两遍,用字体挡住颜色不均匀的地方
        g.setColor(Color.blue);
        Font font = new Font("love", Font.BOLD,32); 
        g.setFont(font);
        g.drawString("love", x1-6, y1+22);
	}

 运行结果如下:

 还不算太丑,哈哈,大家也试着做做吧。

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值