GUI编程(二)

news2024/12/25 0:37:59

Swing

Swing是GUI(图形用户界面)开发工具包。

早期的AWT(抽象窗口工具包)组件开发的图形用户界面,要依赖本地系统,当把AWT组件开发的应用程序移植到其他平台的系统上运行时,不能保证其外观风格,因此AWT是依赖于本地系统平台的。

而使用Swing开发的Java应用程序,其界面是不受本地系统平台限制的,也就是说Swing开发的Java应用程序移植到其他系统平台上时,其界面外观是不会改变的。但要注意的是,虽然Swing提供的组件可以方便开发Java应用程序,但是Swing并不能取代AWT,在开发Swing程序时通常要借助与AWT的一些对象来共同完成应用程序的设计。

一、常用窗体

Swing窗体是Swing的一个组件,同时也是创建图形化用户界面的容器,可以将其它组件放置在窗体容器中。

1. JFrame框架窗体

JFrame窗体是一个容器,在Swing开发中我们经常要用到,它是Swing程序中各个组件的载体。

这里我们要把组件添加到容器container 中,而不是像Frame一样直接添加到frame中

package com.demo4;

import javax.swing.*;
import java.awt.*;

public class TestJFrame {
    public void init(){
        //顶级窗口
        JFrame frame = new JFrame("JFrame");
        frame.setVisible(true);
        frame.setBounds(100,100,200,200);

        //设置文字
        JLabel label = new JLabel("Hello");
        //文本标签居中
        label.setHorizontalAlignment(JLabel.CENTER);

        // 获取一个容器
        Container container = frame.getContentPane();
        // 将标签添加至容器
        container.add(label);
        // 设置容器背景颜色
        container.setBackground(Color.pink);

        //关闭事件
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    }
    public static void main(String[] args) {
        //建立一个窗口
        new TestJFrame().init();
    }
}

常用的窗体关闭方式有四种:
“DO_NOTHING_ON_CLOSE” :什么也不做就将窗体关闭;
“DISPOSE_ON_CLOSE” :隐藏当前窗口,并释放窗体占有的其他资源。
“HIDE_ON_CLOSE” : 隐藏窗口的默认窗口关闭;
“EXIT_ON_CLOSE”:退出应用程序默认窗口关闭。

DISPOSE_ON_CLOSE在窗口被关闭的时候会dispose这个窗口。
如果你的程序没有其他线程在运行的话,当所有的窗口都被dispose了之后,JVM也会退出。
1.setDefaultCloseOperation(DISPOSE_ON_CLOSE);一个窗口点右上角×,只有该窗口会关闭
2.而setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);一个窗口点右上角×,软件的所有窗口都会关闭

2 .JDialog窗体

JDialog窗体是Swing组件中的对话框,继承了AWT组件中的java.awt.Dialog类。功能是从一个窗体中弹
出另一个窗体。

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

//主窗口
public class TestJDialog extends JFrame {
   public TestJDialog(){
       setVisible(true);
       setSize(700,500);
       setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

       Container container = this.getContentPane();
       //绝对布局
       getContentPane().setLayout(null);

       //按钮
       JButton button = new JButton("点击弹出一个对话框");
       button.setBounds(30,30,200,50);
       //监听按钮事件,点击按钮弹出弹窗
       button.addActionListener(new ActionListener() {
           @Override
           public void actionPerformed(ActionEvent e) {
               //弹窗
               new MyDialog();
           }
       });

       container.add(button);

   }
    public static void main(String[] args) {
        new TestJDialog();
    }
}
//弹窗的窗口
class MyDialog extends JDialog{
    public MyDialog(){
        this.setVisible(true);
        this.setBounds(100,100,500,500);
        
        Container container = this.getContentPane();
        container.setLayout(null);

        container.add(new Label("Java"));
    }
}


二、标签组件

在Swing中显示文本或提示信息的方法是使用标签,它支持文本字符串和图标。上面我们提到的JLabel就是这里的内容。

1. 标签

标签由JLabel类定义,可以显示一行只读文本、一个图像或带图像的文本。

JLabel lable = new JLabel();

2. 图标

Swing中的图标可以放置在按钮、标签等组件上,用于描述组件的用途。

图标可以用Java支持的图片文件类型进行创建,也可以使用java.awt.Graphics类提供的功能方法来创建。

在Swing中通过Icon接口来创建图标,可以在创建时给定图标的大小、颜色等特性。

import javax.swing.*;
import java.awt.*;

//图标,接口,需要实现类
public class TestIcon extends JFrame implements Icon {

