啊啊啊啊啊啊啊啊啊啊啊啊

来源:互联网 发布:先导化合物的优化方法 编辑:程序博客网 时间:2024/06/07 05:33

设计:让简单的事情变得容易,让困难的事情变得可行(最小吃惊原则,别让用户感到惊讶)。

抽象窗口工具包(Abstract Window Toolkit,AWT):只能使用四种字体,也不能访问存在于本地操作系统上的任何成熟的GUI组件,编程模型非常笨拙,不是面向对象的。

JavaBeans:最初为了使可视化编程环境的创建变得更容易而引入的构件编程模型。

Java1.0 AWT ->JDK1.2 Java基础类库(JFC)

JFC中有关GUI的部分:Swing

1.Swing与其他语言或开发环境相比,是一个已经改进了很多的编程模型(向前迈进一大步)

2.GUI构造工具(可视化编程环境)对于完整的Java开发环境而言,是必不可少的一方面。JavaBeans和Swing使得GUI构造工具能够在你用图形工具向窗体上放置组件的同时帮助你编写代码。这不仅在编写GUI程序期间加快了开发速度,而且它使得你可以进行更多的试验,从而具备能够通过试验产生更多的设计的能力,继而得到更好的设计。

3.Swing库设计上的简单性和合理性,使得即使使用GUI构造工具而不是手工编写代码,得到的代码仍然是可读的。

“正交使用”:一旦理解了库中的某个通用概念,你就可以把这个概念应用到其他地方。

Swing自动支持键盘导航;支持“可插式外观”,用户界面的外观可以动态改变,以适应不同平台和操作系统下用户的习惯。

Swing完全用Java编写

22.1 applet

可以在Internet上传递,并在Web浏览器中运行的程序(出于安全考虑,只能在沙盒内运行)

22.2 Swing基础

