学习目标:
会使用Java做一些简单的页面设计
学习内容:
一.窗体形容器
java的图形界面中,容器是用来存放 按钮,输入框等组件的。
窗体型容器有两个,一个是JFrame,一个是JDialog。
- JFrame:最常用的窗体型容器,默认情况下,在右上角有最大化最小化按钮
用法:JFrame f = new JFrame("新建窗口");
基本设置:
方法 | 解读 |
---|---|
f.setTitle(“新建窗口”); | 主窗体设置标题 |
f.setSize(400, 300); | 主窗体设置大小(宽,高) |
f.setLocation(200, 200); | 主窗体设置位置(以屏幕右上角为原点的X,Y) |
f.setLayout(null); | 主窗体中的组件设置为绝对定位 |
f.add(b); | 把组件(b)加入到主窗体中 |
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); | 关闭窗体的时候,退出程序 |
f.setVisible(true); | 让窗体变得可见 |
- JDialog:也是窗体型容器,右上角没有最大和最小化按钮
用法与JFrame一样,也可以根据外部窗体实例化JDialogJDialog d = new JDialog(f);
将JDialog设置为模态:d.setModal(true);
当一个对话框被设置为模态的时候,其背后的父窗体,是不能被激活的,除非该对话框被关闭
基本设置与JFrame一样
二.面板
面板和JFrame一样都是容器,不过面板一般用来充当中间容器,把组件放在面板上,然后再把面板放在窗体上。
一旦移动一个面板,其上面的组件,就会全部统一跟着移动,采用这种方式,便于进行整体界面的设计。
创建面板(例):JPanel p = new JPanel();
-
JPanel:基本面板
-
ContentPane :JFrame上的一层面板
平时通过f.add()向JFrame增加组件,其实是向JFrame上的 ContentPane加东西 -
SplitPanel :水平面板
创建一个水平JSplitPane,左边是pLeft,右边是pRight:
JSplitPane sp = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, spLeft, spRight);
-
JScrollPanel :带滚动条的面板
两种方式:
1)在创建时,把组件作为参数传进去:JScrollPane sp = new JScrollPane(ta);
2)希望显示其他组件的时候,调用setViewportView:sp.setViewportView(ta);
-
TabbedPanel :
JTabbedPane tp = new JTabbedPane();
-
CardLayerout:与TabbedPanel相似
JComboBox<String> cb = new JComboBox<>(字符串);
三.布局器
-
绝对定位:指不使用布局器,组件的位置和大小需要单独指定
-
FlowLayout:顺序布局器,容器上的组件水平摆放,无需单独指定大小和位置
f.setLayout(new FlowLayout());
-
BorderLayout:容器上的组件按照上北 下南 左西 右东 中的顺序摆放
f.setLayout(new BorderLayout());
-
GridLayout:网格布局器
f.setLayout(new GridLayout());
-
setPreferredSize:向布局器建议该组件显示的大小
组件名.setPreferredSize(new Dimension(宽,高));
四.组件
关键字 | 简介 |
---|---|
JLabel | 标签 |
setIcon | 使用JLabel显示图片 |
JButton | 按钮 |
JCheckBox | 复选框 |
JRadioButton | 单选框 |
ButtonGroup | 按钮组 |
JComboBox | 下拉框 |
JOptionPane | 对话框 |
JTextField | 文本框 |
JPasswordField | 密码框 |
JTextArea | 文本域 |
JProgressBar | 进度条 |
JFileChooser | 文件选择器 |
五.事件监听
关键字 | 简介 |
---|---|
ActionListener | 按钮监听 |
KeyListener | 键盘监听 |
MouseListener | 鼠标监听 |
Adapter | 适配器 |
监听一般通过匿名类实现:
例:
// 给按钮 增加 监听
按钮名.addActionListener(new ActionListener() {
// 当按钮被点击时,就会触发 ActionEvent事件
// actionPerformed 方法就会被执行
public void actionPerformed(ActionEvent e) {
方法体
}
});
另:
-
键盘监听器: KeyListener
keyPressed 代表 键被按下
keyReleased 代表 键被弹起
keyTyped 代表 一个按下弹起的组合动作
KeyEvent.getKeyCode() 可以获取当前点下了哪个键 -
鼠标监听器:MouseListener
mouseReleased 鼠标释放
mousePressed 鼠标按下
mouseExited 鼠标退出
mouseEntered 鼠标进入
mouseClicked 鼠标点击 -
鼠标监听适配器:MouseAdapter
一般说来在写监听器的时候,会实现MouseListener。
但是MouseListener里面有很多方法实际上都没有用到,比如mouseReleased ,mousePressed,mouseExited等等。
这个时候就可以使用 鼠标监听适配器,MouseAdapter 只需要重写必要的方法即可。
六.菜单
菜单栏: JMenuBar mb = new JMenuBar();
菜单项:JMenu m1 = new JMenu("菜单项1");
把菜单加入到菜单栏:mb.add(m1);
七.工具栏
工具栏:JToolBar tb = new JToolBar();
然后往工具栏里面add工具就行了
八.表格
-
基本表格:
JTable t = new JTable(内容, 标题);
显示一个Table需要两组数据
(1)一维数组:String[] 标题
表示表格的标题
(2)二维数组:String[][] 内容
表格中的内容
默认情况下,表格的标题是不会显示出来了 -
带滚动条的Panel:JScrollPane
把table放进去就可以看到table的title,如果数据够多就会看到滚动条
表格使用TableModel可以和数据库连接起来!
使用selection监听器来监听table的哪个条目被选中: t.getSelectionModel().addListSelectionListener(...)
九.Swing中的线程
1.初始化线程
为了避免主线程和时间调度线程同时访问组件,需要在主线程中加入如下代码保证同时只有事件调度线程访问组件等内容:
EventQueue.invokeLater(new Runnable() {
public void run() {
new TestFrame().setVisible(true);
}
});
2.事件调度线程
以 按钮监听 中的代码为例,ActionListener.actionPerformed 中的代码,就是事件调度线程执行的。
事件调度线程是单线程的。因为 Swing里面的各种组件类都不是线程安全的,这就意味着,如果有多个线程,那么同一个JTextField的setText方法,可能会被多个线程同时调用,这会导致同步问题以及错误数据的发生。
3.长耗时任务线程
有时候需要执行长耗时任务,比如数据库查询,文件复制,访问网络等等。
而这些操作一般都会在事件响应后发起,就会自动进入事件调度线程。 而事件调度线程又是单线程模式,其结果就会是在执行这些长耗时任务的时候,界面就无响应了。
为了解决这个问题,Swing提供了一个SwingWorker类来解决。 SwingWorker是一个抽象类,为了使用,必须实现方法 doInBackground,在doInBackground中,就可以编写我们的任务,然后执行SwingWorker的execute方法,放在专门的工作线程中去运行。
SwingWorker worker = new SwingWorker() {
protected Object doInBackground() throws Exception {
//长耗时任务
return null;
}
};
worker.execute();
总结:还挺好玩的!
学习时间:
4天