Java学习—GUI编程学习笔记

简介: Java学习—GUI编程学习笔记

GUI编程

前言:告诉大家应该怎么学?

  • 这是什么?
  • 它怎么玩?
  • 该如何在我们平时运用?

组件

  • 窗口
  • 弹窗
  • 面板
  • 文本框
  • 列表框
  • 按钮
  • 图片
  • 监听事件
  • 鼠标
  • 键盘事件
  • 破解工具

一、是什么

  1. GUI是图形界面编程
  2. GUI的核心技术:Swing AWT
  3. GUI缺点:界面不美观;需要jar环境

二、为什么

为什么我们要学习

  1. 可以写出自己心中想要的一些小工具
  2. 工作的时候,也可能需要维护到swing界面,(概率极小!)
  3. 了解MVC架构,了解监听!

三、怎么做

1、AWT

1.1 AWT介绍

  1. 包含了很多类和接口!
  2. 元素:窗口、按钮、文本框

1.2 组件和容器

1.2.1. Frame(容器)
package com.gui;

import java.awt.*;

public class TestFrame {
    public static void main(String[] args) {
        Frame frame =new Frame("我的第一个JAVA图像界面窗");
        frame.setVisible(true);
        frame.setSize(200,200);
        frame.setBackground(Color.BLUE);
        frame.setLocation(200,200);
        frame.setResizable(false);
    }
}

展示多个窗口

package com.gui;

import java.awt.*;

public class TestFrame02 {
    //展示多个窗口
    public static void main(String[] args) {
        MyFrame myFrame1 = new MyFrame(100,100,200,200,Color.BLUE);
        MyFrame myFrame2 = new MyFrame(300,100,200,200,Color.GREEN);
        MyFrame myFrame3 = new MyFrame(100,300,200,200,Color.MAGENTA);
        MyFrame myFrame4 = new MyFrame(300,300,200,200,Color.YELLOW);

    }

}
class MyFrame extends Frame{
    static int id = 0;//可能存在多个窗口,我们需要一个计数器
    public MyFrame(int x,int y,int w,int h,Color color){
        super("Myframe"+(++id));
        setBackground(color);
        setBounds(x,y,w,h);
        setVisible(true);
    }
}

1.2.2. Panel(面板)
package com.gui;

import java.awt.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

public class TestPanel {
    public static void main(String[] args) {
        Frame frame = new Frame();
        Panel panel = new Panel();
        //对窗口设置布局
        frame.setLayout(null);
        //窗口的坐标
        frame.setBounds(300,300,500,500);
        frame.setBackground(Color.GREEN);
        //相对于frame的面板坐标
        panel.setBounds(50,50,400,400);
        panel.setBackground(Color.BLUE);
        //将面板添加到窗口
        frame.add(panel);
        //设置可见性
        frame.setVisible(true);
        //监听事件,监听窗口关闭事件 System.exit(0)
        //适配器模式
        frame.addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e) {
                System.exit(0);//结束程序
            }
        });

    }

}

1.2.3. 布局管理器
  1. 流式布局

    package com.gui;
    
    import com.sun.media.jfxmedia.events.NewFrameEvent;
    
    import java.awt.*;
    
    public class TestLayout {
        public static void main(String[] args) {
            Frame frame = new Frame();
            //添加组件-按钮
            Button button1 = new Button("button1");
            Button button2 = new Button("button2");
            Button button3 = new Button("button3");
            Button button4 = new Button("button4");
            //设置为流式布局
            frame.setLayout(new FlowLayout(FlowLayout.LEFT));
            frame.setVisible(true);
            frame.setSize(200,200);
            frame.add(button1);
            frame.add(button2);
            frame.add(button3);
            frame.add(button4);
    
    
        }
    }
    

  2. 东西南北中

    package com.gui;
    
    import java.awt.*;
    
    public class TestLayoutBorder {
        public static void main(String[] args) {
            Frame frame = new Frame();
            Button East = new Button("East");
            Button West = new Button("West");
            Button South = new Button("South");
            Button North = new Button("North");
            Button Center = new Button("Center");
    
            frame.add(East,BorderLayout.EAST);
            frame.add(West,BorderLayout.WEST);
            frame.add(South,BorderLayout.SOUTH);
            frame.add(North,BorderLayout.NORTH);
            frame.add(Center,BorderLayout.CENTER);
    
            frame.setSize(200,200);
            frame.setVisible(true);
            
    
        }
    }
    

  3. 表格布局

    package com.gui;
    
    import java.awt.*;
    
    public class TestLayoutGrid {
        public static void main(String[] args) {
            Frame frame = new Frame();
            Button btn1 = new Button("btn1");
            Button btn2 = new Button("btn2");
            Button btn3 = new Button("btn3");
            Button btn4 = new Button("btn4");
            Button btn5 = new Button("btn5");
            Button btn6 = new Button("btn6");
            //设置表格布局 3*2
            frame.setLayout(new GridLayout(3,2));
            //依次添加
            frame.add(btn1);
            frame.add(btn2);
            frame.add(btn3);
            frame.add(btn4);
            frame.add(btn5);
            frame.add(btn6);
            
            //将表格自动填充于窗口
            frame.pack();
            frame.setVisible(true);
            
        }
    }
    