    private int width;
    private int height;

    public TestIcon(){}

    public TestIcon(int width, int height) {
        this.width = width;
        this.height = height;
    }

    public void init(){
        TestIcon testIcon = new TestIcon(15, 15);
        //图标放在标签,按钮上
        JLabel label = new JLabel("icon", testIcon, SwingConstants.CENTER);
        Container container = getContentPane();
        container.add(label);

        setVisible(true);
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    }

    @Override
    public void paintIcon(Component c, Graphics g, int x, int y) {
        g.fillOval(x,y,width,height);

    }

    @Override
    public int getIconWidth() {
        return this.width;
    }

    @Override
    public int getIconHeight() {
        return this.height;
    }

    public static void main(String[] args) {
        new TestIcon().init();
    }
}

Swing中的图标除了可以绘制之外,还可以使用某个特定的图片创建。
利用javax.swing.ImageIcon类根据现有图片创建图标。

下面看一个实例,我们先在包下放一个图片(注意放置位置,不同位置路径不同),如下:
在这里插入图片描述

package com.demo4;

import javax.swing.*;
import java.awt.*;
import java.net.URL;

public class TestImageIcon extends JFrame {

    public TestImageIcon(){

        //获取图片的地址  从当前类的路径下获取
        URL url = this.getClass().getResource("Java.jpg");
        ImageIcon imageIcon = new ImageIcon(url);

        //JLabel label = new JLabel("ImageIcon");
        //label.setIcon(imageIcon);
        //label.setHorizontalAlignment(SwingConstants.CENTER);
		 JLabel label = new JLabel("ImageIcon", imageIcon, SwingConstants.CENTER);

        Container container = this.getContentPane();
        container.add(label);
        setVisible(true);
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

        setBounds(100,100,200,200);

    }

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

}

对于图片标签,我们经常将图片放置在标签上,用JLabel中的setIcon()方法即可,当然也可以在初始化JLabel对象时为标签指定图标,这需要获取一个Icon实例。
getResource()方法可以获得资源文件的URL路径,这里的路径是相对于前面的那个类的,所以可将该图片与该类放在同一个文件夹下;如果不在同一个文件夹下,需通过其它方法获取路径。

三、面板

面板也是一个容器,可作为容器容纳其他组件,但也必须被添加到其他容器中。

Swing中常用面板有JPanel面板和JScrollPane面板。

1. JPanel

import javax.swing.*;
import java.awt.*;

public class JPanelDemo extends JFrame {
    public JPanelDemo(){
        Container container = this.getContentPane();
        container.setLayout(new GridLayout(2, 1, 10, 10)); // 整个容器为2行1列

        JPanel p1 = new JPanel(new GridLayout(1, 3)); // 初始化一个面板,设置1行3列的网格布局
        JPanel p2 = new JPanel(new GridLayout(1, 2)); // 初始化一个面板,设置1行2列的网格布局
        JPanel p3 = new JPanel(new GridLayout(2, 1)); // 初始化一个面板,设置2行1列的网格布局
        JPanel p4 = new JPanel(new GridLayout(3, 2)); // 初始化一个面板,设置3行2列的网格布局

        p1.add(new JButton("1"));
        p1.add(new JButton("1"));
        p1.add(new JButton("1"));

        p2.add(new JButton("2"));
        p2.add(new JButton("2"));
        
        p3.add(new JButton("3"));
        p3.add(new JButton("3"));

        p4.add(new JButton("4"));
        p4.add(new JButton("4"));
        p4.add(new JButton("4"));
        p4.add(new JButton("4"));
        p4.add(new JButton("4"));
        p4.add(new JButton("4"));

        container.add(p1);
        container.add(p2);
        container.add(p3);
        container.add(p4);

        setVisible(true);
        setSize(500,500);
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

    }


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

2. JScrollPane

若遇到一个较小的容器窗体中显示一个较大部分内容的情况,可用JScrollPane面板。这是一个带滚动条的面板,就像平时浏览网页,经常遇到的滚动条一样。

如果需要在JScrollPane面板中放置多个组件,需将这多个组件放置在JPanel面板上,然后将JPanel面板作为一个整体组件添加在JScrollPane面板上。

import javax.swing.*;
import java.awt.*;

public class JScrollPaneDemo extends JFrame {
    public JScrollPaneDemo(){
        Container container = getContentPane();

        //文本域
        JTextArea textArea = new JTextArea(20,50);
        textArea.setText("Java");

        //Scroll面板
        JScrollPane jScrollPane = new JScrollPane(textArea);

        container.add(jScrollPane);


        setVisible(true);
        setSize(500,500);
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

    }

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

四、按钮组件

1. 图片按钮

JButton在之前的例子中已经出现多次,是较为常用的组件,用于触发特定动作。可以在按钮上显示文本标签,还可以显示图标。

import javax.swing.*;
import java.awt.*;
import java.net.URL;

public class JButtonDemo1 extends JFrame {
    public JButtonDemo(){
        Container container = getContentPane();
        URL resource = this.getClass().getResource("Java.jpg");
        ImageIcon imageIcon = new ImageIcon(resource);

        //将图标放在按钮上
        JButton button = new JButton();
        button.setIcon(imageIcon);
        button.setToolTipText("图片按钮");

        container.add(button);

        setVisible(true);
        setSize(500,500);
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

    }

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

2. 单选按钮

默认情况下,单选按钮显示一个圆形图标,通常在其旁放置一些说明性文字。当用户选中某个单选按钮后,按钮组中其它按钮将被自动取消,这时就需要按钮组(ButtonGroup)来将同组按钮放在一起,该按钮组中的按钮只能选择一个,而不在此按钮中的按钮不受影响。

import javax.swing.*;
import java.awt.*;

public class JButtonDemo2 extends JFrame{

