黑马程序员——黑马学习日志之十六 GUI

------- android培训java培训、期待与您交流! ----------

黑马学习日志之十六 GUI

1 GUI

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

CLI 命令行用户接口Command line User Interfance  就是常见的Dos命令行操作,需要记忆一些常用的命令,操作不直观

JavaGUI提供的对象都存在Java.AwtJavax.Swing两个包中。

2AwtSwing

Awt  抽象窗口工具包Abstract Window ToolKit,属于重量级控件,需要调用本地系统方法。  跨平台性不强

Swing 在AWT的基础上,建立的一套图形界面系统。其中提供了更多的组件,而且完全由 Java实现。增强了移植性,属轻量级控件。跨平台。

Swt  Eclipse用的外观包。

3 Component 组件

  Button按钮 

  Lable标签 封装文字
  Checkbox复选框
  TextComponet文本组件
  Text 文本区域 多行文本
  TextFiled文本框 单行文本 

  Container容器  

  panel面板
  Window窗口
  Frame框架
  dialog对话框
  FileDialog文件对话框

  Container为容器,是一个特殊的组件,给组件中可以通过add方法添加其他组件进来

布局

布局:容器中的组件的排放方式,就是布局

常见的布局管理器:

FlowLayout(流式布局管理器):从左到右的顺序排列。Panel默认布局管理器

BorderLayout(边界布局管理器):东,南,西,北,中。Frame默认布局管理器

GridLayout(网格布局管理器):规则的矩阵

CardLayout(卡片布局管理器):选项卡

GridBagLayout(网格包布局管理器):非规则的矩阵

坐标式布局:如果窗体中多个布局,可以先用面板划分区域,然后面板里创建布局。

构建窗体

component 是一个具有图形表示能力的对象,可在屏幕上显示,并可与用户进行交互。典型图形用户界面中的按钮、复选框和滚动条都是组件示例。

Component 类是与菜单不相关的 Abstract Window Toolkit 组件的抽象超类。还可以直接扩展类 Component 来创建一个轻量级组件。轻量级组件是与本机不透明窗口不相关的组件。

Container容器 有add方法Component add(Component comp, int index) 
容器当中有个集合,集合是有脚标,是可以添加对象的

创建图形化界面:
1.创建frame窗体
2.对窗体进行基本设置比如大小,位置,布局
3.定义组件
4.将组件通过窗体的add方法添加到窗体中
5.让窗体显示。通过setVisible(true)
import java.awt.*;
class AwtDemo
{
 public static void main(String [] args){
  Frame f = new Frame("my awt");

  f.setSize(400,200);//设置窗体大小
  f.setLocation(300,200);//设置窗体顶点的坐标
  f.setLayout(new FlowLayout());//设置窗体布局 frame默认是边界布局

  Button b = new Button("按钮");
  f.add(b);//添加按钮组件
  f.setVisible(true);//设置窗体可以

  System.out.println("hello world");
  //图形化界面开启之后就多了一个线程 而这里输出语句是主线程
 }
}

事件监听机制

事件监听机制特点:
事件源 ;事件 ;监听器,封装有外部动作 ;事件处理
事件源(组件):就是awt包或者swing包中的那些图形界面组件