2、Swing

2.1、窗口,画板

顶级窗口Jframe

//实例化Jframe
JFrame jf = new JFrame("这是JFrame窗口");
jf.setVisible(true);
jf.setBounds(100,100,200,200);
jf.setBackground(Color.BLUE);
JLabel label = new JLabel("大家好");
jf.add(label);
//让文本标签居中,设置水平对齐
label.setHorizontalAlignment(SwingConstants.CENTER);
//获得一个容器
Container container = jf.getContentPane();
container.setBackground(Color.YELLOW);
//关闭事件
jf.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5RgXboVG-1617029018116)(D:\0.0 study\红芯书院\5、GUI编程\yellow.png)]

2.2、弹窗

JDialog,用来被弹出。默认就有关闭事件!

//主窗口
public class DialogDemo {
    public DialogDemo() {
        //实例化Jframe
        javax.swing.JFrame jf = new javax.swing.JFrame("这是JFrame窗口");
        jf.setVisible(true);
        jf.setSize(700, 500);
        jf.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

        //JFrame  放东西,容器
        Container container = jf.getContentPane();
        //绝对布局
        container.setLayout(null);
        //按钮
        JButton button = new JButton("点击弹出一个对话框!");//创建
        button.setBounds(30, 30, 200, 50);
        //点这个按钮的时候,弹出一个弹窗
        button.addActionListener(new ActionListener() {//监听器
            @Override
            public void actionPerformed(ActionEvent e) {//弹窗
                new MyDialogDemo();
            }
        });
        container.add(button);
    }

    public static void main(String[] args) {
        DialogDemo dialogDemo = new DialogDemo();

    }
}
//弹窗的窗口
public class MyDialogDemo extends JDialog {
    public MyDialogDemo(){
        this.setVisible(true);
        this.setBounds(100,100,500,500);
        Container container = this.getContentPane();
        container.setLayout(null);
        container.add(new Label("欢迎弹出"));
    }
}

2.3、标签 label

new JLabel("xxx",放置谁,,SwingConstante.CENTER);

图标(ICON)放在标签上,也可以放在按钮上。

2.4、按钮

2.4.1 单选框
public class JButtonDemo extends JFrame {
    public JButtonDemo() {
        Container container = this.getContenPance();
        /*
        // 放图片
        * Icon icon = new ImageIcon(resource);  
        * */
        //单选框
        JRadioButton radioButton1 = new JRadioButton("JRadioButton1");
        JRadioButton radioButton2 = new JRadioButton("JRadioButton2");
        JRadioButton radioButton3 = new JRadioButton("JRadioButton3");
        //由于单选框只能选择一个,用分组,一个组中只能选择一个
        ButtonGroup group = new ButtonGroup();
        group.add(radioButton1);
        group.add(radioButton2);
        group.add(radioButton3);
        container.add(radioButton1, BorderLayout.CENTER);
        container.add(radioButton2, BorderLayout.NORTH);
        container.add(radioButton3, BorderLayout.SOUTH);
        this.setVisible(true);
        this.setSize(500, 300);
        this.setDeafaultCloseOpeartion(WindowConstants.EXIT_ON_CLOSE);
        
    }

    public static void main(String[] args) {
        new JButtonDemo();

    }
}
2.4.2 多选框
public class JButtonDemo extends JFrame {
    public JButtonDemo() {
        Container container = this.getContenPance();
        /*
        // 放图片
        * Icon icon = new ImageIcon(resource);  
        * */
        //多选框
        JCheckBox c1 = new JCheckBox("01");
        JCheckBox c2 = new JCheckBox("02");
        JCheckBox c3 = new JCheckBox("03");
        container.add(c1, BorderLayout.CENTER);
        container.add(c2, BorderLayout.NORTH);
        container.add(c3, BorderLayout.SOUTH);
        this.setVisible(true);
        this.setSize(500, 300);
        this.setDeafaultCloseOpeartion(WindowConstants.EXIT_ON_CLOSE);
        
    }

    public static void main(String[] args) {
        new JButtonDemo();

    }
}

2.5、下拉框

JComboBox status = new JComboBox();
status.addItem("01");
status.addItem("02");
status.addItem("03");
container.add(status);

2.6、列表框

String[] contents={"1","2".,"3"};
JList jList = new JList(contents);
contents.add(jList);

2.7、文本框

JTextField textField1 = new JTextField("hello");
JTextField textField2 = new JTextField("word",20);
Container.add(textField1,BorderLayout.NORTH);
Container.add(textField2,BorderLayout.SOUTH);

2.8、密码框

