zoukankan      html  css  js  c++  java
  • 12 图形用户接口

     基础知识:(GUI:javax.swing   事件:java.awt.event)

    1、GUI(Graphical User Interface)图形用户界面

      JFrame :代表屏幕上window的对象,可以把组件加到上面

      widget   :组件,例如JButton、JRadioButton、JCheckBox、JLabel、JList等

       frame窗口:

      

    2、创建GUI:

    import javax.swing.*;
    
    public class Test {
        public static void main(String[] args) {
            JFrame frame = new JFrame();
            JButton button = new JButton("Button");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//在window关闭时把程序结束掉
            frame.getContentPane().add(button);
            frame.setSize(300, 300);
            frame.setVisible(true);
        }
    }

     

    3、取得用户事件(java.awt.event):

    需要:1、被按下时需要执行的方法

       2、监测按钮被按下的方法

    取得按钮的ActionEvent:

      1、实现ActionListener这个借口

      2、向按钮注册(告诉它你要监听事件)

      3、定义事件处理的方法(事件借口上的方法)

    import javax.swing.*;//widget
    import java.awt.event.*;
    
    //ActionListener是java.awt.event 包中的接口,只有一个方法void actionPerformed(ActionEvent e)
    public class Test implements ActionListener{ 
        JButton button1;
        public static void main(String[] args) {
            Test t = new Test();
            t.play();
        }
    
        public void play() {
            JFrame frame = new JFrame();
            button1 = new JButton("Button1");
            button1.addActionListener(this);
            frame.getContentPane().add(button1);
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setSize(300, 300);
            frame.setVisible(true);
        }
    
        public void actionPerformed(ActionEvent event){
            button1.setText("I'v been clicked!");
        }
    } 

    4、在GUI上面加东西的3种方法:

     

    5、自己创建绘图组件

      创建JPanel的子类并覆盖掉paintComponent()这个方法(所有绘图程序代码都在paintComponent()里面),

    当你的panel所处的frame显示的时候,paintComponent()就会被调用,如果用户缩小window或选择最小化,Java

    虚拟机也会知道要用它来重新绘制。你不会自己调用这个方法,它的参数是个跟实际屏幕有关的Graphics对象,你

    无法取得这个对象,它必须由系统来交给你,然而,你还是可以调用reapint();来要求系统重新绘制显示装置,然后

    才会产生paintComponent()的调用。

    6、在paintComponent()中显示图片,圆圈:

     7、paintComponent()中显示渐变颜色效果:

      每个Grahpics引用的后面都有个Grahpics 2D对象

    知识点:

    7、按下按钮就会改变颜色:

    import javax.swing.*;
    import java.awt.event.*;
    import java.awt.*;
    
    public class Test implements ActionListener{
        JFrame frame;
        public static void main(String[] args) {
            Test gui = new Test();
            gui.go();
        }
    
        public void go() {
            frame = new JFrame();
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            JButton button = new JButton("Change Colors");
            button.addActionListener(this);
    
            MyDrawPanel drawPanel = new MyDrawPanel();
    
            frame.getContentPane().add(BorderLayout.SOUTH, button);
            frame.getContentPane().add(BorderLayout.CENTER, drawPanel);
            frame.setSize(300,300);
            frame.setVisible(true);
    
        }
    
        public void actionPerformed(ActionEvent event) {
            frame.repaint();//当用户按下按钮时就要求frame重新绘制
        }
    }
    //可以随机的渐层颜色
    class MyDrawPanel extends JPanel{
        public void paintComponent(Graphics g) {
            // Graphics2D  g2d = (Graphics2D) g;
            // GradientPaint gradient = new GradientPaint(70,70,Color.blue,150,150,Color.orange);
            // g2d.setPaint(gradient);
            // g2d.fillOval(70,70,100,100);
    
            Graphics2D g2d = (Graphics2D) g;
            int red = (int) (Math.random() * 255);
            int green = (int) (Math.random() * 255);
            int blue = (int) (Math.random() * 255);
            Color startColor = new Color(red, green, blue);
    
            red = (int) (Math.random() * 255);
            green = (int) (Math.random() * 255);
            blue = (int) (Math.random() * 255);
            Color endColor = new Color(red, green, blue);
    
            GradientPaint gradient = new GradientPaint(70,70,startColor,150,150,endColor);
            g2d.setPaint(gradient);
            g2d.fillOval(70,70,100,100);
        }
    }

     

    6、尝试两个按钮:

    1、实现两个actionPerformed()方法:,不能在实现同一个类的同一个方法两次(一个类中)

    2、对两个按钮注册同一个监听口: 不合适,但是actionPerformed()方法需要判断是哪个事件源发出

    3、创建不同的ActionListener: 不合适, 这些类没有办法存取到所需要的变量

    4、内部类

    • 内部类可以使用外部所有的方法与变量,就算是私有的也是一样。
    • 内部类的实例一定会绑在外部类的实例上

    class MyOuter {
        private int x;//外部类有私有的x实例变量
        MyInner inner = new MyInner();//创建内部类的实例
        public void doStuff() {
            inner.go();//调用内部的方法
        }
    
        class MyInner {
            void go();//内部可以使用外部x变量
            x = 42;
        }
    }

     实例:

    点击Change Color 可以改变圆圈颜色,点击Change Label可以改变文字

    点击后

    import javax.swing.*;
    import java.awt.event.*;
    import java.awt.*;
    
    public class Test {
        JFrame frame;
        JButton labelbutton;
    
        public static void main(String[] args) {
            Test t = new Test();
            t.go();
        }
    
        public void go() {
            frame = new JFrame();
            MyDrawPanel panel = new MyDrawPanel();//~~~~~~~~~~~~~~~~~~~~~~~~
            JButton colorbutton = new JButton("Change Color");//创建改变圆圈颜色的按钮
            labelbutton = new JButton("Change Label"); //创建改变按钮文字的按钮
    
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.getContentPane().add(BorderLayout.CENTER,panel);
            frame.getContentPane().add(BorderLayout.SOUTH,colorbutton);
            frame.getContentPane().add(BorderLayout.EAST,labelbutton);
            colorbutton.addActionListener(new ColorListener());//监听颜色按钮,相对于this传给监听的注册方法,现在传的是对应的实例
            labelbutton.addActionListener(new LabelListener());//监听文字按钮,相对于this传给监听的注册方法,现在传的是对应的实例
    
            frame.setSize(300, 300);
            frame.setVisible(true);
        }
    
        class LabelListener implements ActionListener{//内部类实现接口
             public void actionPerformed(ActionEvent e) { //实现actionPerformed方法
                labelbutton.setText("Ouch");//点击按钮,触发监听事件,调用该语句
            }
        }
    
        class ColorListener implements ActionListener{//内部类实现接口
            public void actionPerformed(ActionEvent e) {//实现actionPerformed方法
                frame.repaint();
            }
        }
    }
    
    
    class MyDrawPanel extends JPanel {//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        public void paintComponent(Graphics g) {
            Graphics2D g2d = (Graphics2D) g;
            int red = (int) (Math.random() * 255);
            int green = (int) (Math.random() * 255);
            int blue = (int) (Math.random() * 255);
            Color startColor = new Color(red, green, blue);
    
            red = (int) (Math.random() * 255);
            green = (int) (Math.random() * 255);
            blue = (int) (Math.random() * 255);
            Color endColor = new Color(red, green, blue);
    
            GradientPaint gradient = new GradientPaint(70,70,startColor,150,150,endColor);
            g2d.setPaint(gradient);
            g2d.fillOval(70,70,100,100);
        }
    }
  • 相关阅读:
    解决Altera家的ROM仿真数据一直为0
    解决sublime text3 中文字符乱码
    sublime3添加verilog自动补全代码段
    慢腾腾的Quartus prime16.0加快编译速度
    Quartus prime16.0 与modelsim ae 联调
    JTAG基础知识
    Quartus prime 16.0 中通过JTAG固化程序
    FPGA功能仿真,门级仿真,后仿真的区别
    testbench中$display查看例化model里面信号方法以及$realtime用法
    PHP 批量移动文件改名
  • 原文地址:https://www.cnblogs.com/wmjlh/p/7305988.html
Copyright © 2011-2022 走看看