[关闭]
@w460461339 2016-11-16T07:10:00.000000Z 字数 8502 阅读 935

Java学习Day14 (GUI)

Java基础


今天终于可以告别无聊的控制台,也不用像C/C++那样看小黑屏了,我们可以利用GUI(Graphical User Interface)来制作图形界面了!

1.GUI简介

GUI:

Graphical User Interface(图形用户接口)。
用图形的方式,来显示计算机操作的界面,这样更方便更直观。

所依赖的包:

java.awt:Abstract Window ToolKit (抽象窗口工具包),需要调用本地系统方法实现功能。属重量级控件。
javax.swing:在AWT的基础上,建立的一套图形界面系统,其中提供了更多的组件,而且完全由Java实现。增强了移植性,属轻量级控件。

因为swing包下的图形界面是用Java实现的,所以用它会有比较高的可移植性,用它比较好。

GUI集成体系图

图中container是容器类,我们目前使用Frame比较多。右边主要是功能按钮类(忘记怎么描述了),是往容器中添加,并实现某个功能用的。

2.GUI功能

由于方法太对,没办法一个个的学习过来,这里就简单说一些功能。

2.1创建窗口,设置标题,设置大小,设置位置
  1. package GUI_01;
  2. import java.awt.Frame;
  3. public class FrameDemo {
  4. public static void main(String[] args) {
  5. //创建Frame对象(就是窗口)
  6. Frame fr=new Frame();
  7. //设置窗口名字,也可以在创建的时候给
  8. fr.setTitle("helloWorld");
  9. //设置窗口大小
  10. fr.setSize(300, 400);
  11. //设置窗口初始位置
  12. fr.setLocation(100, 200);
  13. //令窗口可视。
  14. fr.setVisible(true);
  15. }
  16. }

但这个时候我们发下我们没办法用单击 x 的方式将窗口关掉,只能用停止程序的方式,因此,就需要下面的知识了~!

2.2事件监听功能

(宝宝快来呀…下雪天好冷的~)
方法一

  1. package GUI_01;
  2. import java.awt.Frame;
  3. import java.awt.event.WindowAdapter;
  4. import java.awt.event.WindowEvent;
  5. import java.awt.event.WindowListener;
  6. public class FrameDemo {
  7. public static void main(String[] args) {
  8. Frame fr=new Frame();
  9. fr.setTitle("helloWorld");
  10. // fr.setSize(300, 400);
  11. // fr.setLocation(100, 200);
  12. //效果和直接上面两句话合在一起一样
  13. fr.setBounds(100, 200, 300, 400);
  14. //匿名内部类实现windowsListener接口
  15. //需要实现每个方法,太麻烦= -
  16. fr.addWindowListener(new WindowListener() {
  17. @Override
  18. public void windowOpened(WindowEvent e) {
  19. // TODO Auto-generated method stub
  20. }
  21. @Override
  22. public void windowIconified(WindowEvent e) {
  23. // TODO Auto-generated method stub
  24. }
  25. @Override
  26. public void windowDeiconified(WindowEvent e) {
  27. // TODO Auto-generated method stub
  28. }
  29. @Override
  30. public void windowDeactivated(WindowEvent e) {
  31. // TODO Auto-generated method stub
  32. }
  33. @Override
  34. public void windowClosing(WindowEvent e) {
  35. System.exit(0);
  36. }
  37. @Override
  38. public void windowClosed(WindowEvent e) {
  39. // TODO Auto-generated method stub
  40. }
  41. @Override
  42. public void windowActivated(WindowEvent e) {
  43. // TODO Auto-generated method stub
  44. }
  45. });
  46. fr.setVisible(true);
  47. }
  48. }

方法二

  1. package GUI_01;
  2. import java.awt.Frame;
  3. import java.awt.event.WindowAdapter;
  4. import java.awt.event.WindowEvent;
  5. import java.awt.event.WindowListener;
  6. public class FrameDemo {
  7. public static void main(String[] args) {
  8. Frame fr=new Frame();
  9. fr.setTitle("helloWorld");
  10. fr.setBounds(100, 200, 300, 400);
  11. //利用适配器。
  12. //适配器对接口中所有方法空实现
  13. //之后只要继承适配器,重写所需要的方法就可以了。
  14. fr.addWindowListener(new WindowAdapter() {
  15. public void windowClosing(java.awt.event.WindowEvent e)
  16. {
  17. System.exit(0);
  18. };
  19. }
  20. );
  21. fr.setVisible(true);
  22. }
  23. }