JPasswordField passwordField = new JPasswordField();
passwordField.setEchoChar('*');
container.add(passwordField);
相关文章
|
1月前
|
Java 程序员
Java编程中的异常处理:从基础到高级
在Java的世界中,异常处理是代码健壮性的守护神。本文将带你从异常的基本概念出发,逐步深入到高级用法,探索如何优雅地处理程序中的错误和异常情况。通过实际案例,我们将一起学习如何编写更可靠、更易于维护的Java代码。准备好了吗?让我们一起踏上这段旅程,解锁Java异常处理的秘密!
|
13天前
|
存储 缓存 Java
Java 并发编程——volatile 关键字解析
本文介绍了Java线程中的`volatile`关键字及其与`synchronized`锁的区别。`volatile`保证了变量的可见性和一定的有序性,但不能保证原子性。它通过内存屏障实现,避免指令重排序,确保线程间数据一致。相比`synchronized`,`volatile`性能更优,适用于简单状态标记和某些特定场景,如单例模式中的双重检查锁定。文中还解释了Java内存模型的基本概念,包括主内存、工作内存及并发编程中的原子性、可见性和有序性。
Java 并发编程——volatile 关键字解析
|
17天前
|
算法 Java 调度
java并发编程中Monitor里的waitSet和EntryList都是做什么的
在Java并发编程中,Monitor内部包含两个重要队列:等待集(Wait Set)和入口列表(Entry List)。Wait Set用于线程的条件等待和协作,线程调用`wait()`后进入此集合,通过`notify()`或`notifyAll()`唤醒。Entry List则管理锁的竞争,未能获取锁的线程在此排队,等待锁释放后重新竞争。理解两者区别有助于设计高效的多线程程序。 - **Wait Set**:线程调用`wait()`后进入,等待条件满足被唤醒,需重新竞争锁。 - **Entry List**:多个线程竞争锁时,未获锁的线程在此排队,等待锁释放后获取锁继续执行。
50 12
|
13天前
|
存储 安全 Java
Java多线程编程秘籍:各种方案一网打尽,不要错过!
Java 中实现多线程的方式主要有四种:继承 Thread 类、实现 Runnable 接口、实现 Callable 接口和使用线程池。每种方式各有优缺点,适用于不同的场景。继承 Thread 类最简单,实现 Runnable 接口更灵活,Callable 接口支持返回结果,线程池则便于管理和复用线程。实际应用中可根据需求选择合适的方式。此外,还介绍了多线程相关的常见面试问题及答案,涵盖线程概念、线程安全、线程池等知识点。
93 2
|
30天前
|
安全 算法 Java
Java多线程编程中的陷阱与最佳实践####
本文探讨了Java多线程编程中常见的陷阱,并介绍了如何通过最佳实践来避免这些问题。我们将从基础概念入手,逐步深入到具体的代码示例,帮助开发者更好地理解和应用多线程技术。无论是初学者还是有经验的开发者,都能从中获得有价值的见解和建议。 ####
|
30天前
|
Java 调度
Java中的多线程编程与并发控制
本文深入探讨了Java编程语言中多线程编程的基础知识和并发控制机制。文章首先介绍了多线程的基本概念,包括线程的定义、生命周期以及在Java中创建和管理线程的方法。接着,详细讲解了Java提供的同步机制,如synchronized关键字、wait()和notify()方法等,以及如何通过这些机制实现线程间的协调与通信。最后,本文还讨论了一些常见的并发问题,例如死锁、竞态条件等,并提供了相应的解决策略。
50 3
|
1月前
|
开发框架 安全 Java
Java 反射机制:动态编程的强大利器
Java反射机制允许程序在运行时检查类、接口、字段和方法的信息,并能操作对象。它提供了一种动态编程的方式,使得代码更加灵活,能够适应未知的或变化的需求,是开发框架和库的重要工具。
50 3
|
2月前
|
监控 安全 Java
Java中的多线程编程:从入门到实践####
本文将深入浅出地探讨Java多线程编程的核心概念、应用场景及实践技巧。不同于传统的摘要形式,本文将以一个简短的代码示例作为开篇,直接展示多线程的魅力,随后再详细解析其背后的原理与实现方式,旨在帮助读者快速理解并掌握Java多线程编程的基本技能。 ```java // 简单的多线程示例:创建两个线程,分别打印不同的消息 public class SimpleMultithreading { public static void main(String[] args) { Thread thread1 = new Thread(() -> System.out.prin
|
2月前
|
安全 Java 调度
Java中的多线程编程入门
【10月更文挑战第29天】在Java的世界中,多线程就像是一场精心编排的交响乐。每个线程都是乐团中的一个乐手,他们各自演奏着自己的部分,却又和谐地共同完成整场演出。本文将带你走进Java多线程的世界,让你从零基础到能够编写基本的多线程程序。
37 1
|
2月前
|
Java 数据处理 开发者
Java多线程编程的艺术:从入门到精通####
【10月更文挑战第21天】 本文将深入探讨Java多线程编程的核心概念,通过生动实例和实用技巧,引导读者从基础认知迈向高效并发编程的殿堂。我们将一起揭开线程管理的神秘面纱,掌握同步机制的精髓,并学习如何在实际项目中灵活运用这些知识,以提升应用性能与响应速度。 ####
52 3