Java 基础(三)
Java 基础(三)
目录
简述:
以下将会介绍Java中的图形用户界面程序设计的部分内容
back
窗体简述
窗体
在Java中,顶层的窗口就称为窗体,在AWT库中有一个叫Frame
的类,而在Swing
版本中,名叫JFrame
,其扩充了Frame
类,由系统绘制。
例如这个例子:
package Learn;
import javax.swing.*;
import java.awt.*;
import java.lang.reflect.InvocationTargetException;
public class SimpleTest {
public static void main(String[] args) {
try {
//使用了线程
EventQueue.invokeAndWait(()->{
SimpleFrame frame=new SimpleFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//窗体关闭按钮动作
frame.setVisible(true);
//窗体可见
});
} catch (InterruptedException | InvocationTargetException e) {
e.printStackTrace();
}
}
}
//窗体
class SimpleFrame extends JFrame{
private static final int DEFAULT_WIDTH=300;
private static final int DEFAULT_HEIGHT=200;
public SimpleFrame(){
setSize(DEFAULT_WIDTH,DEFAULT_HEIGHT);
}
}
下面我们对这个程序进行分析
Swing类位于javax.swing包中,因此需要进行引包。javax是java扩展包,不是核心包。
默认情况下,窗体的大小是 0 × 0 ,我们定一个了一个子类SimpleFrame
,构造器将窗口的大小设置为 300×200。
在main函数中,我们设置了让其可见以及定义用户关闭这个窗口时的响应动作,完全关闭。在默认情况下,仅仅会关闭该窗口,也就是隐藏,并不使其完全关闭。
如果仅仅是构造窗口,窗体是不会自动显示出来的,而为了显示窗体,main方法需要调用窗口的setVisiable
方法。
窗口有很多的属性,比如设置大小,设置位置,设置颜色,设置标题等等,下面将举例一些常用的方法,都是在JFrame中。
back
窗体常用方法
方法 | 作用 |
---|---|
boolean isVisiable() | 窗体是否可见 |
void setVisiable() | 设置窗体可见 |
void setSize(int width,int height) | 将组件的大小调整为给定的宽度和高度 |
void setLocation(int x,int y) | 将组件移动到一个新的位置。顶层组件使用屏幕坐标 |
void setBounds(int x,int y,int width,int height) | 移动并且调整组件大小 |
Dimension getSize() | 获取当前组件的size属性 |
void setSize(Dimension d) | 设置当前组件的size属性 |
boolean isResizable() | 是否可调整窗体的大小 |
void setResizable(boolean b) | 设置窗体是否可调整大小 |
String getTitle() | 获取窗体标题 |
void setTitle(String s) | 设置窗体标题 |
void setJMenuBar(JMenuBar bar) | 设置窗体的菜单栏 |
有了窗体,我们仅仅是能够看见东西,但是没有任何的组件,也没有任何的内容,连hello word都没有,当然,我们不适用hello word......
就因为这样,我们需要添加一些东西去里面
back
组件中显示信息
我们想添加一些东西进入窗体中,那么我们得使用add方法,是在窗体中使用的,就像这样
package Learn;
import javax.swing.*;
public class SimpleTest extends JFrame{
SimpleTest(){
add(new JTextField("we not use hello word"));
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(300,200);
setVisible(true);
}
public static void main(String[] args) {
new SimpleTest();
}
}
这样我们就在窗体中添加了一个文本框,并且把文本框初始化了一句信息
Component add(Component c)
这个语句是将一个给定的组件添加到该窗体的内容窗格中,并且返回这个组件(往往我们都忽略了这个东西)
了解了窗体的内容,那让我们去看看,窗体能够塞一些什么样的东西进去吧
back
组件
JButton按钮
这是一个按钮
其常用的方法有以下:
方法 | 作用 |
---|---|
JButton() | 构造方法,创建不带有图标或者文字的按钮 |
JButton(String str) | 构造方法,创建带有文字的按钮 |
JButton(Icon icon) | 构造方法,创建带有图标的按钮 |
--- | --- |
void setText(String str) | 设置按钮的名称 |
void setFont(Font font) | 设置按钮名称的字体 |
void setForeground(Color color) | 设置按钮的颜色,前景 |
void setEnable(Boolean boolean) | 设置按钮是否能够按动 |
void addActionListener(ActionListener listener) | 设置按钮的按动事件监听器 |
void removeActionListener() | 取消按钮的按动事件监听器 |
back
JTextField单行文本框(文本域)
创建一个单行的文本框,需要限定有多少列,不然默认0列
常用的方法有:
方法 | 作用 |
---|---|
JTextField() | 创建一个默认的文本框 |
JTextField(String str) | 创建一个带有文字的文本框 |
JTextField(int columns) | 创建一个有columns列的文本框 |
JTextField(String text,int columns) | 创建一个具有初始化信息的,并且具有columns列的文本框 |
--- | --- |
String getText() | 获取文本框的内容 |
void setText() | 设置文本框的内容 |
boolean isEditable() | 获取文本框是否可编辑信息 |
void setEditable(Boolean boolean) | 设置文本框是否可编辑信息 |
int getColumns() | 获取文本框使用的列数 |
void setColumns(int columns) | 设置文本框使用的列数 |
back
JTextArea文本区
这是创建一个文本区,拥有几行和几列的一个可写文本区
常用方法有:
方法 | 作用 |
---|---|
JTextArea() | 创建一个新的默认的文本区 |
JTextArea(String text) | 构造显示指定文本的文本区 |
JTextArea(int rows, int columns) | 构造显示指定行数,指定列数的文本区 |
JTextArea(String text, int rows, int columns) | 构造指定行数,指定列数,并且显示指定文字的文本区 |
--- | --- |
void append(String str)void append(String str) | 将字符串 str 添加到文本域的最后位置 |
void setColumns(int columns) | 设置文本域的行数 |
void setRows(int rows) | 设置文本域的列数 |
int getColumns() | 获取文本域的行数 |
int getRows() | 获取文本域的列数 |
void setLineWrap(boolean wrap) | 设置文本域的换行策略(是否到了所在的列数之后会自动换行) |
back
JLabel
这是一个标签,用于显示信息
JLabel类可以显示文本或图像。通过在显示区域中设置垂直和水平对齐来对齐标签的内容。默认情况下,标签在显示区域中垂直居中。
默认情况下,纯文本标签前沿对齐; 默认情况下,仅图像标签水平居中。
创建完的Label对象可以通过Container类中的add()方法,加入到容器中
常用方法:
方法 | 作用 |
---|---|
JLabel() | 创建一个JLabel对象 |
JLabel(String text) | 创建一个标签并制定文本内容,默认左对齐 |
JLabel(String text,int alignment) | 创建一个标签并制定文本内容以及对齐方式 |
JLabel(String text,Icon icon,int horizontalAlignment) | 创建具有指定文本,图像,水平对齐方式的JLabel对象 |
void setText(String text) | 设置标签的文本 |
String getText() | 获取标签文本 |
back
JPanel
JPanel类是一个通用的轻量级容器。
容器的目的就是容纳更多的东西
把我们所需要的组件往其中添加,然后再把容器添加到窗体,是一个很平常的做法
JPanel默认的布局管理器是FlowLayout,其自身可以嵌套组合,在不同子容器中可包含其他组件,如JButton、JTextArea、JTextField 等,功能是对窗体上的这些控件进行组合
常用方法:
方法 | 作用 |
---|---|
JPanel() | 使用双缓冲区和流布局创建新的JPanel |
JPanel(boolean isDoubleBuffered) | 使用FlowLayout和指定的缓冲策略创建新的JPanel |
JPanel(LayoutManager layout) | 使用指定的布局管理器创建新的缓冲JPanel |
JPanel(LayoutManager layout, boolean isDoubleBuffered) | 使用指定的布局管理器和缓冲策略创建新的JPanel |
--- | --- |
back
JScrollPane滚动面板
JScrollPane 内包含一个视口(ViewPort),表示 JScrollPane 的显示区域。视口内包含一个需要滚动显示的组件,称为视图。
其中,JScrollPane常使用的方法有:
方法 | 作用 |
---|---|
JScrollPane() | 创建默认的滚动面板 |
JScrollPane(Component view) | 初始构造具有组件的滚动面板,默认垂直滚动 |
JScrollPane(int vsbPolicy, int hsbPolicy) | 创建无组件,但具有滚动策略(垂直滚动策略(vsbPolicy),水平滚动策略(hsbPolicy))的滚动面板 |
JScrollPane(Component view, int vsbPolicy, int hsbPolicy) | 创建具有组件,并且设置滚动策略(垂直滚动策略(vsbPolicy),水平滚动策略(hsbPolicy)) |
--- | --- |
void setViewportView(Component view) | 设置滚动显示视图内容组件 |
void setVerticalScrollBarPolicy(int policy) | 设置垂直滚动条的显示策略 |
void setHorizontalScrollBarPolicy(int policy) | 设置水平滚动条的显示策略 |
void setWheelScrollingEnabled(boolean handleWheel) | 是否响应鼠标滚动事件,默认响应 |
滚动策略取值:
-
垂直滚动条(vsbPolicy)
-
ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED
需要时显示(默认)
-
ScrollPaneConstants.VERTICAL_SCROLLBAR_NEVER
从不显示
-
ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS
总是显示
-
水平滚动条(hsbPolicy)
-
ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED
需要时显示(默认)
-
ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER
从不显示
-
ScrollPaneConstants.HORIZONTAL_SCROLLBAR_ALWAYS
总是显示
package Learn;
import javax.swing.*;
public class SimpleTest extends JFrame{
SimpleTest(){
//为JTextArea添加滑动条
JScrollPane scrollPane=new JScrollPane(new JTextArea("we not use hello word"));
add(scrollPane);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(300,200);
setVisible(true);
}
public static void main(String[] args) {
new SimpleTest();
}
}
back
菜单
- JMenuBar 菜单栏
- JMenu 菜单栏上的一级菜单(也可以做二级菜单等)
- JMenuItem 一级菜单下面的一个子菜单
这三个东西,都是成群使用的,
JMenuBar的用法
方法 | 作用 |
---|---|
JmenuBar() | 构建一个默认的菜单栏 |
JMenu的方法
方法 | 作用 |
---|---|
JMenu(String label) | 用给定的标签构造一个菜单 |
JMenuItem add(JMenuItem item) | 添加一个菜单项(或一个菜单) |
JMenuItem add(String lable) | 用给定标签将一个菜单项添加到菜单中,并且返回这个菜单项 |
JMenuItem add(Action a) | 用给定的动作将一个菜单项添加到菜单中,并返回这个菜单项 |
void addSeparator() | 添加一个分隔符行 |
JMenuItem insert(JMenuItem menu,int index) | 将一个新菜单项(或子菜单)添加到菜单的指定位置 |
JMenuItem insert(Action a,int index) | 用给定动作在菜单的指定位置添加一个新菜单项 |
void insertSeparator(int index) | 添加一个分隔符到菜单指定位置中 |
void remove(index) | 删除指定位置的菜单项 |
void remove(JMenuItem item) | 删除指定对象的菜单项 |
JMenuItem的方法
方法 | 作用 |
---|---|
JMenuItem() | 创建没有文本或图标的JMenuItem |
JMenuItem(Action a) | 创建一个菜单项,其属性取自指定的Action |
JMenuItem(Icon icon) | 创建菜单项,使用指定的图标创建JMenuItem |
JMenuItem(String text) | 创建菜单项,使用指定的文本创建JMenuItem |
JMenuItem(String text, Icon icon) | 创建菜单项,使用指定的文本和图标创建JMenuItem |
当你申请了JMenuBar之后,做好一切之后,还需要把菜单栏添加到窗体的顶部的位置。这个时候应该使用setJMenuBar()方法,把你刚刚创建的菜单栏添加进去
例子:
package Learn;
import javax.swing.*;
public class SimpleTest extends JFrame{
SimpleTest(){
JMenuBar jMenuBar=new JMenuBar();
JMenu menu=new JMenu("帮助");
JMenuItem item=new JMenuItem("版本");
menu.add(item);
jMenuBar.add(menu);
setJMenuBar(jMenuBar);
add(new JTextField("we not use hello word"));
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(300,200);
setVisible(true);
}
public static void main(String[] args) {
new SimpleTest();
}
}
back
布局
BorderLayout布局(边界布局)
BorderLayout(边框布局管理器)是 Window、JFrame 和 JDialog 的默认布局管理器。边框布局管理器将窗口分为 5 个区域:
- North
- South
- East
- West
- Center
其中
- North 表示北,将占据面板的上方
- Soufe 表示南,将占据面板的下方
- East表示东,将占据面板的右侧
- West 表示西,将占据面板的左侧
- 中间区域 Center 是在东、南、西、北都填满后剩下的区域
其构造方法有:
方法 | 作用 |
---|---|
BorderLayout() | 创建一个 Border 布局,组件之间没有间隙 |
BorderLayout(int hgap,int vgap) | 创建一个 Border 布局,其中 hgap 表示组件之间的横向间隔;vgap 表示组件之间的纵向间隔,单位是像素 |
back
FlowLayout布局(流式布局)
- FlowLayout(流式布局管理器)是
JPanel
和JApplet
的默认布局管理器。
FlowLayout 会将组件按照从上到下、从左到右的放置规律逐行进行定位。与其他布局管理器不同的是,FlowLayout 布局管理器不限制它所管理组件的大小,而是允许它们有自己的最佳大小
其构造方法有:
方法 | 作用 |
---|---|
FlowLayout() | 创建一个布局管理器,使用默认的居中对齐方式和默认 5 像素的水平和垂直间隔 |
FlowLayout(int align) | 创建一个布局管理器,使用默认 5 像素的水平和垂直间隔,并且设置对齐方式 |
FlowLayout(int align, int hgap,int vgap) | 创建一个布局管理器,其中 align 表示组件的对齐方式;hgap 表示组件之间的横向间隔;vgap 表示组件之间的纵向间隔,单位是像素 |
back
GridLayout布局(网格布局)
GridLayout(网格布局管理器)为组件的放置位置提供了更大的灵活性。它将区域分割成行数(rows)和列数(columns)的网格状布局,组件按照由左至右、由上而下的次序排列填充到各个单元格中。
其构造方法有:
方法 | 作用 |
---|---|
GridLayout(int rows,int cols) | 创建一个指定行(rows)和列(cols)的网格布局。布局中所有组件的大小一样,组件之间没有间隔 |
GridLayout(int rows,int cols,int hgap,int vgap) | 创建一个指定行(rows)和列(cols)的网格布局,并且可以指定组件之间横向(hgap)和纵向(vgap)的间隔,单位是像素 |
其他不进行一一讲述......有兴趣参考:--->这是网站连接<---
back
事件监听器
在JavaAWT中,事件源有一些方法,允许注册事件监听器,这些对象会对事件做出所需的响应
所有的事件对象都派生于java.util.EventObject类。每个事件类型还有子类。
AWT事件处理机制概要说明:
- 事件监听器是一个实现了监听器接口(listener interface),也就是
ActionListener
的类的实例 - 事件源对象能够注册监听器对象并向其发送事件对象
- 当事件发生时,事件源将事件对象发送给所有注册的监听器
- 监听器对象再使用事件对象中的信息决定如何对事件做出响应
要实现ActionListener
接口,必须有一个名为actionPerformed
的方法,该方法接收一个ActionEvent
作为参数
也就是
//重写方法
public void actionPerformed(ActionEvent e) {
//something here
}
如何知道是哪个发出的事件呢?
在这个形参ActionEvent e
中,可以用其方法,去知道这是哪个组件发出的
- Object getSource() 这个方法返回的是一个Object类,很高兴,你又得用instanceof关键字去判断这个类属于什么了
- String getActionCommand( )这个方法返回的是一个String类型的字符串,其内容是你最初定义的时候,给这个组件设定的字符串值。
主要是以上两种方法,从而可以识别是哪个部件发出的指令。我习惯于第二种。
实现了actionPerformed
方法,但是你的部件并没有设置监听器,所以说你的部件还只是看一下,按上去完全不会动,也不会响应任何东西
这个时候,应该对部件,调用方法,addActionListener(ActionListener l)
,对其添加事件监听器,而其中的参数,是一个实现了ActionListener
的接口的类
例:
package Learn;
import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class SimpleTest extends JFrame implements ActionListener {
SimpleTest(){
JButton btn=new JButton("测试");
btn.addActionListener(this);//添加事件监听器
add(btn);//添加组件到窗口
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//设置关闭按钮作用
setSize(300,200);//设置窗体大小
setVisible(true);//设置窗体是否可见
}
public static void main(String[] args) {
new SimpleTest();
}
//实现了ActionListener接口,就应该实现里面的方法
@Override
public void actionPerformed(ActionEvent e) {
if("测试".equals(e.getActionCommand())){
//这里是一个弹出的对话框
JOptionPane.showMessageDialog(null,"你好");
}
}
}
back
- 借鉴《Java核心技术卷一》
- 借鉴 http://c.biancheng.net/view/1212.html
如果转载,请标明出处