GUI编程2


GUI简单介绍

java.awt:Abstract Window ToolKit(抽象窗口工具包),需要调用本地系统方法实现功能

javax.swing:在AWT基础上建立的一套工具包,移植性更强

java GUI几种技术选择

AWT:java最早的界面库

Swing:对AWT的扩展,轻量级设计的界面库

JavaFX:java1.8之后出现的界面库

SWT:Eclipse所使用的界面库,由Eclipse管理

GUI体系结构图

GUI组件体系

Container:容器,是一个特殊的组件,该组件中可以通过add方法添加其他组件在容器。

窗体布局

窗体中组件的排列方式,常用的布局方式:

流式布局:从左到右,从上到下(也可以自定义),对齐方式有:

FlowLayout.LEFT左对齐、FlowLayout.RIGHT右对齐、FlowLayout.GENTER中间对齐,默认使用左对齐

构造方法 方法功能
FlowLayout() 使用默认的对齐方式及默认的垂直间距、水平间距创建FlowLayout布局管理器
FlowLayout(int align) 使用指定的对齐方式及默认的垂直间距、水平间距创建FlowLayout布局管理器
FlowLayout(int align,int hgap,int vgap) 使用指定的对齐方式及指定的水平间距,垂直间距创建FlowLayout布局管理器

边界布局:分为东、西、南、北、中五个方向

网格布局:有行列之分

网格包布局:不规则

卡片布局:每个按钮不同事件

不同的布局方式

流式布局示例:

 public static void main(String[] args) {
        Frame frame = new Frame("新窗体测试");

        //设置布局
        frame.setBounds(500,400,400,300);
        frame.setLayout(new FlowLayout());
        //创建文本输入窗
        TextField tf = new TextField();
        //创建按钮
        Button bu = new Button("按钮1");
        //创建一个文本域
        TextArea ta = new TextArea();
        //将元素添加到主容器中
        frame.add(tf);
        frame.add(bu);
        frame.add(ta);

        //添加按钮点击事件
        bu.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent actionEvent) {
                //获取文本信息
                String trim = tf.getText().trim();
                //清理输入空间
                tf.setText("");
                //设置文本域
//                ta.setText(trim);
                ta.append(trim);
                //获取焦点
                tf.requestFocus();
            }
        });

        //关闭窗口事件
        frame.addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent windowEvent) {
                System.exit(0);
            }
        });

        frame.setVisible(true);
    }

鼠标的相关事件:

 public static void main(String[] args) {
        Frame frame = new Frame("新窗体测试");

        //设置布局
        frame.setBounds(400,200,500,400);
        frame.setLayout(new FlowLayout());

        JButton btn1 = new JButton("按钮点击事件");
        JButton btn2 = new JButton("鼠标点击事件");
        JButton btn3 = new JButton("鼠标进入事件");
        JButton btn4 = new JButton("鼠标退出事件");

        frame.add(btn1);
        frame.add(btn2);
        frame.add(btn3);
        frame.add(btn4);

        //按钮改变事件
        btn1.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent actionEvent) {
                frame.setBackground(Color.RED);
            }
        });

        //对按钮添加鼠标事件
        btn2.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent mouseEvent) {
                frame.setBackground(Color.GREEN);
            }
        });

        btn3.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseEntered(MouseEvent mouseEvent) {
                frame.setBackground(Color.YELLOW);
            }
        });

        btn4.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseExited(MouseEvent mouseEvent) {
                frame.setBackground(Color.WHITE);
            }
        });

        //关闭窗口事件
        frame.addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent windowEvent) {
                System.exit(0);
            }
        });

        frame.setVisible(true);
    }

键盘事件

 public static void main(String[] args) {
        Frame frame = new Frame("键盘监听事件示例");
        frame.setBounds(400,200,500,400);
        frame.setLayout(new FlowLayout());
        //创建label对象,并且label不能输入非数字字符
        JLabel label = new JLabel("请输入手机号,不能为非数字字符");
        TextField tf = new TextField(40);

        frame.add(label);
        frame.add(tf);

        tf.addKeyListener(new KeyAdapter() {
            @Override
            public void keyPressed(KeyEvent keyEvent) {
                //当前键盘按键为非数字字符,设置取消事件
                char keyChar = keyEvent.getKeyChar();
                if(!(keyChar>='0'&&keyChar<='9')){
                    keyEvent.consume();
                }
            }
        });

        frame.addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent windowEvent) {
                System.exit(0);
            }
        });

        frame.setVisible(true);
    }

菜单组件