package gui;import javax.swing.JFrame;public class HelloSwing {public static void main(String[] args) {JFrame frame = new JFrame("Hello Swing");//setDefaultCloseOperation:用户执行关闭操作时应该做些什么 EXIT_ON_CLOSE常量:退出程序frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);frame.setSize(300, 100);frame.setVisible(true);}}

package gui;import java.util.concurrent.TimeUnit;import javax.swing.JFrame;import javax.swing.JLabel;public class HelloLable {public static void main(String[] args) throws Exception {JFrame frame = new JFrame("Hello Swing");JLabel label = new JLabel("A Label");frame.add(label);//setDefaultCloseOperation:用户执行关闭操作时应该做些什么 EXIT_ON_CLOSE常量:退出程序frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);frame.setSize(300, 100);frame.setVisible(true);TimeUnit.SECONDS.sleep(1);label.setText("Hey! This is Different!");}}


Swing有它自己的专用的线程来接受UI事件并更新屏幕,从其他线程着手对屏幕进行操作,可能会产生冲突和死锁,应该通过Swing事件分发线程提交要执行的任务(事件分发线程来自AWT类库)。

package gui;import java.util.concurrent.TimeUnit;import javax.swing.JFrame;import javax.swing.JLabel;import javax.swing.SwingUtilities;public class SubmitLabelManipulationTask {public static void main(String[] args) throws Exception {JFrame frame = new JFrame("Hello Swing");final JLabel label = new JLabel("A Label");frame.add(label);// setDefaultCloseOperation:用户执行关闭操作时应该做些什么 EXIT_ON_CLOSE常量:退出程序frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);frame.setSize(300, 100);frame.setVisible(true);TimeUnit.SECONDS.sleep(1);//通过事件分发线程将任务放置到(最终将得到执行的)待执行事件队列中SwingUtilities.invokeLater(new Runnable() {@Overridepublic void run() {label.setText("Hey! This is Different!");}});}}

程序中的所有代码都应该通过SwingUtilities.invokeLater()来提交操作,包括启动程序本身,即main()也不应该调用Swing的方法。

package gui;import java.util.concurrent.TimeUnit;import javax.swing.JFrame;import javax.swing.JLabel;import javax.swing.SwingUtilities;public class SubmitSwingProgram extends JFrame {JLabel label;public SubmitSwingProgram() {super("Hello Swing");label = new JLabel("A Lable");add(label);setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);setSize(300, 100);setVisible(true);}static SubmitSwingProgram ssp;public static void main(String[] args) throws Exception {SwingUtilities.invokeLater(new Runnable() {@Overridepublic void run() {ssp = new SubmitSwingProgram();}});TimeUnit.SECONDS.sleep(1);SwingUtilities.invokeLater(new Runnable() {@Overridepublic void run() {ssp.label.setText("Hey! This is Different!");}});}}

package gui;import java.util.concurrent.TimeUnit;import javax.swing.JFrame;import javax.swing.JLabel;import javax.swing.SwingUtilities;public class SubmitSwingProgram extends JFrame {JLabel label;public SubmitSwingProgram() throws InterruptedException {super("Hello Swing");label = new JLabel("A Lable");add(label);setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);setSize(300, 100);setVisible(true);//下面的做法是错误的,sleep()在构造器的内部,或者在任何UI操作的内部,就意味着在sleep()期间//将中止事件分发线程TimeUnit.SECONDS.sleep(1);}static SubmitSwingProgram ssp;public static void main(String[] args) throws Exception {SwingUtilities.invokeLater(new Runnable() {@Overridepublic void run() {try {ssp = new SubmitSwingProgram();} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}});SwingUtilities.invokeLater(new Runnable() {@Overridepublic void run() {ssp.label.setText("Hey! This is Different!");}});}}



22.2.1 一个显示框架

//Tool for running Swing demos from the// console,both applets and JFrames.package net.mindView.util;import javax.swing.JFrame;import javax.swing.SwingUtilities;public class SwingConsole {public static void run(final JFrame f,final int width, final int height){SwingUtilities.invokeLater(new Runnable() {@Overridepublic void run() {f.setTitle(f.getClass().getSimpleName());f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);f.setSize(width,height);f.setVisible(true);}});}}



22.3 创建按钮

JButton是一个组件,它有自己的小窗口,能作为整个更新过程的一部分而自动被重绘。

JFrame默认使用BorderLayout管理布局

//Putting buttons on a Swing application.package gui;import java.awt.FlowLayout;import javax.swing.JButton;import javax.swing.JFrame;import static net.mindView.util.SwingConsole.*;public class Button1 extends JFrame{private JButton b1 = new JButton("Button 1"),b2 = new JButton("Button 2");public Button1(){setLayout(new FlowLayout());add(b1);add(b2);}public static void main(String[] args){run(new Button1(),200,100);}}
22.4 捕获事件

事件驱动编程的基础,就是把事件同处理事件的代码连接起来。

在Swing中,这种关联方式就是通过清楚地分离接口(图形组件)和实现(当和组件相关的事件发生时要执行的代码)而做到的。每个Swing组件都能够报告其上所有可能发生的事件,并且它能单独报告每种事件。

//Responding to button presses.package gui;import static net.mindView.util.SwingConsole.run;import gui.Button2.ButtonListener;import java.awt.FlowLayout;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import javax.swing.JButton;import javax.swing.JFrame;import javax.swing.JTextField;public class Button2 extends JFrame {private JButton b1 = new JButton("Button 1"), b2 = new JButton("Button 2");private JTextField txt = new JTextField(10);class ButtonListener implements ActionListener{@Override//ActionEvent包含事件和事件源的所有信息public void actionPerformed(ActionEvent e) {String name = ((JButton)e.getSource()).getText();txt.setText(name);}}private ButtonListener bl = new ButtonListener();public Button2() {b1.addActionListener(bl);b2.addActionListener(bl);setLayout(new FlowLayout());add(b1);add(b2);add(txt);}public static void main(String[] args) {run(new Button2(), 200, 150);}}



//Responding to button presses.package gui;import static net.mindView.util.SwingConsole.run;import java.awt.FlowLayout;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import javax.swing.JButton;import javax.swing.JFrame;import javax.swing.JTextField;public class Button2b extends JFrame {private JButton b1 = new JButton("Button 1"), b2 = new JButton("Button 2");private JTextField txt = new JTextField(10);private ActionListener bl = new ActionListener(){@Override//ActionEvent包含事件和事件源的所有信息public void actionPerformed(ActionEvent e) {String name = ((JButton)e.getSource()).getText();txt.setText(name);}};public Button2b() {b1.addActionListener(bl);b2.addActionListener(bl);setLayout(new FlowLayout());add(b1);add(b2);add(txt);}public static void main(String[] args) {run(new Button2b(), 200, 150);}}



22.5 文本区域



原创粉丝点击