练习
前提,公司战略方向改变需要技术从.net转向java于是自学了一点java 发现基础部分很多相似之处当然也有很多很多的不同之处 比如 对已string类型 单引号与双引号敏感 等等这里就不一一说明啦,来看看这第一次写的一个小程序.
环境信息:win server 2008 R2 开发工具 Eclipse 4.3.0
要求:实现简单图片查看功能
直接上代码:
import java.awt.EventQueue; import java.awt.event.*; import java.io.*; import javax.swing.*; public class HelloWord { public static void main(String[] args) { // TODO 自动生成的方法存根 EventQueue.invokeLater(new Runnable() { @Override public void run() { // 开始运行 JFrame frame=new ImageViewerFrame(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true); } }); } } //显示图片 class ImageViewerFrame extends JFrame{ public ImageViewerFrame() { setTitle("图片查看"); setSize(DEFAULT_WIDTH,DEFAULT_HEIGHT); //创建label去储存图片 label=new JLabel(); add(label); //选择文件 chooser=new JFileChooser(); chooser.setCurrentDirectory(new File(".")); //设置按钮 JMenuBar menuBar=new JMenuBar(); setJMenuBar(menuBar); JMenu menu=new JMenu("文件"); menuBar.add(menu); JMenuItem opItem=new JMenuItem("打开"); menu.add(opItem); opItem.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { // 显示选择按钮 int result=chooser.showOpenDialog(null); //如果已选择文件就显示在lab中 if (result==JFileChooser.APPROVE_OPTION) { String name=chooser.getSelectedFile().getPath(); label.setIcon(new ImageIcon(name)); } } }); JMenuItem exitItem=new JMenuItem("退出"); menu.add(exitItem); exitItem.addActionListener( new ActionListener() { @Override public void actionPerformed(ActionEvent arg0) { // 执行退出 System.exit(0); } }); } private JLabel label; private JFileChooser chooser; private static final int DEFAULT_WIDTH=300; private static final int DEFAULT_HEIGHT=400; }
这段代码来自 <JAVA核心技术-卷1基础知识> ,开始看起来的时候很多地方能看懂(可能是有.net基础的原因)感觉特别像.net写webform包括创建按钮,增加按钮功能等等,而其中的引用 土话.dll文件 相当于 java中的包,引用方式大致相同, 从头来分析一下这个段代码:
首先是程序引用,.net叫引用程序集 .net中实现方法的复用,程序之间相互调用首先需要添加该程序的引用到程序集中,然后从bin目录中添加该.dll文件地址 这样把文件引用到当前项目中重新生成.csproj之后,凡是添加该引用的项目都可以访问到这个方法或这个项目,而java引用包这方面有四种引用方式,原理大致与.net差不多 更简单的是比如导入同一项目中的很多包 可以用*代替,例如import java.lang.*也就是引用java.lang下所有的包,有点像.net的命名空间,不用写具体哪个命名空间 哪个类balabala..
其他的main函数啊,void static之类的就不多说了,这里就深入说一下EventQueue.invokeLater这个,首先介绍一下EventQueue这个 查阅了相关资料 个人是这个意思,它是swing 中GUI重要的组成部分他主要负责AWTEvent事件分发机制,就像是个物流中心,当有事件触发时候系统会把这个事件发送到物流中心 方便他再次分发,而参考文章中提到这个事件分发机制实际上是同步分发机制,也就意味着如果时间多的时候需要排队等待,当我第一次看到invokeLater这个方法时候 第一反应是.net中的委托常用的BeginInvoke/Invoke 异步/同步 执行使用委托的原因常常是因为有回调函数这点与windows的GUI机制不谋而合,好处显而易见执行完成之后会自动清除,保证程序可确定性,减少其他程序类入侵.
程序继续执行ImageViewerFrame,创建当前窗口关闭按钮,显示当前窗口,重要的是下面创建该窗口 与.net创建方式大致相同包括 按钮,按钮功能设定,这段代码中重写了打开文件与关闭方法,有语言功底的孩子硬很轻松能读懂,监听读取文件事件然后重新显示在矿体内部.