假期结束,学习速度直线下降,翻翻之前写的包的日期最近的才九月中下旬开始的仿XP画图板。伴随着各种节假日,加之学校繁重的学习和其他任务,程序进程一拖再拖。和朋友聊发现大家都会因为自己没有尽心学编程而内心产生负罪感,这种罪恶感和愧疚感最终会演变成自身懒惰的最佳接口,而编程也会成为那不可言状的伤,不去触碰。
可是不管你敲不敲代码,半截程序就放在那里,不增不减,不多不少。所以我总结了最后还是必须继续走在这条大道上,天天得到一种自我的感动~
下面还是说说我的程序吧:
JAVA入门是以简易的画图板入手的,所以在仿XP的中有了一个大体思路。
- 窗体界面的实现。
- 界面的分栏,主要三个板块——工具栏、颜色选择栏和画图面板三大块。(这里当然还要和之后的监听器扯到关系。)
- 菜单选择栏的添加
- 各板块功能的实现,监听器的使用。
- 重绘,图形的保存。
个人认为在写java代码的时候,每个类之间的关系是最头痛的,往往是在写一个类的时候突然又要引进另外一个具有其他功能的类或者方法,就这样在传来传去中搞得晕头转向。所以我也就通俗简单的说说自己写的吧。
- 创建一个主函数来调用窗口。
那么,当然必须要有一个窗口函数来实现了。在窗口中首先是最直观的就是他的名称,窗口大小,以及窗口内容的可显示,显示位置以及大小是否可以改变。//创建一个主函数来调用窗口 public static void main(String args[]){ DrawUI di = new DrawUI(); di.initUI(); }
这些都是非常基础和简单的,没有太多要详述的部分。public void initUI(){ this.setTitle("画图板v2.0"); this.setSize(new Dimension(700,600)); this.setDefaultCloseOperation(3); this.setLocationRelativeTo(null); }
- 接着窗体要划分为三个大的板块,用JPanel来完成分块,顺带setJMenuBar来创建一个菜单栏。在三个板块中的亮点是用边框布局让三块各就其位,
下面是菜单选择栏的方法this.setJMenuBar(createMenuBar()); //实例化一个边框布局对象 BorderLayout bl = new BorderLayout(); //设置窗体的布局为边框布局 this.setLayout(bl); //窗体上获得一个画布对象 java.awt.Graphics g = this.getGraphics(); //实例化一个工具栏对象 ToolPanel tp = new ToolPanel(); this.add(tp,BorderLayout.WEST); //实例化一个颜色选择栏对象 ColorPanel cp = new ColorPanel(); this.add(cp,BorderLayout.SOUTH); //实例化一个画图版面对象 DrawPanel dp = new DrawPanel(); this.add(dp,BorderLayout.CENTER); this.setVisible(true);
现在的代码已近是框架出来了,在之前两手空空写JPanel时,当然还要写工具栏,颜色选择栏和画板三个类,也就是上面代码实现对象时候出现的。(好晚了,写不动了,都怪之前的懒惰堆积这么多总结,明天继续,安~)//创建菜单的方法 public JMenuBar createMenuBar(){ JMenuBar jmb = new JMenuBar(); //创建一个一维数组放三个选项 String[] arrayMenuFile = {"文件","颜色","帮助","编辑"}; //创建一个二维数组放每个选项中的子选项 String[][] arrayMenuItem = {{"新建","打开","保存","-","退出"}, {"编辑颜色"},{"帮助主题","关于画图"},{"撤销"}}; //开始循环然后将每个选项放入按钮中 for(int i = 0;i < arrayMenuFile.length;i++){ //创建菜单对象 JMenu menufile = new JMenu(arrayMenuFile[i]); for(int j = 0;j < arrayMenuItem[i].length;j++){ if(!arrayMenuItem[i][j].equals("-")){ //创建一个子菜单对象 JMenuItem jmt = new JMenu(arrayMenuItem[i][j]); menufile.add(jmt); ButtonListener bl = new ButtonListener(jmb); jmb.addMouseListener(bl); }else{ //给菜单加分隔符号 menufile.addSeparator(); } } //将子菜单添加在菜单上 jmb.add(menufile); } return jmb; }
学校事情忙了一天,忙里偷闲继续昨天未完成的总结。
首先是三个面板上的显示和功能的实现,这里通过鼠标监听器来实现对面板内按钮或者其他事件的操作。他们是在窗体的方法中调用。
- 这是工具栏,利用网格布局,这种方法的好处是可将其中的板块割分成需要的个数,然后用一层for循环遍历一遍,将已近制作好的工具图片传入。我在这里放入了16种图片,也就是有16种画图功能,其中我是将按钮的大小完全设置成为了图片的大小,所以看起来就还算靠谱了,不过工具栏的这些功能还在监听器的类中进展中,实现了一多半了。
public class ToolPanel extends JPanel { //用户选择图形的属性 private String item = "10直线"; //获取图形的方法 public String getItem(){ return item; } /** * 构造器方法 */ public ToolPanel(){ //创建一个动作监听器对象 ActionListener alr = new ActionListener(){ public void actionPerformed(ActionEvent e){ //接口ActionLiatener的方法 item = e.getActionCommand(); } };//这是方法中的一个语句,所以需要加分号 //创建一个panel对象 JPanel panel = new JPanel(); panel.setLayout(new GridLayout(8,2)); panel.setPreferredSize(new Dimension(50,200)); String[] Arr = {"0多边形","1矩形","2橡皮","3填充","4吸管", "5放大镜","6铅笔","7刷子","8喷枪","9文字","10直线","11曲线", "12实心矩形","13实心多边形","14实心圆","15实心圆角矩形"}; //循环创建的对象,并且将图片传入按钮 for(int i = 0;i < Arr.length;i++){ ImageIcon icon = new ImageIcon("src/img/"+Arr[i]+".jpg"); JButton button = new JButton(icon); button.setBorder(null); button.setActionCommand(Arr[i]); button.addActionListener(alr); button.setSize(new Dimension(15,15));//给按钮设置大小 panel.add(button); } this.setLayout(new FlowLayout()); this.add(panel); } }
我在颜色选择栏和工具栏按钮的图片传入选择了两种方法,工具栏是直接传入,而颜色栏我选择了又另写一个Config的类里面放一些程序中用的常量,然后在其他类里需要的时候直接调用,这样做的好处是在日后的程序修改时容易操作。这一部分在监听器中还未实现额。
import javax.swing.ImageIcon;
public class Config {
//public static ImageIcon[] ICONS1 = new ImageIcon[16];
public static ImageIcon[] ICONS2 = new ImageIcon[32];
static{
for(int j=16;j<32;j++) {
javax.swing.ImageIcon image = new javax.swing.ImageIcon( //
Config.class.getClassLoader().getResource("img/"+j+".jpg"));
image.setDescription(""+j);//用一个描述方法来得到图片的一个描述方法
ICONS2[j] = image;//得到一个像商标一样的标签贴给数组中的元素
}
}
}
- 这是Config中颜色栏的图片。
public class ColorPanel extends JPanel{
/**
* 构造器添加颜色按钮
*/
public ColorPanel(){
//将颜色选择栏靠左放置
this.setLayout(new FlowLayout(FlowLayout.LEFT));
//创建一个panel对象
JPanel panel1 = new JPanel();
panel1.setLayout(null);
panel1.setPreferredSize(new Dimension(30,30));
//创建两个按钮对象
JButton btn1 = new JButton();
btn1.setBounds(5, 5, 16, 16);
JButton btn2 = new JButton();
btn2.setBounds(10, 10, 16,16 );
panel1.add(btn1);
panel1.add(btn2);
panel1.setBackground(Color.LIGHT_GRAY);
JPanel panel2 = new JPanel();
panel2.setLayout(new GridLayout(2,8,3,3));
panel2.setPreferredSize(new Dimension(150,30));
panel2.setBackground(Color.LIGHT_GRAY);
//循环创建的对象,并且将图片传入按钮
for(int j = 16;j < 32;j++){
ImageIcon image = Config.ICONS2[j];
//System.out.println("========>"+image.getDescription());
JButton button = new JButton(image);
button.setActionCommand(image.getDescription());//取得了图片的描述
button.setSize(new Dimension(15,15));
button.setBorder(null);
panel2.add(button);
}
this.add(panel1);
this.add(panel2);
}
}
这里有一个细节就是颜色栏左下角的两个小方块,这里我分了两个Panel来分别放整个颜色条和颜色显示栏。
- 下面是画图板面的实现了,这一部分较为简单,只需让背景初始色为白色即可。不过现在代码中已近将重绘方法写出,当时那还是没有达到这个层面的。
先到这里,由于监听器里的东西还在继续添加,估计下次写又要有一段时间了,表达能力不好,代码写的水平也有限,又不上劲,希望自己在知道不足后克服主观的消极,刻苦努力!加油public class DrawPanel extends JPanel{ /** * 构造器 */ public DrawPanel(){ this.setBackground(Color.WHITE); } /** * 重绘的方法 */ public void paint(Graphics g){ super.paint(g); } }