图形界面(Java)
1.JFrame 的作用是什么?
public class Main {
public static void main(String[] args) {
JFrame jf = new JFrame("hello JFrame");
//设置窗口在关闭时,程序的响应
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jf.setSize(200,200); //设置窗口大小
jf.setVisible(true); //是否可见
//为窗口添加一个标签
JLabel lable = new JLabel(); //创建 JLabel 对象
lable.setText("hello this id one lable"); //设置标签文本
jf.add(lable); //把标签加到 jframe 中
}
}
以上代码中的 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE) 方法是必须要调用的,否则默认情况下,视窗关闭时是不会结束程序的
- JFrame 是 Swing 创建视窗的一个基础类,它像一个容器一样,可以包含其它的组件,是其它组件依赖生存的对象,使用步骤:
- 用 new 语句创建 JFrame 对象,可以通过构造方法传入视窗标题参数
- 设置窗口关闭时的行为,一般是结束进程
- 设置视窗的外观,例如,尺寸、可见与否等
- 为窗口中添加其它组件,例如,标签、按钮等
- 必要时还可以添加一些事件,例如,WindowListener 等
如何创建一个按钮
-
在 Swing 中,创建一个按钮需要使用 JButton 类,按钮的文本可以通过 JButton 的构造方法提供(按钮的表面不仅可以写文字,还可以显示各种图形)
public class HelloJButton { public static void main(String[] args){ JFrame jf = new JFrame("hello swing"); //设置窗口关闭时,程序的响应 jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); jf.setSize(500,500); jf.setVisible(true); jf.setLayout(new FlowLayout()); //设置布局格式 //为窗口添加一个按钮 JButton btn = new JButton("my button"); //创建一个按钮对象 jf.add(btn); } }
如果没有设置页面布局格式,JFrame 是无法直接加入 JButton 组件的,即调用了 add() 方法,界面也是空的
-
在 Swing 程序中,一般使用 JButton 类来定义按钮事件:
- 用 new 语句创建 JButton 对象,可以通过构造方法传入文本参数
- 把创建好的 JButton 对象加入到容器组件中
如何使用文本输入组件
-
根据文本输入的长度不同,一般可以分为文本框和文本域两种文本输入组件。Swing 提供了 JTextField 来对文本框提供支持,用 JTextArea 来表示一个文本框
-
JTextField 代表的是只能单行输入的文本组件,与按钮类似
public class helloJTextField { public static void main(String[] args){ JFrame jf = new JFrame("heelo Text"); jf.setLayout(new FlowLayout()); //为窗口添加一个文本框 JTextField jtf = new JTextField(10); jtf.setText("初始化内容"); jf.add(jtf); showMe(jf); } private static void showMe(JFrame jf){ jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); jf.setSize(500,500); jf.setVisible(true); } }
-
JtextArea 允许多行输入,用户在 JtextArea 中按 enter 键的时候,字符就会出现换行
public class HelloJTextAra { public static void main(String[] args){ JFrame jf = new JFrame("hello Text"); jf.setLayout(new FlowLayout()); //为窗口添加文本域 JTextArea ja = new JTextArea(5,5); //创建一个5行5列的文本域对象 ja.setText("初始化内容"); jf.add(ja); showMe(jf); } private static void showMe(JFrame jf){ jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); jf.setSize(500,500); jf.setVisible(true); } }
-
-
JTextField 组件在创建对象的时候,一般需要提供长度参数。JTextArea 组件在创建过程中提供的是长度和高度两个参数
如何捕获事件
-
什么是事件?就是一个对象(A)的状态改变时,通知其它对象(B)发生了这么一件事,让它做出某种反应。在 Swing 编程的过程中,一般是通过一下步骤使用事件模型:
-
创建组件对象
-
创建实现了监听器接口或者继承自适配器类的实现类,实现需要进行相应动作的抽象方法
-
调用组件对象的 addXXXListener() 方法,为组件添加监听器
public class HelloEvent { //创建文本对象框 private static JTextField text = new JTextField(10); public static void main(String[] args){ JFrame jf = new JFrame("hello event"); jf.setLayout(new FlowLayout()); //为窗口添加一个文本框 jf.add(text); //为窗口添加一个按钮 JButton btn = new JButton("my button"); jf.add(btn); btn.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e){ HelloEvent.text.setText("按钮被点击了"); } }); //添加事件 showMe(jf); } private static void showMe(JFrame jf){ jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); jf.setSize(500,500); jf.setVisible(true); } }
-
布局控制
-
在 Swing 中,常用的布局管理器包括:BorderLayout、FlowLayout 和 GridLayout
BorderLayout 的几种方位变量 变量 说明 BorderLayout.NORTH 上端 BorderLayout.SOUTH 下端 BorderLayout.WEST 左端 BorderLayout.EAST 右端 BorderLayout.CENTER 中间 使用 BorderLayout 进行布局
public class HelloBorderLayout { public static void main(String[] args){ JFrame jf = new JFrame("hello BorderLayout"); jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); jf.setSize(500,500); jf.setVisible(true); jf.setLayout(new BorderLayout()); //设置布局格式 jf.add(new JButton("east"),BorderLayout.EAST); //东部 jf.add(new JButton("center"),BorderLayout.CENTER); //中间 jf.add(new JButton("south"),BorderLayout.SOUTH); //南部 jf.add(new JButton("north"),BorderLayout.NORTH); //北部 jf.add(new JButton("west"),BorderLayout.WEST); //西部 } }
-
BorderLayout 是 Swing 容器的默认布局管理器,它的含义是采用东、南、西、北、中5个方位来进行布局,可以分别往这些方位上放置组件,使用 add() 方法
-
FolwLayout 的含义是把组件从左往右的排列,当排列不能排以后就换到下一排
使用 FlowLayout 进行布局
public class HelloFlowLayout { public static void main(String[] args){ JFrame jf = new JFrame("hello FlowLayout"); jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); jf.setSize(600,600); jf.setVisible(true); jf.setLayout(new FlowLayout()); for(int i=0;i<10;i++){ jf.add(new JButton(i+"")); } } }
-
当某种容器需要放置该布局管理器时,只需要调用 setLayout() 方法,传入一个 FlowLayout 对象即可,在加入组件的时候,直接调用 add() 方法,不需要指定其它参数
-
GridLayout 是一种表格式的布局管理器,它把组件按照表格的方式来存放,从第一行到最后一行,从第一列到最后一列的摆放加入的组件。GridLayout 布局会填满整个容器,当容器变大时,表格也会变大
GridLayout 布局使用
public class HelloGridLayout { public static void main(String[] args){ JFrame jf = new JFrame("hrllo GridLayout"); jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); jf.setSize(500,500); jf.setVisible(true); GridLayout grid = new GridLayout(10,10); jf.setLayout(grid); for(int i=0;i<100;i++){ jf.add(new JButton(""+i)); } } }
事件模型
常见事件的监听器、事件类型、添加和取消事件注册方法
监听器、事件 | 添加和取消方法 | 支持该事件的常用组件 |
---|---|---|
ActionEvent ActionListener |
addActionListener() removeActionListener() |
JButton、JList、JMenuItem |
KeyEvent KeyListener |
addKeyListener() removeKeyListener() |
几乎所有组件 |
MouseEvent MouseListener |
addMouseListener() removeMouseListener() |
几乎所有组件 |
WindowEvent WindowListener |
addWindowListener() removewindowListener() |
Window 及其子类,JDiaiog、Jframe |
TextEvent TextListener |
addTextListener() removeTextListener() |
文本输入组件,JTextField、JTextArea |
- 尽管 Swing 的事件类型比较多,但是它们都有一个通用的使用和定义规则,主要有以下几点:
- 组件都有 addXXXlistener() 和 removeXXXlistener() 方法,XXX 就代表了事件的类型和含义
- XXX 事件的监听器类型叫做 XXXListener
- XXX 事件的类名叫做 XXXEvent,它往往作为 XXXListener 接口方法中的参数类型
监听器的适配器作用是什么?
public class HelloKevent {
public static void main(String[] args){
JFrame jf = new JFrame("hello event");
jf.setLayout(new FlowLayout());
JTextField jtf = new JTextField(15);
jf.add(jtf);
jtf.addKeyListener(new KeyAdapter(){ //添加监听器
public void keyPressed(KeyEvent e){
System.out.println(e.getKeyChar()+"pressed"); //实现
}
});
showMe(jf);
}
private static void showMe(JFrame jf){
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jf.setSize(500,500);
jf.setVisible(true);
}
}
- 在 Java 开发领域,有一种开发模式叫做适配器开发模式,Swing 的适配器正是采用了这种模式开发,为了避免代码的冗余,Swing 监听器的适配器就是为一些监听器接口的方法提供默认的空实现,这样开发者就可以直接继承自适配器就好,不必把每个接口都实现