画图板

package zxl.java0221;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Menu;
import java.awt.MenuBar;
import java.awt.MenuItem;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.ButtonGroup;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
//任务:完成重绘,把画布上的图形以队列的形式遍历出来保存到内存中
      //重绘是在drawpanel上,所以paint的方法要继承它;

//创建一个画板类
public class DrawFrame extends JFrame {
//给中间面板添加多个单选按钮,所以要分组,且要使用for循环
ButtonGroup group=new ButtonGroup();
//定义一个画布面板
private javax.swing.JPanel drawpanel;
//定义一个保存形状的队列对象
Queue<Shape> shapes=new Queue<Shape>();
    //主方法
public static void main(String args[]){
//在主函数里面是由系统调用的,可以由类创建对象
DrawFrame df=new DrawFrame();
//对象实现窗体初始化的方法
df.initDrawFrame();

}
//窗体初始化的方法
public void initDrawFrame(){
//设置窗体标题和大小
this.setTitle("我的画板");
this.setSize(600,400);
//改变左上角的图片
//创建图标对象,该图标对象支持png格式
ImageIcon icon=new ImageIcon("ppp.png");
//创建一个图片对象得到该图标返回的图片
Image img=icon.getImage();
//在窗体上设置该图片
this.setIconImage(img);
        //只有JPanel才有边框布局,图片没有

//给窗体分匡,画板调用创建画板的方法
JPanel toolpanel=this.createToolPanel();
JPanel colorpanel=this.createColorPanel();
JPanel centerpanel=this.createCenterPanel();
//将各个面板分别加到窗体上
this.add(toolpanel,BorderLayout.WEST);
this.add(centerpanel,BorderLayout.CENTER);
this.add(colorpanel,BorderLayout.SOUTH);
//给窗体设置菜单栏
//创建菜单对象
Menu menu1=new Menu("文件(F)");
Menu menu2=new Menu("编辑(E)");
Menu menu3=new Menu("查看(V)");
//设置菜单条
MenuBar menbar=new MenuBar();
this.setMenuBar(menbar);
menbar.add(menu1);
menbar.add(menu2);
menbar.add(menu3);
//在菜单"文件"下面再设置菜单
Menu menu11=new Menu("新建");
//在菜单"新建"下添加菜单项
MenuItem item111=new MenuItem("工具");
MenuItem item112=new MenuItem("格式");
menu11.add(item111);
menu11.addSeparator();
menu11.add(item112);
Menu menu12=new Menu("打开");
MenuItem item121=new MenuItem("颜色");
MenuItem item122=new MenuItem("字体");
menu12.add(item121);
menu12.addSeparator();
menu12.add(item122);
menu1.add(menu11);
//在menu11和menu12之间添加分隔符
menu1.addSeparator();
menu1.add(menu12);
//分别在菜单"编辑""查看"中设置菜单项
MenuItem item21=new MenuItem("保存");
MenuItem item22=new MenuItem("帮助");
MenuItem item31=new MenuItem("撤销");
MenuItem item32=new MenuItem("退出");
menu2.add(item21);
//在两者之间添加分隔符
menu2.addSeparator();
menu2.add(item22);
menu3.add(item31);
//在两者之间添加分隔符
menu3.addSeparator();
menu3.add(item32);
//设置可见
this.setVisible(true);
//关闭窗口是退出程序
this.setDefaultCloseOperation(3);
//添加画布,得到权限
Graphics g=drawpanel.getGraphics();
DrawListener dlis=new DrawListener(group,g,shapes);
drawpanel.addMouseListener(dlis);//添加鼠标监听器最好不要监听按钮,按钮用动作监听器

}
//实现分框的方法,工具面板
public javax.swing.JPanel createToolPanel(){
//创建工具面板对象
JPanel toolpane=new JPanel();
//设置工具面板的颜色
//toolpane.setBackground(Color.orange);
//
// //设置工具面板的图片,但是要先设置工具面板的布局
FlowLayout layout=new FlowLayout(FlowLayout.CENTER,0,0);//0,0表示垂直于水平间的距离
        toolpane.setLayout(layout);
// //创建图标对象
// ImageIcon icon1=new ImageIcon("sss.jpg");
// //将图标放到标签对象上
// JLabel lab=new JLabel(icon1);
// //将标签添加到工具面板上
// toolpane.add(lab);

//先定义一个字符串数组
String[] s={"0","1","2","3","4","5","6","7","8","9","line","11","rect","13","oval","roundrect"};
for(int i=0;i<s.length;i++){
  //JRadioButton rbut=new JRadioButton(s[i]);//记下单选按钮组的名字
JRadioButton rbut=new JRadioButton();
  toolpane.add(rbut);
  group.add(rbut);
  //设置单选按钮的的背景颜色为透明
  rbut.setOpaque(true);
  //对单选按钮组贴图片
//创建标签对象
ImageIcon icon=new ImageIcon("images/draw"+i+".jpg");
ImageIcon icon1=new ImageIcon("images/draw"+i+"-1.jpg");
ImageIcon icon2=new ImageIcon("images/draw"+i+"-2.jpg");
ImageIcon icon3=new ImageIcon("images/draw"+i+"-3.jpg");
//在单选按钮上添加图标
rbut.setIcon(icon);//默认图标
rbut.setRolloverIcon(icon1);//鼠标放上去的图标
rbut.setPressedIcon(icon2);//鼠标按下去时的图标
rbut.setSelectedIcon(icon3);//鼠标被选中时的图标
//对单选按钮组设置动作命令
rbut.setActionCommand(s[i]);
if(i==10){
rbut.setSelected(true);
}
}


//设置工具面板的大小
toolpane.setPreferredSize(new java.awt.Dimension(70,80));
//返回toolpane
return toolpane;
}
//实现分框的方法,中间面板
public javax.swing.JPanel createCenterPanel(){
//创建中间面板对象
JPanel centerpane=new JPanel();
//新开辟一个画布面板给定义的drawpanel属性
drawpanel=new ChongHui();
//将画布面板添加到中间面板上
centerpane.add(drawpanel);
//设置画布面板的大小
drawpanel.setPreferredSize(new java.awt.Dimension(360,220));
//设置中间面板的布局
FlowLayout layout=new FlowLayout(FlowLayout.LEFT);
centerpane.setLayout(layout);
//给中间面板设置颜色
centerpane.setBackground(Color.GRAY);
//返回toolpane
return centerpane;
}
//实现分框的方法,颜色面板
public javax.swing.JPanel createColorPanel(){
//创建工具面板对象
JPanel colorpane=new JPanel();
// //给颜色面板设置布局
FlowLayout layout=new FlowLayout(FlowLayout.LEFT);
colorpane.setLayout(layout);
// //添加图片,先创建图标对象,该图标支持该图片格式
// ImageIcon icon=new ImageIcon("sss.jpg");
// //将图标添加到标签对象上
// JLabel lab=new JLabel(icon);
// //将标签添加到颜色面板上
// colorpane.add(lab);
//设置颜色面板的颜色
colorpane.setBackground(Color.pink);
//给颜色面板添加颜色按钮,因为要添加多个,所以用到for循环
//先定义一个颜色数组
Color[] colors={Color.BLACK,Color.blue,Color.CYAN,Color.gray,
Color.green,Color.magenta,Color.pink,Color.ORANGE,Color.RED};
//给颜色面板上的按钮添加监听器
//动作监听器是一个接口,不能new 一个对象,但只要实现其方法就能够了
//创建监听器对象
ActionListener alis=new ActionListener(){

public void actionPerformed(ActionEvent e){
//得到事件源对象(即动作监听器所操作的对象,在这里是被点击按钮对象)
Object obj=e.getSource();
//将事件源对象强行装化为按钮组对象,因为要绘制颜色
JButton but=(JButton) obj;
DrawListener.yanse=but.getBackground();
}
};
for(int i=0;i<colors.length;i++){
JButton jbut=new JButton();
jbut.setBackground(colors[i]);
colorpane.add(jbut);
jbut.setPreferredSize(new java.awt.Dimension(30,30));
//jbut.setOpaque(true);
//给按钮添加动作监听器
jbut.addActionListener(alis);
}

//设置颜色面板的大小
colorpane.setPreferredSize(new java.awt.Dimension(40,40));

//返回toolpane
return colorpane;
}
//在类中在定义类,只需要去掉public即可
class ChongHui extends JPanel{
//重写JPanel中用来绘制窗体的方法
public void paint(Graphics g){
//调用父类中的方法
super.paint(g);
System.out.println("绘制了");
//因为要保存形状,所以要将形状遍历出来
for(int i=0;i<shapes.getSize();i++){
//取出形状
Shape sh=shapes.get(i);
//绘制
sh.draw(g);
}
}
}


}

你可能感兴趣的:(java)