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);
}
运行结果如下:
还不算太丑,哈哈,大家也试着做做吧。