62,623
社区成员
发帖
与我相关
我的任务
分享
//文件: NormalPolygon.java
//一个画正N边形的程序
//练习使用如下技术
//1.PaintListener 自定义的画板类及监听器
//2.ComponentListener 组件监听器监听组件改变大小,隐藏,更改位置
//3.Polygon 类, 多边形类的用法
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class NormalPolygon extends JFrame implements ActionListener,PaintListener{
int number = 5;
JButton confirmButton = new JButton("绘制");
DrawPanel drawPanel = new DrawPanel();
JTextField polyNumField = new JTextField(10);
Dimension dimen = null;
int radius = 100;
public NormalPolygon(){
//建立北边的Box类
Box northBox = Box.createHorizontalBox();
//添加提示标签
northBox.add(new JLabel("多边形边数:"));
northBox.add(Box.createHorizontalStrut(10));
//添加边数输入框
northBox.add(polyNumField);
polyNumField.addActionListener(this);
northBox.add(Box.createHorizontalStrut(30));
//添加绘制按钮
northBox.add(confirmButton);
confirmButton.addActionListener(this);
northBox.add(Box.createHorizontalStrut(10));
//将Box添加至主界面
Container contentPane = getContentPane();
contentPane.add(northBox, BorderLayout.NORTH);
//添加自定义的画板类
drawPanel.setBackground(Color.black);
drawPanel.addPaintListener(this);
contentPane.add(drawPanel);
//添加组件监听器
this.addComponentListener(
new ComponentAdapter(){
public void componentResized(ComponentEvent e){
updateSize();
}
}
);
//设置主界面属性
setSize(300,300);
setVisible(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//更新多边形的尺寸
updateSize();
}
//绘制的响应事件
public void actionPerformed(ActionEvent event){
try{
int tmp = Integer.parseInt(polyNumField.getText());
if(tmp <= 2) throw new Exception();
number = tmp;
drawPanel.repaint();
}
catch(NumberFormatException e){
JOptionPane.showMessageDialog(this ,"数字格式错误!");
}
catch(Exception e){
JOptionPane.showMessageDialog(this,"多边形边数应该 大于2");
}
finally{
polyNumField.setText(String.valueOf(number));
}
}
//当主窗口大小改变时,更新多边形的尺寸
private void updateSize(){
dimen = drawPanel.getSize(null);
radius = Math.min(dimen.width , dimen.height) * 2/5;
drawPanel.repaint();
}
//绘制多边形
public void paintPerformed(Graphics g){
//设置绘图色
g.setColor(Color.red);
//赋初始角度,保证是一个正立的多边形
double pieceAngel = Math.PI * 2 /number;
double startAngel = -Math.PI / 2;
if(number % 2 == 0) startAngel += pieceAngel / 2 ;
//添加多边形的各顶点坐标
Polygon poly = new Polygon();
for(int i = 0 ; i < number;i++){
startAngel += pieceAngel;
int x = (int) (radius * Math.cos(startAngel) + dimen.width /2);
int y = (int) (radius * Math.sin(startAngel) + dimen.height /2);
poly.addPoint(x,y);
}
//绘制多边形
g.fillPolygon(poly);
}
public static void main(String args[]){
new NormalPolygon();
}
}
/*****************************
*File name : PaintListener.java
*author : ***
*Date: 2007-11-3 20:08
********************************/
import java.awt.*;
public interface PaintListener{
public void paintPerformed(Graphics g);
}
/*****************************
*File name : DrawPanel.java
*author : ***
*Date: 2007-11-3 20:08
********************************/
import java.awt.*;
import javax.swing.*;
import javax.swing.border.*;
import javax.swing.text.*;
//定义一个画板类,专门用来做图
public class DrawPanel extends JPanel{
PaintListener paintListener; //画图监听器
//构造函数
public DrawPanel(){
//设置边框
BevelBorder bb = new BevelBorder(BevelBorder.LOWERED);
TitledBorder tb = new TitledBorder(bb,"画布");
this.setBorder(tb);
}
//添加画图监听器
public void addPaintListener(PaintListener pl){
paintListener = pl;
}
//绘图函数
public void paintComponent(Graphics g){
super.paintComponent(g);
if(paintListener != null) paintListener.paintPerformed(g);
}
//测试函数
public static void main(String args[]){
JFrame jf = new JFrame();
Container contentPane = jf.getContentPane();
DrawPanel testPanel = new DrawPanel();
testPanel.addPaintListener( //此处添加一个绘图监听器,显示了此类的用法
new PaintListener(){
public void paintPerformed(Graphics g){
g.drawLine(20,20,300,300);
}
}
);
contentPane.add(testPanel);
jf.setSize(500,500);
jf.setVisible(true);
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}