所以,有适配器的情况下,还是请使用适配器会比较好。

2.3往窗口中添加按钮对象。
  1. package GUI_01;
  2. import java.awt.Button;
  3. import java.awt.Color;
  4. import java.awt.FlowLayout;
  5. import java.awt.Frame;
  6. import java.awt.event.ActionEvent;
  7. import java.awt.event.ActionListener;
  8. import java.awt.event.MouseAdapter;
  9. import java.awt.event.MouseEvent;
  10. import java.awt.event.WindowAdapter;
  11. /**
  12. * 需求:
  13. * 往窗口中添加按钮。
  14. * 并设置按钮的移入事件,更改背景颜色
  15. * 设置单击事件,回复背景颜色。
  16. */
  17. public class ButtonDemo {
  18. public static void main(String[] args) {
  19. //创建窗口
  20. final Frame fr=new Frame("按钮测试");
  21. //设置窗口参数
  22. fr.setBounds(200, 300, 400, 300);
  23. //设置窗口布局
  24. fr.setLayout(new FlowLayout());
  25. //创建按钮
  26. Button bu1=new Button();
  27. bu1.setLabel("红色");
  28. Button bu2=new Button();
  29. bu2.setLabel("绿色");
  30. Button bu3=new Button();
  31. bu3.setLabel("复原");
  32. //添加按钮
  33. fr.add(bu1);
  34. fr.add(bu2);
  35. fr.add(bu3);
  36. //添加对按钮的鼠标进入事件
  37. //所以用的是鼠标监听器,添加鼠标适配器
  38. bu1.addMouseListener(new MouseAdapter() {
  39. @Override
  40. public void mouseEntered(MouseEvent e) {
  41. fr.setBackground(Color.RED);
  42. }
  43. });
  44. bu2.addMouseListener(new MouseAdapter() {
  45. @Override
  46. public void mouseEntered(MouseEvent e) {
  47. fr.setBackground(Color.GREEN);
  48. }
  49. });
  50. //添加对按钮本身的事件监听
  51. //所以添加的是对按钮本身的监听器
  52. bu3.addActionListener(new ActionListener() {
  53. @Override
  54. public void actionPerformed(ActionEvent e) {
  55. fr.setBackground(Color.WHITE);
  56. }
  57. });
  58. //设置窗口关闭
  59. fr.addWindowListener(new WindowAdapter() {
  60. public void windowClosing(java.awt.event.WindowEvent e)
  61. {
  62. System.exit(0);
  63. };
  64. }
  65. );
  66. //设置窗口可见
  67. fr.setVisible(true);
  68. }
  69. }

这里需要注意,对鼠标的动作监听,就需要调用方法,添加鼠标适配器(addMouseListener(new MouseAdapter));对按下按钮本身而言,是按钮发生了变化,因此需要对鼠标本身做监听。

这里另外解释下addActionListener以及其中创建的ActionListener 对象。
它用于监听组件的特定动作。比如对于按钮就是被按下,对于下拉条就是被滑动等等。就是这个用于监听这个时间发生与否。这与鼠标事件明确是进入还是离开有点不一样,它是默认的,所以在此特别说明

