• 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);
        }
    
    }
  • 相关阅读:
    nginx 启用http2 https 无法访问的问题
    Automating CSS Regression Testing
    jasmine 使用
    编写浏览器和Node.js通用的JavaScript模块
    Cucumber 使用例子
    Cucumber 之Gherkin
    Cucumber
    Cobertura 代码覆盖率测试
    spring && Cobertura && maven &&junit 单元测试以及测试覆盖率
    spring retry 使用
  • 原文地址:https://www.cnblogs.com/manue1/p/4480943.html
Copyright © 2020-2023  润新知