    public JButtonDemo2(){
        Container container = getContentPane();
        //单选框
        JRadioButton radioButton1 = new JRadioButton("1");
        JRadioButton radioButton2 = new JRadioButton("2");
        JRadioButton radioButton3 = new JRadioButton("3");

        //由于单选框只能选一个,进行分组
        //如果没有进行分组,可以同时选择多个
        ButtonGroup buttonGroup = new ButtonGroup();
        buttonGroup.add(radioButton1);
        buttonGroup.add(radioButton2);
        buttonGroup.add(radioButton3);

        container.add(radioButton1,BorderLayout.NORTH);
        container.add(radioButton2,BorderLayout.CENTER);
        container.add(radioButton3,BorderLayout.SOUTH);


        setVisible(true);
        setSize(500,500);
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    }

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

3. 复选框

复选框是一个方块图标,外加一段描述性文字,与单选按钮的区别就是可以多选。每一个复选框都提供“选中”与“不选中”两种状态。

import javax.swing.*;
import java.awt.*;

public class JButtonDemo3 extends JFrame {

    public JButtonDemo3(){
        Container container = getContentPane();
        JCheckBox checkBox1 = new JCheckBox("Java");
        JCheckBox CheckBox2 = new JCheckBox("C++");
        container.add(checkBox1,BorderLayout.NORTH);
        container.add(CheckBox2,BorderLayout.SOUTH);


        this.setVisible(true);
        this.setSize(500, 350);
        this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    }

    public static void main(String[] args) {

        new JButtonDemo3();
    }
}

五、列表组件

1. 下拉列表(JComboBox)

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class TestComboBox extends JFrame {
    public TestComboBox(){
        Container container = getContentPane();

        JComboBox comboBox = new JComboBox();
        comboBox.addItem(null);
        comboBox.addItem("正在上映");
        comboBox.addItem("即将上映");
        comboBox.addItem("下架");

        comboBox.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                System.out.println(comboBox.getSelectedIndex()); //返回下标
                System.out.println(comboBox.getSelectedItem());  //返回内容
            }
        });

        container.add(comboBox);


        this.setVisible(true);
        this.setSize(500, 350);
        this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);


    }

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

    }
}

2. 列表框(JList)

package com;

import javax.swing.*;
import java.awt.*;


public class TestJList extends JFrame{
    public TestJList(){
        Container container = getContentPane();

        //生成列表的内容
        String[] str={"1","2","3"};
        JList jList = new JList(str);

        container.add(jList);

        this.setVisible(true);
        this.setSize(500, 350);
        this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);


    }

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

}

六、文本组件

1. 文本框(JTextField)

文本框用来显示或编辑一个单行文本

import javax.swing.*;
import java.awt.*;