2.4将文本框数据移入文本域
  1. package GUI_01;
  2. import java.awt.Button;
  3. import java.awt.FlowLayout;
  4. import java.awt.Frame;
  5. import java.awt.TextArea;
  6. import java.awt.TextField;
  7. import java.awt.event.ActionEvent;
  8. import java.awt.event.ActionListener;
  9. import java.awt.event.WindowAdapter;
  10. import java.awt.event.WindowEvent;
  11. /**
  12. * 需求:
  13. * 在文本框中输入任意字符;
  14. * 单击按钮;
  15. * 将文本框中内容转入文本域
  16. * 下一次时添加在末尾。
  17. */
  18. public class TextDemo {
  19. public static void main(String[] args) {
  20. //创建窗口
  21. Frame fr=new Frame("文本框文本域转换");
  22. //设置窗口属性
  23. fr.setBounds(200, 300, 400, 300);
  24. //设置窗口布局
  25. fr.setLayout(new FlowLayout());
  26. //创建文本框,可以输入1行(默认一行),20列
  27. final TextField tf=new TextField(20);
  28. //创建文本域,可以输入20行,40列
  29. final TextArea ta=new TextArea(20, 40);
  30. //创建按钮
  31. Button bu=new Button("转换");
  32. //添加组件
  33. fr.add(tf);
  34. fr.add(bu);
  35. fr.add(ta);
  36. //对按钮添加事件
  37. bu.addActionListener(new ActionListener() {
  38. @Override
  39. public void actionPerformed(ActionEvent e) {
  40. //获取文本框中内容
  41. String tfstr=tf.getText();
  42. //往文本域中追加内容
  43. ta.append(tfstr+"\r\n");
  44. //清空文本框
  45. tf.setText("");
  46. //给文本框光标
  47. tf.requestFocus();
  48. }
  49. });
  50. //添加窗口关闭事件
  51. fr.addWindowListener(new WindowAdapter() {
  52. @Override
  53. public void windowClosing(WindowEvent e) {
  54. System.exit(0);
  55. }
  56. });
  57. //显示窗口
  58. fr.setVisible(true);
  59. }
  60. }
2.5多级菜单

这里首相要明确各级包含顺序:
最大的是菜单条(MenuBar),就是菜单背景那个灰色的区域,它只能包含菜单;
其次是菜单(Menu),就是文件,编辑之类的,点开之后又下拉内容的,它能包含菜单和菜单项。
最小的是菜单项(MenuItem),就是点开菜单,并且之后没有进一级内容的选项。

  1. package GUI_01;
  2. import java.awt.FlowLayout;
  3. import java.awt.Frame;
  4. import java.awt.Menu;
  5. import java.awt.MenuBar;
  6. import java.awt.MenuItem;
  7. import java.awt.event.ActionEvent;
  8. import java.awt.event.ActionListener;
  9. import java.awt.event.WindowAdapter;
  10. import java.awt.event.WindowEvent;
  11. import java.io.IOException;
  12. /**
  13. * 需求:
  14. * 创建多级菜单
  15. * 预先知识:
  16. * 先创立菜单条(灰色的背景部分)
  17. * 在创立菜单(上面的文件,编辑之类的)
  18. * 最后创立菜单项(每个菜单的下拉列表)
  19. *
  20. */
  21. public class MenuDemo {
  22. public static void main(String[] args) {
  23. //最后一遍联系窗口的创建以及关闭
  24. //创建窗口
  25. Frame fr=new Frame("多级菜单");
  26. //设置窗口参数
  27. fr.setBounds(200, 300, 300, 400);
  28. //设置布局
  29. fr.setLayout(new FlowLayout());
  30. //创建菜单条
  31. MenuBar mb=new MenuBar();
  32. //创建菜单
  33. Menu me1=new Menu("文件");
  34. Menu me2=new Menu("编辑");
  35. //这个菜单在文件菜单下
  36. Menu me3=new Menu("新建");
  37. //创建菜单项
  38. MenuItem mi1=new MenuItem(".txt");
  39. MenuItem mi2=new MenuItem(".doc");
  40. MenuItem mi3=new MenuItem("Quit");
  41. MenuItem mi4=new MenuItem("CopyALL");
  42. MenuItem mi5=new MenuItem("DeleAll");
  43. //往菜单中添加菜单项
  44. //往“新建”菜单中添加菜单项
  45. me3.add(mi1);
  46. me3.add(mi2);
  47. //往“文件”菜单中添加菜单和菜单项
  48. me1.add(me3);
  49. me1.add(mi3);
  50. //往“编辑”菜单中添加菜单项
  51. me2.add(mi4);
  52. me2.add(mi5);
  53. //往菜单条中添加菜单
  54. mb.add(me1);
  55. mb.add(me2);
  56. //窗口中添加菜单条
  57. fr.setMenuBar(mb);
  58. //添加点击.txt打开记事本事件
  59. mi1.addActionListener(new ActionListener() {
  60. @Override
  61. public void actionPerformed(ActionEvent e) {
  62. try {
  63. Runtime.getRuntime().exec("notepad");
  64. } catch (IOException e1) {
  65. e1.printStackTrace();
  66. }
  67. }
  68. });
  69. //添加点击QUIT关闭事件
  70. mi3.addActionListener(new ActionListener() {
  71. @Override
  72. public void actionPerformed(ActionEvent e) {
  73. System.exit(0);
  74. }
  75. });
  76. //添加点击X关闭事件
  77. fr.addWindowListener(new WindowAdapter() {
  78. @Override
  79. public void windowClosing(WindowEvent e) {
  80. System.exit(0);
  81. }
  82. });
  83. //设置窗口可见
  84. fr.setVisible(true);
  85. }
  86. }