事件(Event每一个事件源都有自己的特有的对应事件和共性事件(例如鼠标键盘事件)

监听器(Listener):将可以触发某一个事件的动作(不只一个动作)都已经封装到监听器中

以上三者,在java中都已经定义好了。直接获取其对象来用就可以了。我们要做的事情是,就是对产生的动作进行处理。就是我们最重要的部分。

窗体事件

窗体事件:WindowEvent,窗体打开、关闭、正在关闭、激活、最小化等

import java.awt.*;//只导入组件 需要导入事件
import java.awt.event.*;//导入事件
class AwtDemoclose
{
 public static void main(String [] args){
  Frame f = new Frame("my awt");
  f.setSize(500,400);//设置窗体大小
  f.setLocation(300,200);//设置窗体顶点的坐标
  f.setLayout(new FlowLayout());//设置窗体布局 frame默认是边界布局
  Button b = new Button("我是一个按钮");
  f.add(b);//添加按钮组件
  f.addWindowListener(new MyWin());//添加窗体监听器
  f.setVisible(true);//设置窗体可以

}

}

//因为WindowListener的子类WindowAdapter已经实现了WindowListener接口
//并覆盖了其中的所有方法。只要继承自Windowadapter覆盖需要的方法即可

class MyWin extends WindowAdapter
{
  publicvoidwindowClosing(WindowEvente){
    System.out.println("关闭");//此方法只是控制台显示,没有实际关闭
    System.out.println("guanbi ---"+e.toString());//打印出事件的信息
    System.exit(0);
 }
}

采用匿名内部类
import java.awt.*;//只导入组件 需要倒入事件
import java.awt.event.*;//导入事件
class AwtDemoclose2
{
 public static void main(String [] args){
  Frame f = new Frame("my awt");
  f.setSize(400,300);//设置窗体大小
  f.setLocation(300,200);//设置窗体顶点的坐标
  f.setLayout(new FlowLayout());//设置窗体布局 frame默认是边界布局
  Button b = new Button("按钮");
  f.add(b);//添加按钮
  //匿名内部类的方式  
  f.addWindowListener(new WindowAdapter(){
   public void windowClosing(WindowEvent e){
    System.out.println("guanbi");
    System.exit(0);
   }
   public void windowActivated(WindowEvent e){
    System.out.println("jihuo");
   }
   public void windowOpened(WindowEvent e){
    System.out.println("open");
   }
  });
  f.setVisible(true);//设置窗体可以
   }
}

8 Action事件

//可以将awt中的组件布局和事件分开来处理
import java.awt.*;
import java.awt.event.*;
class FrameDemo
{
 private Frame f;//可以将引用作用在整个类
 private Button but;
 FrameDemo(){
  init(); //frame 一初始化 就有个设计好的图性界面
 }
 public void init(){//对图形化界面进行初始化,将图像界面和事件分离开来
  f= new Frame("my frame" );
  //frame进行基本设置
  f.setBounds(300,100,600,500);

  f.setLayout(new FlowLayout());
  but = new Button("mybutton");
  //将组件添加到组件frame
  f.add(but);
  //加载一下窗体上的事件 调用方法
  myEvent();
 //显示窗体
  f.setVisible(true);
 }
 private void myEvent(){//将事件和图形化界面分开
  f.addWindowListener(new WindowAdapter(){
   public void windowClosing(WindowEvent e){
    System.exit(0);
   } 
  });

  //让按钮具备退出程序的功能
  /*
  按钮就是事件源
  那么选择哪个监听器呢?
  通过关闭窗体实例了解到,想要知道哪个组件具备什么样的特有监听器
  需要查看该组件对象的功能
  通过查阅button的描述,发现按钮支持一个特有的监听器addActionListener
  注意:此ActionListener监听器是3个监听器中不需要适配器的接口 几乎监听器都有适配器 适配器中方法超过3的 
  注意;都有适配器 适配器干吗的 就是创建监听器对象用的 只需覆盖其中的需要的方法即可
  */
  //下面的活动监听器只有一个方法 将其覆盖即可
  but.addActionListener(new ActionListener(){
   public void actionPerformed(ActionEvent ae){
    System.out.println("按钮叫我退出");
    System.exit(0);
   }
  });
 }
 public static void main(String [] args){
  new FrameDemo();
 }

}
鼠标事件

鼠标事件:MouseEvent,鼠标按下、抬起、进入、移出等
import java.awt.*;
import java.awt.event.*;
class MouseAndKeyEvent
{
 private Frame f;
 private Button but;
 MouseAndKeyEvent(){
  init(); 
 }
 public void init(){
  f= new Frame("my frame" );
  f.setBounds(300,100,600,500);
  f.setLayout(new FlowLayout());
  but = new Button("mybutton");
  //将组件添加到组件frame
  f.add(but);
  //加载一下窗体上的事件 调用方法
  myEvent();
  //显示窗体
  f.setVisible(true);
 }
 private void myEvent(){//将事件单独写出来 和图形化界面分开
  f.addWindowListener(new WindowAdapter(){
   public void windowClosing(WindowEvent e){
    System.exit(0);
   }
  });
  but.addActionListener(new ActionListener(){
   public void actionPerformed(ActionEvent ae){
    System.out.println("action ok");
   }
  });
  but.addMouseListener(new MouseAdapter(){
   private int count = 1;
   private int clickCount =1;
   public void mouseEntered(MouseEvent me){
    System.out.println("鼠标进入组件"+count++);
   }   

   //注意 按钮添加事件时一般是活动事件 鼠标点击 键盘按都是活动事件
   //而鼠标事件只是更具体的事件 执行时先执行点击 再action活动  
 public void mouseClicked(MouseEvent me){
    System.out.println("点击动作"+clickCount++);
   }
  });
 }
 public static void main(String [] args){
  new MouseAndKeyEvent();
 }
}

10 键盘事件

键盘监听器有三个方法 肯定有键盘适配器 KeyAdapter
void keyPressed(KeyEvent e)   按下某个键时调用此方法
void keyReleased(KeyEvent e)  释放某个键时调用此方法
void keyTyped(KeyEvent e)     键入某个键时调用此方法

例子:
import java.awt.*;
import java.awt.event.*;
class MouseAndKeyEvent1
{
 private Frame f;
 private Button but;
 MouseAndKeyEvent1(){
  init(); 
 }
 public void init(){
  f= new Frame("my frame" );
  f.setBounds(300,100,600,500);
  f.setLayout(new FlowLayout());
  but = new Button("mybutton");
  //将组件添加到组件frame
  f.add(but);
  //加载一下窗体上的事件 调用方法
  myEvent();
  //显示窗体
  f.setVisible(true);
 }
 private void myEvent(){//将事件单独写出来 和图形化界面分开
  f.addWindowListener(new WindowAdapter(){
   public void windowClosing(WindowEvent e){
    System.exit(0);
   }   
  });
  but.addActionListener(new ActionListener(){
   public void actionPerformed(ActionEvent ae){
    System.out.println("action ok");
    //System.exit(0);
   }
  });
  but.addMouseListener(new MouseAdapter(){
   private int count = 1;
   private int clickCount =1;
   public void mouseEntered(MouseEvent me){
    System.out.println("鼠标进入组件"+count++);
   }
   //注意 按钮加事件时一般是活动事件 鼠标点击 键盘按都是活动事件
   //而鼠标事件只是更具体的事件 执行时先执行点击 再action活动
   public void mouseClicked(MouseEvent me){
    if(me.getClickCount()==2)
     System.out.println("双击动作"+clickCount++);
   }
  });
  //but按钮添加一个键盘监听
  but.addKeyListener(new KeyAdapter(){
   public void keyPressed(KeyEvent e){//摁下键 事件会封装按下什么键
    if(e.getKeyCode()==KeyEvent.VK_ENTER)
     System.exit(0);
    //还可以用组合键来结束 但是该KeyEvent事件没有组合键 找其父类 InputEvent 发现isControlDown ctl是否按下
    if(e.isControlDown() && e.getKeyCode()==KeyEvent.VK_ENTER){
     System.out.println("ctrl+enter is run");
    }
    System.out.println(e.getKeyChar()+"...."+e.getKeyCode());
    //注意:此处按钮必须是当前事件源才能键入 当前事件源就是按钮上有虚线
    //而且实际中输入是中文时没法键入 改为英文可以输入 字符可以输入 字符串显示不出
    System.out.println(KeyEvent.getKeyText(e.getKeyCode())+"...."+e.getKeyCode());
   }
  });
 }
 public static void main(String [] args){
  new MouseAndKeyEvent1();
 }
}

11 对话框 dialog
import java.awt.*;
import java.awt.event.*;
import java.io.*;
class MyWindowDemo3
{
 private Frame f;
 private TextField tf;
 private Button but;
 private TextArea ta;
 private Dialog d;//优化内存的话 应该写在该初始化的地方本段else中 这里为了代码好看
 private Label lab;
 private Button okBut;

 MyWindowDemo3(){
  init();
 }
 public void init(){  
  f = new Frame("my window");
  f.setBounds(300,100,600,500);
  f.setLayout(new FlowLayout());
  tf = new TextField(60);
  but = new Button("转到");
  ta = new TextArea(25,70);//参数是行 列 TextAreaString text)里面有一些文字初始化时
  //加上对话框
  d = new Dialog(f,"提示信息-self",true);//默认边界布局 true意思是该对话框在顶端 必须操作了该对话框才能操作窗体
  d.setBounds(400,200,240,150);
  d.setLayout(new FlowLayout());
  lab = new Label(); //因为不知道有什么信息所以没初始化信息
  okBut = new Button("确定");
  d.add(lab);
  d.add(okBut);
  //d不需要以初始化就显示 因为是提示信息的
  f.add(tf);
  f.add(but);
  f.add(ta);
  myEvent();
  f.setVisible(true);
 }
 private void myEvent(){
  f.addWindowListener(new WindowAdapter(){
   public void windowClosing(WindowEvent e){
    System.exit(0);
   }
  });
  //按钮是事件源 即操作文本框 又操作文本内容
  //tf没有获取的文本内容的方法 去其父类看TextComponent的方法 有增加文本内容方法
  but.addActionListener(new ActionListener(){//不能是鼠标点击 因为键盘按下也可以 所以用ActionEvent
   public void actionPerformed(ActionEvent e){  
    showDir();
   }
  } );
  d.addWindowListener(new WindowAdapter(){
   public void windowClosing(WindowEvent e){
    d.setVisible(false);//这里是对话框隐藏 不是退出程序 关闭不一定退出程序 
   }
  });
  //okBut的效果也是对话框隐藏 不是退出程序
  okBut.addActionListener(new ActionListener(){
   public void actionPerformed(ActionEvent e){
    d.setVisible(false);
   }
  });
  tf.addKeyListener(new KeyAdapter(){
   public void keyPressed(KeyEvent e){
    if (e.getKeyCode()==KeyEvent.VK_ENTER)
    {
     showDir();
    }
   }
  });
 }
 private void showDir(){
   String dirPath = tf.getText();   
   File dir = new File(dirPath);
   if (dir.exists() && dir.isDirectory())
   {
    ta.setText("");
    String [] names = dir.list();
    for(String name : names){
     //ta.setText(name+"\r\n");//这里会进一个名字会覆盖一个名字 可以考虑StringBuilder 但要先看其有没有对应方法
     ta.append(name+"\r\n");
    }
   }
   else{ 
    String info = "你输入的信息:"+dirPath+"是错误的。请重输入";
    lab.setText(info);
    d.setVisible(true);
   }
 }
 public static void main(String [] args){
  new MyWindowDemo3(); 
 }
}

12 菜单 Menu

MenuBar菜单栏或者菜单条
MenuBar 类封装绑定到框架的菜单栏的平台概念。为了将该菜单栏与 Frame 对象关联,可以调用该框架的 setMenuBar 方法。
Menu菜单
Menu 对象是从菜单栏部署的下拉式菜单组件。

MenuItem
菜单中的所有项必须属于类 MenuItem 或其子类之一。默认的 MenuItem 对象包含一个简单的加标签的菜单项。

菜单是支持键盘的操作的 所以用活动监听

import java.awt.*;
import java.awt.event.*;
class MyMenuDemo
{
 private Frame f;
 private MenuBar mb;
 private Menu m,subMenu;
 private MenuItem closeItem,subItem;
 MyMenuDemo(){
  init();
 }
 public void init(){
  f = new Frame("wwwindow");
  f.setBounds(300,100,500,600);
  f.setLayout(new FlowLayout());
  mb = new MenuBar();
  m = new Menu("文件");
  subMenu = new Menu("子菜单");
  subItem = new MenuItem("子条目");
  closeItem = new MenuItem("退出");
  subMenu.add(subItem);
  m.add(subMenu);
  m.add(closeItem);
  mb.add(m);
  f.setMenuBar(mb);
  myEvent();
  f.setVisible(true);
 }
 private void myEvent(){
  f.addWindowListener(new WindowAdapter(){
   public void windowClosing(WindowEvent e){
    System.exit(0);
   }
  });
  closeItem.addActionListener(new ActionListener(){
   public void actionPerformed(ActionEvent e){
    System.exit(0);
   }
  });
 }
 public static void main(String [] args){
  new MyMenuDemo();
 }
}

13  jar包双击执行

类多了,就要封装,可以将类放在一个包中,即在源码的开头加个包 package sun;

然后在dos命令行中输入javac -d f:\test MyTest.java,就可以发现F盘下test 出现了sun

然后切换到f盘下test 将sun打成jar:jar  -cvf  mytest.jar sun  将sun文件 打包成mytest.jar  但是发现双击是不能执行的

我们要通过配置文件告诉双击执行先执行Main-class

新建个文件,名字可以随便起 例如起个s.txt
Main-Class:(这里必须空格sun.MyTest(这里必须写回车)
空格原因 就是前后能形成键值对 要不就是无效的 会发生IO读取异常 无效头字段
回车原因 只有回车了才会默认是结束标志 配置是配不进去的
输入 jar -cvfm mytest.jar s.txt sun

注意:jar文件必须在本地注册过才能用
工具--〉文件夹选项--〉文件类型--〉新建--jar--〉选择图标--〉新建open--〉浏览bin目录javaw.exe

 

 

 

 

 

 

 


------- android培训java培训、期待与您交流! ----------

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
黑马程序员的tb_brand是指在JavaWeb基础教程中创建的一个表。这个表是用来存储品牌信息的,具体的表结构和数据类型需要和JavaBean类中的成员变量保持一致。\[1\]在这个教程中,使用了Maven来构建项目,并且使用了MyBatis作为持久层框架,通过配置pom.xml文件来引入相关依赖。\[2\] Maven是一个用于管理和构建Java项目的工具,它提供了一套标准化的项目结构、构建流程和依赖管理机制。\[3\] #### 引用[.reference_title] - *1* [【JAVAWEB开发】黑马程序员java web案例资料(含Element的删除与修改)](https://blog.csdn.net/aasd23/article/details/126940147)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [黑马程序员-MyBatis 框架-最全入门笔记、阿伟看了都得说真大、真细、真全!!!](https://blog.csdn.net/qq_57383364/article/details/128103058)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [JavaWeb——黑马程序员课程笔记](https://blog.csdn.net/King_ZACC/article/details/128573804)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值