public class TestJTestField extends JFrame {
    public TestJTestField(){
        Container container = getContentPane();
        //这里由于布局问题,文本框的长度改变
        container.setLayout(new GridLayout(2,1));

        JTextField jTextField1 = new JTextField("Java");// 创建一个文本框,值为Java
        JTextField jTextField2 = new JTextField("C++",20);// 创建一个长度为20的文本框,值为C++

        container.add(jTextField1);
        container.add(jTextField2);

        this.setVisible(true);
        this.setSize(500, 350);
        this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

    }

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

2. 密码框(JPasswordField)

密码框与文本框的定义与用法类似,但会使用户输入的字符串以某种符号进行加密。

import javax.swing.*;
import java.awt.*;

public class TestJPasswordField extends JFrame {
    public TestJPasswordField(){
        Container container = getContentPane();

        JPasswordField jPasswordField = new JPasswordField();
        jPasswordField.setEchoChar('$');  //char 类型 设置回显符号

        container.add(jPasswordField);

        this.setVisible(true);
        this.setSize(500, 350);
        this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);



    }

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

3. 文本域(JTextArea)

文本域组件在上面JScrollPane面板的代码中已经出现

配合面板使用

package com.demo5;

import javax.swing.*;
import java.awt.*;

public class JScrollPaneDemo extends JFrame {
    public JScrollPaneDemo(){
        Container container = getContentPane();

        //文本域
        JTextArea textArea = new JTextArea(20,50);
        textArea.setText("Java");

        //Scroll面板
        JScrollPane jScrollPane = new JScrollPane(textArea);

        container.add(jScrollPane);


        setVisible(true);
        setSize(500,500);
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

    }

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/490919.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

贪心刷题~

1、洛谷P2240 【深基12.例1】部分背包问题 贪心策略&#xff1a;拿金币单价高的。 #include<iostream> #include<cstring> #include<algorithm> using namespace std;struct gold{int v;int m; } q[101];bool cmp(gold a,gold b){return a.v*b.m>b.v*a.m…

SpringCloud-微服务Eureka服务注册中心

微服务&服务注册中心 前言一、微服务1.什么是微服务2.单体架构和微服务架构2.1.单体架构2.2.微服务架构 二、服务注册中心1.服务注册中心简介2.Eureka服务注册中心2.1.Eureka Server开发2.2 Eureka Client开发 3.Eureka的自我保护机制3.1.Eureka自我保护机制简介3.2.Eureka…

MySQL数据库连接超时自动断开的解决方案

这里写自定义目录标题 欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题&#xff0c;有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants 创建一个自定义列表如何创建一个…

windows下msys2编译64位的ffmpeg源码

目前遇到过两次需求&#xff0c;需要编译ffmpeg源码。网上下载的编译好的源码里面可能不全&#xff0c;很多时候需要自行编译源码。本文介绍自行编译ffmpeg64位源码&#xff08;32位通过相似的方式为编译成功&#xff0c;不知道原因&#xff09; 环境&#xff1a; 2023.5.4下载…

团队密码管理器Passbolt的安装

老苏下载了吴恩达联手 OpenAI 推出的 Prompt for developer 课程&#xff0c;总长度大概在一个半小时左右&#xff0c;可以让我们学习正确的 ChatGPT Prompt 工程 虽然课程对话是英文&#xff0c;但有中文字幕&#xff0c;课程地址&#xff1a;https://www.aliyundrive.com/s/…

[Gitops--9]微服务项目sangomall代码配置修改及资源清单文件

微服务项目sangomall代码配置修改及资源清单文件 1. 中间件的地址 1.1 Nacos 集群外 nacos-server.intra.com 192.168.31.211集群内 nacos-server.sangomall.svc.cluster.local. nacos-server.sangomall.svc.cluster.local.:88481.2 Redis 集群内 redis.sangomall.svc.c…

ipad有必要用手写笔吗?电容笔和Apple pencil区别

与Apple Pencil最大的不同之处&#xff0c;在于普通的电容笔并不具备着重力压感&#xff0c;而是会给人一种倾斜的压感。如果不是频繁作画&#xff0c;那就用一支普通的电容笔。这种电容笔不但可以用于办公室&#xff0c;也可以用于记笔记、做练习。再说了&#xff0c;一支苹果…

深入理解 Linux 内核(二)

系列文章目录 Linux 内核设计与实现 深入理解 Linux 内核 深入理解 Linux 内核&#xff08;二&#xff09; Linux 设备驱动程序 Linux设备驱动开发详解 文章目录 系列文章目录五、定时测量1、时钟和定时器电路2、Linux 计时体系结构&#xff08;1&#xff09;计时体系机构的数据…

200G 400G光模块介绍

200G 光模块封装有2种&#xff0c;分别是QSFP56和QSFP-DD。 200G QSFP56有2种光模块&#xff0c;第一种是200G QSFP56 SR4&#xff0c;第二种是200G QSFP56 FR。 200G QSFP56 SR4的封装形式是QSFP56&#xff0c;速率是200G&#xff0c;波长是850nm&#xff0c;最远传输距离是10…

儿童书写台灯哪个牌子比较好?盘点护眼学生用台灯品牌排行

想要拥有一个健康的视力对于我们多么重要&#xff0c;日常生活多么不便利&#xff0c;就是像家里孩子考学时视力也是对于未来专业选择的一个阻碍。 想要孩子不吃近视的苦&#xff0c;从小就要开始抓孩子对于视力和眼睛的呵护。 养成好习惯必须保持一个正确的学习姿势&#xff…

redis 持久化 RDB + AOF

redis 持久化 RDB AOF 1.redis持久化----两种方式 RDB&#xff08;Redis DataBase&#xff09;和AOF&#xff08;Append Only File&#xff09; RDB&#xff0c;简而言之&#xff0c;就是在不同的时间点&#xff0c;将redis存储的数据生成快照并存储到磁盘等介质上 AOF&am…

视频剪辑学习 pr 中视频

2023年中视频学习计划&#xff0c;学习资料全套视频。全网一手资料&#xff0c;有意者V&#xff1a; 第一章- 基础知识 第二章- 素材获取 第三章- 文案创作及搬运改写 第四章- 智能配音与自己配音修音 第五章- 剪辑基础快速入门 手机剪映零基础快速入门 电脑剪映零基础快速入门…

360SEO 360搜索引擎算法的基础知识

360搜索引擎是中国的一家互联网搜索引擎公司&#xff0c;由奇虎360公司推出。作为中国互联网领域的知名品牌之一&#xff0c;它的搜索算法一直备受关注和研究。那360搜索引擎有哪些算法的基础知识呢&#xff1f; 一、概述 360搜索引擎算法是一个非常庞大、复杂的系统&#xff…

科研人的利器:利用New Bing五分钟读完一篇论文

大家好&#xff0c;我是可夫小子&#xff0c;关注AIGC、读书和自媒体。解锁更多ChatGPT、AI绘画玩法。加我&#xff0c;拉你进群。 New Bing『新必应』是微软一款集成了ChatGPT的搜索引擎&#xff0c;它以聊天的方式来进行信息搜索&#xff0c;这不同过去几十年通过对话框搜索信…

Linux之yum原(三)

最近学习Linux&#xff0c;利用 yum 下载软件的时候&#xff0c;总是报错&#xff1a; 错误&#xff1a;为仓库 appstream 下载元数据失败 : Cannot prepare internal mirrorlist: No URLs in mirrorlist因此小编决定更换一下 yum 源&#xff0c;小编用的是 CentOS8.5.2111&am…

Scala Option类型,异常处理,IO,高阶函数

Option类型 实际开发中, 在返回一些数据时, 难免会遇到空指针异常(NullPointerException), 遇到一次就处理一次相对来讲还是比较繁琐的. 在Scala中, 我们返回某些数据时&#xff0c;可以返回一个Option类型的对象来封装具体的数据&#xff0c;从而实现有效的避免空指针异常。S…

记录-对象有哪些继承方式

这里给大家分享我在网上总结出来的一些知识&#xff0c;希望对大家有所帮助 1. 原型链 温故而知新&#xff1a; 构造函数、原型和实例的关系&#xff1a;  每个构造函数都有一个原型对象&#xff0c;原型有一个属性指回构造函数&#xff0c;实例有一个内部指针指向原型。 思考…

【Java校招面试】基础知识(六)——计算机网络

目录 前言一、TCP协议 / UDP协议二、HTTP协议后记 前言 本篇主要介绍计算机网络的相关内容。 “基础知识”是本专栏的第一个部分&#xff0c;本篇博文是第六篇博文&#xff0c;如有需要&#xff0c;可&#xff1a; 点击这里&#xff0c;返回本专栏的索引文章点击这里&#xf…

Leetcode303. 区域和检索 - 数组不可变

Every day a leetcode 题目来源&#xff1a;303. 区域和检索 - 数组不可变 解法1&#xff1a;暴力 代码&#xff1a; class NumArray { public:vector<int> v;NumArray(vector<int> &nums){v nums;}int sumRange(int left, int right){int sum 0;for (in…

ChatGPT镜像网站【免费白嫖】

文章目录 前言说明网站 前言 ChatGPT是一种基于OpenAI GPT&#xff08;Generative Pretrained Transformer&#xff09;模型的聊天机器人&#xff0c;它可以对用户提出的问题做出回答&#xff0c;同时还能够进行精准的语言理解和回复&#xff0c;较好地满足了人们与机器人之间…