2.6计算器

说明:

1、由于在Java中排版比较困难,所以这里不用Label了。想要好的排版,请用NetBeans
2、目前只是简单版本,还没有进行数据校验,运算规则校验,小数运算等等内容。
3、同时,更改图标功能也没有完成= - 
  1. package _GUI_01;
  2. import java.awt.Button;
  3. import java.awt.Choice;
  4. import java.awt.FlowLayout;
  5. import java.awt.Frame;
  6. import java.awt.Label;
  7. import java.awt.List;
  8. import java.awt.TextField;
  9. import java.awt.event.ActionEvent;
  10. import java.awt.event.ActionListener;
  11. import java.awt.event.WindowAdapter;
  12. public class CalculatorDemo {
  13. public static void main(String[] args) {
  14. //创建窗口
  15. final Frame fr=new Frame("按钮测试");
  16. //设置窗口参数
  17. fr.setBounds(200, 300, 400, 300);
  18. //设置窗口布局
  19. fr.setLayout(new FlowLayout());
  20. //创建标签
  21. Label firstLabel=new Label("FirstNumber");
  22. Label secondLabel=new Label("SecondNumber");
  23. Label resultLabel=new Label("resultNumber");
  24. Label equals=new Label("=");
  25. //创建文本框
  26. final TextField firstNumber=new TextField();
  27. final TextField secondNumber=new TextField();
  28. final TextField result=new TextField();
  29. //创建下拉框,测试后,这里用Choice,不用List
  30. final Choice ch=new Choice();
  31. ch.add("+");
  32. ch.add("-");
  33. ch.add("*");
  34. ch.add("/");
  35. //创建按钮
  36. Button bu=new Button();
  37. bu.setLabel("计算");
  38. // //添加标签
  39. // fr.add(firstLabel);
  40. // fr.add(secondLabel);
  41. // fr.add(resultLabel);
  42. //添加文本框
  43. fr.add(firstNumber);
  44. //添加Choice
  45. fr.add(ch);
  46. //添加文本框
  47. fr.add(secondNumber);
  48. //添加标签
  49. fr.add(equals);
  50. //添加文本框
  51. fr.add(result);
  52. //添加按钮
  53. fr.add(bu);
  54. bu.addActionListener(new ActionListener() {
  55. @Override
  56. public void actionPerformed(ActionEvent e) {
  57. //获取第一个和第二个运算数
  58. String first=firstNumber.getText();
  59. int thefirstNumber=Integer.parseInt(first);
  60. String second=secondNumber.getText();
  61. int thesecondNumber=Integer.parseInt(second);
  62. int sum=0;
  63. //由于是JDK1.6,不能直接判断字符串,只能判断索引
  64. switch(ch.getSelectedIndex()){
  65. case 0:
  66. sum=thefirstNumber+thesecondNumber;
  67. result.setText(Integer.toString(sum));
  68. break;
  69. case 1:
  70. sum=thefirstNumber-thesecondNumber;
  71. result.setText(Integer.toString(sum));
  72. break;
  73. case 2:
  74. sum=thefirstNumber*thesecondNumber;
  75. result.setText(Integer.toString(sum));
  76. break;
  77. case 3:
  78. sum=thefirstNumber/thesecondNumber;
  79. result.setText(Integer.toString(sum));
  80. break;
  81. }
  82. }
  83. });
  84. //设置窗口关闭
  85. fr.addWindowListener(new WindowAdapter() {
  86. public void windowClosing(java.awt.event.WindowEvent e)
  87. {
  88. System.exit(0);
  89. };
  90. }
  91. );
  92. //设置窗口可见
  93. fr.setVisible(true);
  94. }
  95. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注