MenuBar、Menu、Menultem

先创建菜单条,再创建菜单,每一个菜单中建立菜单项。也可以将菜单添加到菜单中充当子菜单,通过setMenuBar方法,将菜单添加到Frame中

 public static void main(String[] args) {
        JFrame frame = new JFrame("创建菜单窗体");
        //设置布局以及窗体大小
        frame.setBounds(400,200,500,400);
        frame.setLayout(new FlowLayout());

        //创建菜单栏
        JMenuBar mb = new JMenuBar();
        //创建菜单
        JMenu m1 = new JMenu("打开文件");
        JMenu m2 = new JMenu("切换目录");
        JMenu m3 = new JMenu("审阅文件");
        JMenu m11 = new JMenu("更改名称");
        JMenu m12 = new JMenu("打开记事本");

        //创建菜单项
        JMenuItem mi1 = new JMenuItem("好好学习");
        JMenuItem mi2 = new JMenuItem("天天向上");
        JMenuItem mi4 = new JMenuItem("恢复标题");
        JMenuItem mi3 = new JMenuItem("退出系统");

        //菜单栏添加菜单或者菜单项
        m1.add(mi1);
        m1.add(m11);
        m1.add(m12);
        m1.add(mi3);

        m11.add(mi1);
        m11.add(mi2);
        m11.add(mi4);

        //导航栏添加
        mb.add(m1);
        mb.add(m2);
        mb.add(m3);

        //设置菜单栏
        frame.setJMenuBar(mb);

      //打开记事本
        m12.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent actionEvent) {
                Runtime r = Runtime.getRuntime();
                try{
                    r.exec("notepad");
                }catch(Exception ex){
                    ex.printStackTrace();
                }
            }
        });
        //菜单项添加监听事件
        mi3.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent actionEvent) {
                System.exit(0);
            }
        });

        //关闭事件
        frame.addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent windowEvent) {
                System.exit(0);
            }
        });
        //设置窗体可见
        frame.setVisible(true);
    }

Swing

Swing是基于AWT的,是使用J开头的相关的控件。

使用lambda表达式对按钮事件进行处理

窗体布局类

public class MyFrame extends JFrame {

    JLabel timelabel = new JLabel("00:00:00");
    JButton button = new JButton("显示时间");

    public MyFrame() {
    }

    public MyFrame(String name) {
        super(name);

        Container contain = getContentPane();
        contain.setLayout(new FlowLayout());

        // 内容面板,向内容面
        contain.add(button);
        contain.add(timelabel);
        //事件监听接口,只有一个方法,因此使用lambda实现接口方法
        button.addActionListener((e) -> {
            showTime();
        });
    }

    public void showTime() {
        SimpleDateFormat simple = new SimpleDateFormat("yyyy:MM:dd HH:mm:ss");
        timelabel.setText(simple.format(new Date()));
    }
}

主启动类

public class GetSomeWindow {
    public static void createGui() {
        MyFrame frame = new MyFrame("Hello,Xing");

        frame.setBounds(500, 400, 600, 400);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
    }
    //相当于传递一个线程,使用lambda启动线程
    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> {
            createGui();
        });
    }
}

回调:Callback,设计上的术语,当调用系统一个方法时,称为调用Call,当一个方法被系统调用时,称为回调Callback

JLabel用于显示段文本或者图标

setText()设置文本

setFont()设置字体

setForeground()设置文本颜色

setToolTipText()设置工具提示

JTextField,用于显示单行文本

new JTextField(16),16表示列数,用于计算宽度

setText()/getText() 设置文本域文字/获取文本域文字

setFont() 设置字体

JCheckBox复选框

getSelected()/setSelected() 选中状态/设置

setText()选项文字

事件:addActionListener()用户选中/取消时触发

JComboBox下拉列表

javaFX


文章作者: it星
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 it星 !
 上一篇
Ros仿真系统 Ros仿真系统
it星
Ros的安装Ubuntu安装地址 本次环境:Ubuntu16.04+ROS Kinetic版本 安装成功后,测试命令 roscore 安装成功后,下载编译工具: sudo wget https://github.com/Tony
2020-10-25
下一篇 
阻塞队列 阻塞队列
1.阻塞队列 队列是一个数据结构,阻塞队列就是线程从一端添加数据,从一端拿取数据。当阻塞队列时空时,从队列中获取元素的操作将会被阻塞;当阻塞队列是满时,往队列里添加元素的操作将会被阻塞。 为什么需要阻塞队列? 线程之间的通信一般使用的是
2020-10-01
  目录