Swing基础
Swing基础
JFrame
JPanel
绘图:paint
监听事件: ActionListener KeyListener
Listener和Adapter
计时器:Timer TimerTask
schedule
timer.cancel();
什么是Swing
Swing是JDK提供的一整套 GUI(Graphical User Interface)图形用户界面API。通过Swing可以构建平台无关的桌面应用程序。
JFrame
JFrame用于封装窗体,一个JFrame对象用于实现一个窗体,创建窗口,包含边框、标题和用于关闭和图标化窗口的按钮;
实际应用中,通常采用继承JFrame的方式,定义自己的窗体。
JPanel
JPanel对象表示“面板”, 用于将较小的轻量级组件组合在一起; JFrame 有一个用于盛放组件的“内容面板”,通常可以将其设置为JPanel对象。
组件
添加常用组件
在Swing中,按钮、文本框、标签等都有特定的类与之对应,称之为“组件”;想将其添加到容器中,需要通过调用容器(JFrame或JPanel)的add方法。
组件添加到容器时,其位置与容器的布局设置有关
class LoginFrame extends JFrame{
public LoginFrame(){
this.setSize(350, 220);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel panel=new JPanel();//创建空白面板
panel.setBackground(Color.blue);
this.add(panel);//将面板添加到窗口里面
//创建3个对象 将3个对象添加到面板
JLabel label =new JLabel("姓名");
JTextField name = new JTextField(20);//字符数
JButton login =new JButton("登录");
panel.add(label);
panel.add(name);
panel.add(login);
}
}
Graphics绘图
绘图原理
任何JComponent的扩展组件均可以进行绘制,想实现绘制必须重写paint方法;对于任何情况的窗口重绘事件,处理器都会通告组件,引发执行所有组件的paint方法,但有一点需要注意的是,paint方法一定不能自己调用,当窗口重绘时(如:窗口扩大,缩小,第一次显示时等)系统会自动调用。
paint方法只有一个Graphics参数,封装了各种绘制操作,可以将其简单的理解为“画笔”;该画笔由系统创建,在调用paint方法时传入,作为程序员可调用该“画笔”对象的各种方法实现绘制;
Graphics对象的度量单位是像素,坐标(0,0)为容器的左上角点。
class StagePanel extends JPanel{
public void paint(Graphics g){
g.setColor(Color.BLACK);
g.fillRect(0, 0, getWidth(), getHeight());
}
}
事件监听
1. 回调模式
回调模式是指:如果一个方法的参数是接口类型,则在调用该方法时,需要创建并传递一个实现此接口类型的对象;而该方法在运行时会调用到参数对象中所实现的方法(接口中定义的)。
interface Action {
public void doSth();
}
class 类{
public static void main(String[] args) {
repeat(5, new Action() {
public void doSth() {
System.out.println("Hello, World");
}
});
}
public static void repeat(int n, Action action) {
for (int i = 0; i < n; i++) { action.doSth(); }
}
}
如上的代码中,repeat方法需要一个Action接口类型的参数,其逻辑为将此参数的doSth方法重复执行n次。在调用时,通过内部匿名类传递参数,此处的语义可解释为:通过接口回调传递了一个方法给repeat,让repeat将其执行5次
2. 事件监听机制
事件监听可以看成是回调模式在Swing组件响应用户事件中的应用。
3. ActionListener
ActionListener一般用于监听表示要开始某种操作的事件,如:按钮上的单击,文本框中输入回车等。参见下面的代码:
public interface ActionListener extends EventListener {
public void actionPerformed(ActionEvent e);
}
JButton button = new JButton();
button.addActionListener (new ActionListener() {
public void actionPerformed (ActionEvent e) {
JButton button = (JButton) e.getSource();
button.setText("Don't click me!");
}});
其中,actionPerformed方法用于实现处理Action事件的操作其参数ActionEvent用于封装Action事件的信息,它的getSource方法可以获取产生该事件的事件源对象。
4. KeyListener
KeyListener用于监听键盘事件,其中包括键按下、键释放以及键入(必须确保有Unicode字符的产生,例如组合键将不会产生键入事件)的事件。代码如下:
public interface KeyListener extends EventListener {
public void keyTyped(KeyEvent e);
public void keyPressed(KeyEvent e);
public void keyReleased(KeyEvent e);
}
其中,KeyEvent的getKeyCode()方法用于获得所按下(释放)的键值,可以和KeyEvent所封装的形如VK_XX比对以确定所按下的键。
5. 监听Listener和Adapter
有些场合,仅仅需要响应Listener的某些方法,但作为实现Listener接口的对象又不得不实现其所有的方法,尽管某些方法只提供空的实现。JDK对某些Listener提供了相应的所谓Adapter,即实现了该Listener接口,而所有方法都为空实现的抽象类。在实践中,只需继承该抽象类,重写需要的方法即可。
代码如下:
this.addKeyListener(new KeyAdapter() {
public void keyPressed(KeyEvent e) {
int key = e.getKeyCode();// [c]
if (key == KeyEvent.VK_Q) {//Q表示退出
System.exit(0);// 结束Java进程
}
if (pause) {// pause = true
if (key == KeyEvent.VK_C) {//C表示继续
continueAction();
repaint();
}
return;
}
switch (key) {
case KeyEvent.VK_LEFT:
//tetromino.moveLeft();
moveLeftAction();
break;
case KeyEvent.VK_SPACE :
hardDropAction();
break;
case KeyEvent.VK_UP:
rotateRightAction();
break;
case KeyEvent.VK_P://按键盘上的P表示暂停
pauseAction();
break;
}
repaint();// 再画一次!
}
});
定时器
Timer和TimerTask
JDK提供的Timer类和TimerTask抽象类可以以固定的周期运行某段程序。
schedule (TimerTask task, long delay,long period) 几个参数(任务,延迟时间,间隔时间)
Timer 老婆 TimerTask 老婆命令
timer.cancel();
匿名内部类 在使用外部方法中的局部变量的时候 变量必须用final修饰
不知道怎么用修饰词的时候 要用private 尽可能封装
public class Demo02 {
/**
* @param args
*/
public static void main(String[] args) {
final Timer timer =new Timer();
//局部内部类 在方法中有效
class MyTask extends TimerTask{
public void run(){
System.out.println("吃大餐");
}
}
timer.schedule(new MyTask(), 1000, 500);
/*匿名类/局部内部类 访问外部方法中的局部变量
* 这个变量必须是final类型的 否则编译错误
*/
TimerTask overTask = new TimerTask(){
public void run(){
timer.cancel(); //把timer上的绑定的任务取消
}
};
timer.schedule(overTask, 1000*10);
}
}
Swing基础的更多相关文章
- Swing基础知识
1 http://zxc8899.iteye.com/blog/1556094 最基本的组件 2 http://zhangjunhd.blog.51cto.com/113473/128174 布局管 ...
- Swing:LookAndFeel 教程第一篇——手把手教你写出自己的 LookAndFeel
本文是 LookAndFeel 系列教程的第一篇. 是我在对 Swing 学习摸索中的一些微薄经验. 我相信,细致看全然系列之后.你就能写出自己的 LookAndFeel. 你会发现 Swing 原来 ...
- java使用方法总结
第一章 字符串 . 获取字符串的长度: length() . 判断字符串的前缀或后缀与已知字符串是否相同 前缀 startsWith(String s) .后缀 endsWith(String s) ...
- 【转】O'Reilly Java系列书籍建议阅读顺序(转自蔡学庸)
Learning Java the O'Reilly's Way (Part I) Java 技术可以说是越来越重要了,不但可以用在计算机上,甚至连电视等家电用品,行动电话.个人数字助理(PDA)等电 ...
- java程序设计----学生基本信息管理系统
1. 团队课程设计博客链接 http://www.cnblogs.com/hyy786030686/p/7063890.html 2. 个人负责模块或任务说明 --登录界面的设计 --用户名和密码验证 ...
- Java中的常用方法
Java中的常用方法 第一章 字符串 1.获取字符串的长度:length() 2.判断字符串的前缀或后缀与已知字符串是否相同 前缀 startsWith(String s).后缀 endsWit ...
- 黑马程序员_Java基础:多功能小窗口,swing,io,net综合应用
------- android培训.java培训.期待与您交流! ---------- 概念原理的理解,不代表能熟练应用. 如果将多个知识点关联并应用起来,这能加快我们对知识的掌握. 作为一个初学者, ...
- 【Swing】图形用户界面基础
前言 简单总结一下图形用户界面(Graphical User Interface)的相关基础,如GUI的基本元素:窗口,以及介绍Java中的图形界面开发设计的技术. 图形用户界面 图形用户界面就是以图 ...
- java基础 swing编程实战
1. 实现金山词霸,点击左右收缩 效果图: exmaple code : /* * 词霸 * */ package demo7; import java.awt.*; import java.awt. ...
随机推荐
- Select的深入应用(2)
首先创建两张表. 全连接 全连接:在检索时指定多个表,将每个表用逗号分隔,这样每个表的数据行都和其他表的每行交叉产生所有可能的组合,这样就是一个全连接.所有可能的组和数即每个表的行数的乘积. 或者: ...
- 洛谷P1827 美国血统 American Heritage
P1827 美国血统 American Heritage 54通过 90提交 题目提供者JOHNKRAM 标签USACO 难度普及- 提交 讨论 题解 最新讨论 暂时没有讨论 题目描述 农夫约翰非 ...
- ZoneMinder配置与使用
ZoneMinder是一套基于Linux操作系统的摄像机的视像数据监控的应用软件.应用范围广泛,包括商业或家居防盗等.ZoneMinder支持单一或多台视像镜头应用,包括摄取.分析.记录.和监视来源, ...
- ansible 访问内网服务器
ssh https://medium.com/@paulskarseth/ansible-bastion-host-proxycommand-e6946c945d30#.rauzlfv0z http: ...
- Bootstrap布局
浮动 1.pull-left:左浮动;pull-right:右浮动;清除浮动:clearfix
- Linux:两台服务器之间添加信任关系,进行远程操作的时候不需要输入密码
两台机器之间建立信任关系的步骤: 1. 在机器1上root用户执行ssh-keygen命令,生成建立安全信任关系的证书,直接Enter [root@CentOS64-x64 ~]# ssh-keyge ...
- 对apply和call的理解
存在的原因: call和apply是为了动态改变this而出现的,当一个object没有某个方法,但是其他的有,我们可以借助call或apply用其它对象的方法来操作. call 和 apply 都是 ...
- 【转】Linux模式设计5-位图操作
通过位图提供的两种状态可以在非常节约内存的情况下表示开关变量,并且同类这类变量可以紧凑而高效的统一进行处理.有很多内核子系统都需要位图的支持,但是不同的情况又需要不同的位图个数,比如SMP系统上的CP ...
- 软件工程 speedsnail 第二次冲刺8
20150525 完成任务:障碍物整体设计,实现一页多次布局: 遇到问题: 问题1 与现有资源冲突 解决1 未解决 明日任务: 蜗牛碰到线后速度方向的调整:(做优化)
- [译]Memory Reordering Caught in the Act
原文:http://preshing.com/20120515/memory-reordering-caught-in-the-act/ 编写lock-free的C/C++程序时,在保证memory ...