创意画板——(java)小游戏(3)
我们继续来完善我们的画板,这次我们来看看橡皮擦和三角形,3D图形和菜单等代码。接着上一篇文章来说
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Graphics;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
public class DrawUI {
//定义按钮和颜色的字符串
String[] btnstrs = {"直线","矩形","圆","曲线","三角形","递归图形","迭代分形","撤回","清空","橡皮擦","3D图形","谢尔宾斯基三角形"};
Color[] colors ={
Color.WHITE,Color.YELLOW,Color.BLACK,Color.BLUE,Color.RED,Color.MAGENTA,
Color.GRAY,Color.LIGHT_GRAY,Color.PINK,Color.GREEN,Color.CYAN
};
public void initUI() {
//创建一个窗口
JFrame jf=new JFrame();
jf.setTitle("画板");
jf.setSize(800,600);
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jf.setBackground(Color.WHITE);
//添加流式布局管理器
FlowLayout fl = new FlowLayout();
jf.setLayout(fl);
//创建画板监听器的对象
DrawListener dl=new DrawListener();
//定义菜单
String[] filestrs={"New","OPen","OPenFiles","Import","Setting"};
JMenuBar bar=new JMenuBar();//菜单容器
JMenu fileMenu=new JMenu("文件");
JMenu shapeMenu=new JMenu("图形");
JMenu colorMenu=new JMenu("颜色");
JMenu helpMenu=new JMenu("Help");
//文件下
for (int i = 0; i < filestrs.length; i++) {
JMenu jm=new JMenu(filestrs[i]);// 菜单
for (int j = 0; j < filestrs.length; j++) {
JMenuItem jmi=new JMenuItem(filestrs[j]);// 菜单
jm.add(jmi);
jmi.addActionListener(dl);
}
fileMenu.add(jm);
}
// 颜色
for (int i = 0; i < colors.length; i++) {
JMenuItem jmi=new JMenuItem();// 菜单
jmi.setBackground(colors[i]);
colorMenu.add(jmi);
jmi.addActionListener(dl);
}
//图形
for (int i = 0; i < btnstrs.length; i++) {
JMenuItem jmi=new JMenuItem(btnstrs[i]);// 菜单
shapeMenu.add(jmi);
jmi.addActionListener(dl);
}
bar.add(fileMenu);
bar.add(shapeMenu);
bar.add(colorMenu);
bar.add(helpMenu);
jf.setJMenuBar(bar);
Dimension dim = new Dimension(100,40); //按钮的尺寸
for (int i = 0; i < btnstrs.length; i++) { // 在循环中调用下面封装的方法
addButton(btnstrs[i],dim,Color.white,dl,jf);
}
Dimension colordim = new Dimension(40,40);//颜色按钮的尺寸
for (int i = 0; i < colors.length; i++) {
addButton("",colordim,colors[i],dl,jf);
}
jf.setVisible(true);
//添加画笔
Graphics g = jf.getGraphics();
dl.g2=g;
jf.addMouseListener(dl);
jf.addMouseMotionListener(dl);
jf.repaint();
}
//封装
public void addButton(String btnstr,Dimension dim, Color color, ActionListener al,JFrame jf){
JButton btn = new JButton(btnstr);
btn.setBackground(color);
btn.setPreferredSize(dim);
jf.add(btn);
btn.addActionListener(al);
}
public static void main(String[] args) {
DrawUI d =new DrawUI();
d.initUI();
}
}
下一部分是我们的监听器类
import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import javax.swing.JButton;
public class DrawListener implements MouseListener,ActionListener,MouseMotionListener{
int x,y,x1,x2,y1,y2,x3,y3,x4,y4,x5,y5,x6,y6,x7,y7,x8,y8;
int count=0;
Graphics g2; // 定义画笔
String shapeStr="";
public void actionPerformed(ActionEvent e){
String btnstr = e.getActionCommand();// 字符串
System.out.println("点击了"+btnstr);
// 区分按钮颜色和按钮字符
if(btnstr.equals("")){
JButton btn = (JButton) e.getSource();
Color btnBgcolor = btn.getBackground();
System.out.println("按钮对象:"+btn.getText());
g2.setColor(btnBgcolor);
}else{
shapeStr=btnstr;
}
}
public void mouseClicked(MouseEvent e){
x = e.getX();
y = e.getY();
if(shapeStr.equals("三角形")) {
if(count==0) {
x3 = e.getX();
y3 = e.getY();
g2.drawOval(x3-2, y3-2, 4, 4);
count++;
}else if(count==1) {
x4=e.getX();
y4=e.getY();
g2.drawLine(x3, y3, x4, y4);
count++;
}else if(count==2) {
x5=e.getX();
y5=e.getY();
g2.drawLine(x5, y5, x4, y4);
g2.drawLine(x5, y5, x3, y3);
count=0;
}
}
System.out.println("点击:x="+x+" y="+y);
}
public void mousePressed(MouseEvent e){
x1=e.getX();
y1=e.getY();
System.out.println("按下");
}
public void mouseReleased(MouseEvent e){
x2=e.getX();
y2=e.getY();
// 画线
if (shapeStr.equals("直线")){
g2.drawLine(x1,y1,x2,y2);
}else if(shapeStr.equals("矩形")){
// 左上角的坐标 宽 高
g2.drawRect(min(x1,x2),min(y1,y2),abs(x2-x1),abs(y2-y1));
}else if(shapeStr.equals("圆")){
// 外切矩形 左上角的坐标 宽 高
g2.drawOval(Math.min(x1,x2),min(y1,y2),abs(x2-x1),abs(y2-y1));
}else if (shapeStr.equals("3D图形")) {
for (int i = 0; i < 255; i++) {
Color color = new Color(i,i ,i );
g2.setColor(color);
g2.fillOval(x1+i/3,y1+i/3,255-i,255-i);//坐标移动 尺寸减小
}
}else if(shapeStr.equals("递归图形")) {
drawMyOval(min(x1,x2),min(y1,y2),abs(x2-x1),abs(y2-y1));
}
System.out.println("松开");
}
public void drawMyOval(int x,int y,int w,int h){ //递归
if(w<50) { //递归的结束语 ,不能一直递归下去
return;
}
for (int i = 0; i < w; i++) {
Color color = new Color(i%255,i%255 ,i%255); //构建3D风格
g2.setColor(color);
g2.drawRect(x+i/2, y+i/2, w-i, h-i);
}
g2.drawRect(x, y, w, h); //在方法中调用方法就是递归
drawMyOval(x, y, w/3,h/3);
drawMyOval(x+w/3, y, w/3, h/3);
drawMyOval(x+2*(w/3), y, w/3, h/3);
drawMyOval(x, y+h/3, w/3,h/3);
drawMyOval(x+w/3, y+h/3, w/3, h/3);
drawMyOval(x+2*(w/3), y+h/3, w/3, h/3);
drawMyOval(x, y+2*(h/3), w/3, h/3);
drawMyOval(x+w/3, y+2*(h/3), w/3, h/3);
drawMyOval(x+2*(w/3), y+2*(h/3), w/3, h/3);
}
public int min(int a,int b){
return a < b ? a : b;
}
public int abs(int a){
return a < 0 ? -a : a;
}
public void mouseEntered(MouseEvent e){
}
public void mouseExited(MouseEvent e){
}
public void mouseDragged(MouseEvent e) {
int x3=e.getX();
int y3=e.getY();
if (shapeStr.equals("橡皮擦")) {
g2.fillRect(x3, y3, 30, 30);
Color a =new Color(238,238,238);
g2.setColor(a);
}else if (shapeStr.equals("曲线")) {
//g2.fillOval(x3, y3, 10, 10);
g2.drawLine(x1,y1,x3,y3);
x1=x3;
y1=y3;
}
}
public void mouseMoved(MouseEvent e) {
}
}