当前位置: 首页 > news >正文

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();// 再画一次!
            }
        });

 

 定时器
TimerTimerTask

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);
    }

}

 

转载于:https://www.cnblogs.com/manue1/p/4480943.html

相关文章:

  • php post
  • poj--1517
  • Midas Civil的钢束生成器
  • 练习写一个工资结算系统
  • linux的各个子系统
  • 域名注冊以及域名解析设置
  • 约瑟夫环实现之非递归
  • 微信公众号-开发者-自定义菜单-CLICK事件处理
  • “我爱淘”冲刺阶段Scrum站立会议6
  • 我们还需要兼容IE样式问题吗?
  • modernizr框架之表单验证
  • jquery easyUI DataGrid 初始化的时候就显示可排序的字段
  • 从顺序查找窥探平均时间复杂度分析的一般化方法
  • 无法升级数据库....因为此版本的 SQL Server 不支持该数据库的非发布版本(539) 解决方案...
  • SSIS 2012 Error: An Integration Services class cannot be found
  • 【Under-the-hood-ReactJS-Part0】React源码解读
  • 【干货分享】SpringCloud微服务架构分布式组件如何共享session对象
  • 【跃迁之路】【477天】刻意练习系列236(2018.05.28)
  • codis proxy处理流程
  • Java 实战开发之spring、logback配置及chrome开发神器(六)
  • Java多线程(4):使用线程池执行定时任务
  • Java小白进阶笔记(3)-初级面向对象
  • java正则表式的使用
  • node学习系列之简单文件上传
  • vue-router 实现分析
  • 闭包--闭包作用之保存(一)
  • 从伪并行的 Python 多线程说起
  • 极限编程 (Extreme Programming) - 发布计划 (Release Planning)
  • 数据结构java版之冒泡排序及优化
  • 微服务入门【系列视频课程】
  • 以太坊客户端Geth命令参数详解
  • 正则学习笔记
  • 职业生涯 一个六年开发经验的女程序员的心声。
  • 资深实践篇 | 基于Kubernetes 1.61的Kubernetes Scheduler 调度详解 ...
  • ​LeetCode解法汇总1410. HTML 实体解析器
  • ![CDATA[ ]] 是什么东东
  • (C#)Windows Shell 外壳编程系列4 - 上下文菜单(iContextMenu)(二)嵌入菜单和执行命令...
  • (分布式缓存)Redis持久化
  • (免费分享)基于springboot,vue疗养中心管理系统
  • (轉貼) 蒼井そら挑戰筋肉擂台 (Misc)
  • (轉貼) 寄發紅帖基本原則(教育部禮儀司頒布) (雜項)
  • .Net Core/.Net6/.Net8 ,启动配置/Program.cs 配置
  • .NET的微型Web框架 Nancy
  • .net开发引用程序集提示没有强名称的解决办法
  • .net利用SQLBulkCopy进行数据库之间的大批量数据传递
  • .NET面试题(二)
  • .NET中 MVC 工厂模式浅析
  • @RequestParam详解
  • [ vulhub漏洞复现篇 ] JBOSS AS 4.x以下反序列化远程代码执行漏洞CVE-2017-7504
  • [100天算法】-不同路径 III(day 73)
  • [AIGC] MySQL存储引擎详解
  • [ai笔记3] ai春晚观后感-谈谈ai与艺术
  • [Android] Android ActivityManager
  • [android] 天气app布局练习
  • [FTP]pureftp部署和优化