@w460461339
2016-11-15T23:10:00.000000Z
字数 8502
阅读 1160
Java基础
今天终于可以告别无聊的控制台,也不用像C/C++那样看小黑屏了,我们可以利用GUI(Graphical User Interface)来制作图形界面了!
GUI:
Graphical User Interface(图形用户接口)。
用图形的方式,来显示计算机操作的界面,这样更方便更直观。
所依赖的包:
java.awt:Abstract Window ToolKit (抽象窗口工具包),需要调用本地系统方法实现功能。属重量级控件。
javax.swing:在AWT的基础上,建立的一套图形界面系统,其中提供了更多的组件,而且完全由Java实现。增强了移植性,属轻量级控件。
因为swing包下的图形界面是用Java实现的,所以用它会有比较高的可移植性,用它比较好。
GUI集成体系图

图中container是容器类,我们目前使用Frame比较多。右边主要是功能按钮类(忘记怎么描述了),是往容器中添加,并实现某个功能用的。
由于方法太对,没办法一个个的学习过来,这里就简单说一些功能。
package GUI_01;import java.awt.Frame;public class FrameDemo {public static void main(String[] args) {//创建Frame对象(就是窗口)Frame fr=new Frame();//设置窗口名字,也可以在创建的时候给fr.setTitle("helloWorld");//设置窗口大小fr.setSize(300, 400);//设置窗口初始位置fr.setLocation(100, 200);//令窗口可视。fr.setVisible(true);}}
但这个时候我们发下我们没办法用单击 x 的方式将窗口关掉,只能用停止程序的方式,因此,就需要下面的知识了~!
(宝宝快来呀…下雪天好冷的~)
方法一
package GUI_01;import java.awt.Frame;import java.awt.event.WindowAdapter;import java.awt.event.WindowEvent;import java.awt.event.WindowListener;public class FrameDemo {public static void main(String[] args) {Frame fr=new Frame();fr.setTitle("helloWorld");// fr.setSize(300, 400);// fr.setLocation(100, 200);//效果和直接上面两句话合在一起一样fr.setBounds(100, 200, 300, 400);//匿名内部类实现windowsListener接口//需要实现每个方法,太麻烦= -fr.addWindowListener(new WindowListener() {@Overridepublic void windowOpened(WindowEvent e) {// TODO Auto-generated method stub}@Overridepublic void windowIconified(WindowEvent e) {// TODO Auto-generated method stub}@Overridepublic void windowDeiconified(WindowEvent e) {// TODO Auto-generated method stub}@Overridepublic void windowDeactivated(WindowEvent e) {// TODO Auto-generated method stub}@Overridepublic void windowClosing(WindowEvent e) {System.exit(0);}@Overridepublic void windowClosed(WindowEvent e) {// TODO Auto-generated method stub}@Overridepublic void windowActivated(WindowEvent e) {// TODO Auto-generated method stub}});fr.setVisible(true);}}
方法二
package GUI_01;import java.awt.Frame;import java.awt.event.WindowAdapter;import java.awt.event.WindowEvent;import java.awt.event.WindowListener;public class FrameDemo {public static void main(String[] args) {Frame fr=new Frame();fr.setTitle("helloWorld");fr.setBounds(100, 200, 300, 400);//利用适配器。//适配器对接口中所有方法空实现//之后只要继承适配器,重写所需要的方法就可以了。fr.addWindowListener(new WindowAdapter() {public void windowClosing(java.awt.event.WindowEvent e){System.exit(0);};});fr.setVisible(true);}}
所以,有适配器的情况下,还是请使用适配器会比较好。
package GUI_01;import java.awt.Button;import java.awt.Color;import java.awt.FlowLayout;import java.awt.Frame;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.awt.event.MouseAdapter;import java.awt.event.MouseEvent;import java.awt.event.WindowAdapter;/*** 需求:* 往窗口中添加按钮。* 并设置按钮的移入事件,更改背景颜色* 设置单击事件,回复背景颜色。*/public class ButtonDemo {public static void main(String[] args) {//创建窗口final Frame fr=new Frame("按钮测试");//设置窗口参数fr.setBounds(200, 300, 400, 300);//设置窗口布局fr.setLayout(new FlowLayout());//创建按钮Button bu1=new Button();bu1.setLabel("红色");Button bu2=new Button();bu2.setLabel("绿色");Button bu3=new Button();bu3.setLabel("复原");//添加按钮fr.add(bu1);fr.add(bu2);fr.add(bu3);//添加对按钮的鼠标进入事件//所以用的是鼠标监听器,添加鼠标适配器bu1.addMouseListener(new MouseAdapter() {@Overridepublic void mouseEntered(MouseEvent e) {fr.setBackground(Color.RED);}});bu2.addMouseListener(new MouseAdapter() {@Overridepublic void mouseEntered(MouseEvent e) {fr.setBackground(Color.GREEN);}});//添加对按钮本身的事件监听//所以添加的是对按钮本身的监听器bu3.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {fr.setBackground(Color.WHITE);}});//设置窗口关闭fr.addWindowListener(new WindowAdapter() {public void windowClosing(java.awt.event.WindowEvent e){System.exit(0);};});//设置窗口可见fr.setVisible(true);}}
这里需要注意,对鼠标的动作监听,就需要调用方法,添加鼠标适配器(addMouseListener(new MouseAdapter));对按下按钮本身而言,是按钮发生了变化,因此需要对鼠标本身做监听。
这里另外解释下addActionListener以及其中创建的ActionListener 对象。
它用于监听组件的特定动作。比如对于按钮就是被按下,对于下拉条就是被滑动等等。就是这个用于监听这个时间发生与否。这与鼠标事件明确是进入还是离开有点不一样,它是默认的,所以在此特别说明。
package GUI_01;import java.awt.Button;import java.awt.FlowLayout;import java.awt.Frame;import java.awt.TextArea;import java.awt.TextField;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.awt.event.WindowAdapter;import java.awt.event.WindowEvent;/*** 需求:* 在文本框中输入任意字符;* 单击按钮;* 将文本框中内容转入文本域* 下一次时添加在末尾。*/public class TextDemo {public static void main(String[] args) {//创建窗口Frame fr=new Frame("文本框文本域转换");//设置窗口属性fr.setBounds(200, 300, 400, 300);//设置窗口布局fr.setLayout(new FlowLayout());//创建文本框,可以输入1行(默认一行),20列final TextField tf=new TextField(20);//创建文本域,可以输入20行,40列final TextArea ta=new TextArea(20, 40);//创建按钮Button bu=new Button("转换");//添加组件fr.add(tf);fr.add(bu);fr.add(ta);//对按钮添加事件bu.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {//获取文本框中内容String tfstr=tf.getText();//往文本域中追加内容ta.append(tfstr+"\r\n");//清空文本框tf.setText("");//给文本框光标tf.requestFocus();}});//添加窗口关闭事件fr.addWindowListener(new WindowAdapter() {@Overridepublic void windowClosing(WindowEvent e) {System.exit(0);}});//显示窗口fr.setVisible(true);}}
这里首相要明确各级包含顺序:
最大的是菜单条(MenuBar),就是菜单背景那个灰色的区域,它只能包含菜单;
其次是菜单(Menu),就是文件,编辑之类的,点开之后又下拉内容的,它能包含菜单和菜单项。
最小的是菜单项(MenuItem),就是点开菜单,并且之后没有进一级内容的选项。
package GUI_01;import java.awt.FlowLayout;import java.awt.Frame;import java.awt.Menu;import java.awt.MenuBar;import java.awt.MenuItem;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.awt.event.WindowAdapter;import java.awt.event.WindowEvent;import java.io.IOException;/*** 需求:* 创建多级菜单* 预先知识:* 先创立菜单条(灰色的背景部分)* 在创立菜单(上面的文件,编辑之类的)* 最后创立菜单项(每个菜单的下拉列表)**/public class MenuDemo {public static void main(String[] args) {//最后一遍联系窗口的创建以及关闭//创建窗口Frame fr=new Frame("多级菜单");//设置窗口参数fr.setBounds(200, 300, 300, 400);//设置布局fr.setLayout(new FlowLayout());//创建菜单条MenuBar mb=new MenuBar();//创建菜单Menu me1=new Menu("文件");Menu me2=new Menu("编辑");//这个菜单在文件菜单下Menu me3=new Menu("新建");//创建菜单项MenuItem mi1=new MenuItem(".txt");MenuItem mi2=new MenuItem(".doc");MenuItem mi3=new MenuItem("Quit");MenuItem mi4=new MenuItem("CopyALL");MenuItem mi5=new MenuItem("DeleAll");//往菜单中添加菜单项//往“新建”菜单中添加菜单项me3.add(mi1);me3.add(mi2);//往“文件”菜单中添加菜单和菜单项me1.add(me3);me1.add(mi3);//往“编辑”菜单中添加菜单项me2.add(mi4);me2.add(mi5);//往菜单条中添加菜单mb.add(me1);mb.add(me2);//窗口中添加菜单条fr.setMenuBar(mb);//添加点击.txt打开记事本事件mi1.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {try {Runtime.getRuntime().exec("notepad");} catch (IOException e1) {e1.printStackTrace();}}});//添加点击QUIT关闭事件mi3.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {System.exit(0);}});//添加点击X关闭事件fr.addWindowListener(new WindowAdapter() {@Overridepublic void windowClosing(WindowEvent e) {System.exit(0);}});//设置窗口可见fr.setVisible(true);}}
说明:
1、由于在Java中排版比较困难,所以这里不用Label了。想要好的排版,请用NetBeans
2、目前只是简单版本,还没有进行数据校验,运算规则校验,小数运算等等内容。
3、同时,更改图标功能也没有完成= -
package _GUI_01;import java.awt.Button;import java.awt.Choice;import java.awt.FlowLayout;import java.awt.Frame;import java.awt.Label;import java.awt.List;import java.awt.TextField;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.awt.event.WindowAdapter;public class CalculatorDemo {public static void main(String[] args) {//创建窗口final Frame fr=new Frame("按钮测试");//设置窗口参数fr.setBounds(200, 300, 400, 300);//设置窗口布局fr.setLayout(new FlowLayout());//创建标签Label firstLabel=new Label("FirstNumber");Label secondLabel=new Label("SecondNumber");Label resultLabel=new Label("resultNumber");Label equals=new Label("=");//创建文本框final TextField firstNumber=new TextField();final TextField secondNumber=new TextField();final TextField result=new TextField();//创建下拉框,测试后,这里用Choice,不用Listfinal Choice ch=new Choice();ch.add("+");ch.add("-");ch.add("*");ch.add("/");//创建按钮Button bu=new Button();bu.setLabel("计算");// //添加标签// fr.add(firstLabel);// fr.add(secondLabel);// fr.add(resultLabel);//添加文本框fr.add(firstNumber);//添加Choicefr.add(ch);//添加文本框fr.add(secondNumber);//添加标签fr.add(equals);//添加文本框fr.add(result);//添加按钮fr.add(bu);bu.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {//获取第一个和第二个运算数String first=firstNumber.getText();int thefirstNumber=Integer.parseInt(first);String second=secondNumber.getText();int thesecondNumber=Integer.parseInt(second);int sum=0;//由于是JDK1.6,不能直接判断字符串,只能判断索引switch(ch.getSelectedIndex()){case 0:sum=thefirstNumber+thesecondNumber;result.setText(Integer.toString(sum));break;case 1:sum=thefirstNumber-thesecondNumber;result.setText(Integer.toString(sum));break;case 2:sum=thefirstNumber*thesecondNumber;result.setText(Integer.toString(sum));break;case 3:sum=thefirstNumber/thesecondNumber;result.setText(Integer.toString(sum));break;}}});//设置窗口关闭fr.addWindowListener(new WindowAdapter() {public void windowClosing(java.awt.event.WindowEvent e){System.exit(0);};});//设置窗口可见fr.setVisible(true);}}