java swing开发窗体程序开发(一)GUI编程[通俗易懂]

java swing开发窗体程序开发(一)GUI编程[通俗易懂]JavaSWing就是java提供的一个类库专门用于开发窗体程序的,相对于C#的winform,javaswing的开发要比C#更加麻烦,他不像C#拥有可视化的界面编辑工具而是需要像QT一样纯代码式GUI编程。java的好处就是通用性强,跨平台,这个java窗体程序做好之后,哪都可以用。然而C#的winform只能运行在有.net框架上的平台,然而.net支持最好的,也就只有windows…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

Java SWing就是java提供的一个类库专门用于开发窗体程序的,相对于C#的winform,java swing的开发要比C#更加麻烦,他不像C#拥有可视化的界面编辑工具
而是需要像QT一样纯代码式GUI编程。java的好处就是通用性强,跨平台,这个java窗体程序做好之后,哪都可以用。然而C#的winform只能运行在有.net框架上
的平台,然而.net支持最好的,也就只有windows了。C#的开发效率更高

以下讲解Java swing的开发

(一)第一个java swing程序

    public static void main(String[] args)
    { 
   
        //java Swing学习
        //生成窗口
        JFrame windows1=new JFrame("窗口1");
        JFrame windows2=new JFrame("窗口2");
        Container container1=windows1.getContentPane();//获得这个窗口的内容面板
        container1.setBackground(Color.blue);//设置背景颜色
        windows1.setBounds(60,100,188,108);//设置位置大小
        windows2.setBounds(260,100,188,108);
        windows1.setVisible(true);//可视性设置
        windows1.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);//设置按x后的操作.[这个只是关闭那个窗口]
        windows2.setVisible(true);
        windows2.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//设置按x后的操作.[这个是关闭整个程序,将会关闭所有窗口]
    }

需要注意的是,在设置位置和大小时,即setBounds,一共有4个参数,前面两个是坐标信息,即x,y坐标。对于屏幕坐标系,这个坐标原点在屏幕左上角,以下为y正轴,右为x正轴
还有就是DISPOSE_ON_CLOSE EXIT_ON_CLOSE的区别。

运行的效果如下
在这里插入图片描述

(二)带有菜单栏,菜单条,和子菜单的窗体程序

首先要知道几个常见类和函数
JMenuBar:代表菜单条,他需要被设置给JFrame窗体中
JMenu:代表菜单,他需要被放在菜单条中
JMenuItem:代表菜单项,续杯放在菜单中。
Icon:代表图标,使用new ImgeIcon(“文件路径”);//使用绝对路径,这里由于是linux所以没有盘符
常用函数
JFrame:
setJMenuBar(JMenuBar menuBar);//将菜单条设置给窗口
JMenu:
add(JMenuItem);//在菜单中添加菜单项
add(JMenu);//在菜单中添加子菜单
addSoearator();//添加分割线
JMeunItem:
其的双参构造方法:第一个是菜单项名字,第二个是菜单项图标

    /** * 创建一个带菜单条,菜单项,子菜单的窗口 */
    public class MainForm extends JFrame { 
   
        JMenuBar menuBar;//菜单条
        JMenu menu1,menu2,submenu;//菜单
        JMenuItem item1,item2;//菜单项
    
        /** * 创建这个窗口的构造函数 * @param title 窗口名字 * @param posX X坐标 * @param posY Y坐标 * @param width 宽 * @param height 高 */
        public MainForm(String title,int posX,int posY,int width,int height)
        { 
   
            init(title);
            
            //setIconImage();//设置窗体图标
            setLocation(posX,posY);//该函数继承至JFrame用于设置位置
            setSize(width,height);//该函数继承至JFrame用于设置大小
            setVisible(true);//同上,设置可视性
            setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);//同上,设置关闭时的操作
        }
    
        private void init(String title)
        { 
   
            setTitle(title);//继承至JFrame,设置窗口标题
            menuBar =new JMenuBar();//实例化菜单条
            menu1=new JMenu("菜单1");//实例化菜单
            menu2=new JMenu("菜单2");//同上
            submenu=new JMenu("子菜单1");//同上
            item1=new JMenuItem("菜单项1",new ImageIcon("/home/zuikaku/图片/1.png"));//实例化菜单项并设置图标
            item2=new JMenuItem("菜单项2",new ImageIcon("/home/zuikaku/图片/1.png"));//实例化菜单项并设置图标
            item1.setAccelerator(KeyStroke.getKeyStroke('A'));//设置快捷键
            item2.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S,KeyEvent.CTRL_MASK));//设置组合快捷键
            menu1.add(item1);//将菜单项添加入菜单中
            menu1.addSeparator();
            menu1.add(item2);//同上
            menu1.add(submenu);//将菜单加入菜单中,即作为其子菜单
            submenu.add(new JMenuItem("子菜单项1",new ImageIcon("/home/zuikaku/图片/1.png")));//子菜单中添加菜单项
            submenu.add(new JMenuItem("子菜单项2",new ImageIcon("/home/zuikaku/图片/1.png")));//子菜单中添加菜单项
            menuBar.add(menu1);//菜单条中添加菜单
            menuBar.add(menu2);//同上
            setJMenuBar(menuBar);//将该菜单条设置给这个窗口
        }
    
    }

实例化这个MainForm的效果就是
在这里插入图片描述

(三)Java Swing中的常用组件

组件的作用就是与人交互,他们就是用来显示提供给用户的信息或捕捉。这些组件都继承至JComponent
常用的有
JTextField:单行文本输入
JTextArea:多行文本输入
JButton:按钮
JLabel:标签,用于显示提示信息
JCheckBox:复选框
JRadioButton:单选框-需要归组后才能实现单选
JComboBox:下拉列表
JPasswordField:密码框
需要注意的是,这些组件new出来后,是不会显示的,要将其添加add到这个窗体中,才会显示

    /** * 展示java swing中的常见组件 */
    public class UserInputForm extends JFrame{ 
   
        JLabel usernameLabel;
        JLabel passwordLabel;
        JLabel personalInfoLabel;
        JTextField usernameInput;
        JPasswordField passwordInput;
        JTextArea personalInputArea;
        JCheckBox checkBox1;
        JCheckBox checkBox2;
        JRadioButton men;
        JRadioButton women;
        JComboBox<String> countryComboBox;
        ButtonGroup buttonGroup;//用于单选框的归组
        JButton submitBtn;
        public UserInputForm(String title,int posX,int posY,int width,int height)
        { 
   
            init();
            setTitle(title);
            setLocation(posX,posY);
            setSize(width,height);
            setVisible(true);
    
            setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        }
        private void init()
        { 
   
            setLayout(new FlowLayout());//设置布局
            usernameLabel=new JLabel("用户名");
            passwordLabel=new JLabel("密码");
            personalInfoLabel=new JLabel("个人信息");
            usernameInput=new JTextField();
            passwordInput=new JPasswordField();
            personalInputArea=new JTextArea();
            checkBox1=new JCheckBox("哈哈");
            checkBox2=new JCheckBox("嘻嘻");
            men=new JRadioButton("男");
            women=new JRadioButton("女");
            buttonGroup=new ButtonGroup();
            buttonGroup.add(men);
            buttonGroup.add(women);
            countryComboBox=new JComboBox<String>();
            countryComboBox.addItem("下拉选项1");
            countryComboBox.addItem("下拉选项2");
            submitBtn=new JButton("提交");
            //将这些组件加入到这个窗口中-才可以显示
            add(usernameLabel);
            add(passwordLabel);
            add(personalInfoLabel);
            add(usernameInput);
            add(passwordInput);
            add(personalInputArea);
            add(checkBox1);
            add(checkBox2);
            add(men);
            add(women);
            add(countryComboBox);
            add(submitBtn);
        }
    }

效果如下
在这里插入图片描述

(四)常见容器(面板)【中间层容器】

刚刚是将所有的组件添加到继承至JFrame的类中,JFrame叫做底层容器,然而在实际开发和为了更好的使用【例如实现同一个窗口切换选项卡有不同的面板】
这些组件并不是直接添加在底层容器。而是添加到中间层容器。当然,这个中间层容器也必须添加到底层容器JFrame中才会启作用。否则显示不出来
即必须有一个类继承至JFrame,且这个类将面板或是布局,add进去。然后实例化这个继承至JFrame的类,才看的到。
1:JPanel面板:常用JPanel作为一个面板,最普通的面板,向该面板中添加组件。默认布局是FlowLayout
2:JTabbedPane可切换选项卡面板:特点,向该面板中添加组件时,会可以为这个组件添加选项卡。即通过选项卡可以切换不同的组件(也可以是子面板JPanel),相当于,第一个选项卡点击
显示第一个界面,第二个选项卡点击,不开新窗口,就在该窗口上显示第二个界面。使用add(String text,Component c);//这个函数来指定选项卡名字和组件之间的对应关系
选项卡的位置在构造JTabbedPane对象时可以指定,其构造函数参数为int类型,实际是一个静态常量,枚举表示的是选项卡的位置JTabbedPane.Bottom/Top/LEFT/RIGHT
3:JSrollPane滚动面板:其只可以添加一个组件,通常和JTextArea配合使用,作为文本输入栏的滚动条
JScrollPane scroll=new JScrollPanel(new JTextArea());

4:JSplitPane拆分面板:即面板分为两部分,可以按左右分割,左右各一个,也可以按上下分割,上下各一个
构造方法
JSplitPane splitPanel=new JSplitpanel(int a,Component b,Conponent c);
其中a是个静态常量,代表是水平分割还是垂直,分别是JSplitpane.HORIZONTAL_SPLIT和JSplitpane.VERTICAL_SPLIT

5:JLayeredPane分层面板:用于处理组件重叠问题
需要注意的是,这个层并不是可以自己定义,和Unity的OrderInLayer和SortLayer不同。JavaSwing中总共就定义了5层,从低到高,分别是
DEFAULT_LAYER,PALETTE_LAYER,MODAL_LAYER,POPUP_LAYER,DRAG_LAYER
同一位置,高层的会覆盖显示底层的。对于同层的,后来的会覆盖新来的
//使用add(Component, layer)可以添加组件并设置值
setLayer(Component c,int layer));//可以重新设置layer
getLayer(Component c);//可以获得一个组件的Layer

(五)设置布局

即组件在面板上的布局
容器/面板通过调用setLayout(布局对象)来设置布局
1:FlowLayout布局:表示默认居中对齐,使用该布局方式的容器,用add函数向里面加组件,就会根据先后顺序从左向右排列,一行排完后就提行
使用该布局方式,组件自身的setSize将不会有用,要改变大小只能通过setPreferredSize(DimensionpreferredSize)
button.setPreferredSize(new Dimension(20,20)))

该布局方式的对齐方式可以更改,FlowLayout对象调用setAlignment(int align);//使用该函数修改对齐方式,传入的参数是一个静态常量,FlowLayout.LEFT,FlowLayout.CENTER
FlowLayout.RIGHT
2:BorderLayout布局:表示将这个容器划分为5个部分,东西南北中【上下左右中】
中间的区域最大,所加入的组件都应该指明其属于哪一个区域。东南西北中用静态常量表示的:分别是EAST.WEST,SOUTH,NORTH。
//使用方法
容器对象.add(组件对象,BorderLayout.East)

需要注意的是,使用这种布局方式,组件不能超过5个,同一个区域加入过多次组件以最后一次为准。如果一个区域实在需要多个组件
那么就用嵌套的方式,即加个面板进去,再这个面板里面再加组件
3:CardLayout布局:表示其可以添加多个组件,但只能显示一个。这些组件层叠的放在一起,只有最前面可以显示。
顺序并不是栈,而是队列,即第一个添加进去的组件,显示在最前面,后面的一次往后排。且显示出来的组件将会占据该容器的所有空间
使用该种布局的容器在添加组件时
add(String s,Component c)
s只是一个代号,方便以后显示这个组件时找到
cardlayout对象.show(容器对象,代号s)

其实也有快捷方式,如果知道顺序,但未知代号,或者是没有设置代号,可以通过
caradLayout对象.frist(容器对象)的方式,还有last(),next(),previous()的方式
4:GridLayout布局:即格子布局,将容器划分为若干行和若干列,在小格子添加组件
需要注意的是:这些小格子的大小不能改,所有格子强制大小相同,且排列顺序是从左到右,一行排完后再提行
5:null布局:表示空布局
使用时 容器对象.setLayout(null)即可
这种模式下,不限制组件的个数,每个组件都可以设置其自己的大小和位置location。当然组件可以通过setBounds()函数来设置位置和宽高。
通常在容器add©//c代表一个组件。然后c调用自己setBounds来设置
6:Box布局:盒子布局
盒子布局一共有两种,1是水平盒子Box.creatHorizontalBox()。2是垂直盒子Box.creatVerticalBox().
其中水平盒子中添加的组件都是水平排列,垂直盒子中添加的组件都是垂直排列的
想在水平或垂直的组件间添加间距
可以在盒子中Box对象.add(Box.creatHorizontalStrut(10));//创建间距为10的水平间隔,Box.creatVerticalStrut(10)则代表垂直方向上的间隔
以下是一个演示案例

    /** * 格子布局演示 */
    public class GridPanel extends JPanel { 
   
        public GridPanel()
        { 
   
            GridLayout gridLayout=new GridLayout(12,12);//生成格子布局对象。构造时设置格子
            setLayout(gridLayout);//为该panel设置布局
            JLabel [][]labels=new JLabel[12][12];//格子中的组件
            for(int i=0;i<=11;i++)
            { 
   
                for(int j=0;j<=11;j++)
                { 
   
                    labels[i][j]=new JLabel();
                    if((i+j)%2==0)
                        labels[i][j].setText("A");
                    else
                        labels[i][j].setText("B");
                    add(labels[i][j]);//将该组件加入到面板中
                }
            }
        }
    }
    
    /** * 自定义的空布局面板 */
    public class NullPanel extends JPanel { 
   
        JButton button;
        JTextField textField;
        public NullPanel(){ 
   
            setLayout(null);//设置布局类型
            button=new JButton("确定");//实例化组件
            textField=new JTextField();//实例化组件
            //将组件加入该面板
            add(button);
            add(textField);
            //设置他们大小和位置
            textField.setBounds(100,30,90,30);
            button.setBounds(190,30,66,30);
        }
    }
    /** * 用于演示的主面板-其自身也使用了BorderLayout布局 */
    public class MixedForm extends JFrame { 
   
        private GridPanel gridPanel;//自定义的格子面板对象
        private NullPanel nullPanel;//自定义的空布局面板对象
        private JTabbedPane tabbedPane;//选项卡面板
        public MixedForm()
        { 
   
            gridPanel=new GridPanel();//实例化格子面板对象
            nullPanel=new NullPanel();//实例化空布局面板对象
            tabbedPane=new JTabbedPane();//实例化选项卡面板
            //将两个自定义的面板加入到选项卡面板下,通过选项卡可进行切换
            tabbedPane.add("格子布局面板",gridPanel);
            tabbedPane.add("空布局面板",nullPanel);
            //设置这个MixedForm的布局模式为BorderLayout
            setLayout(new BorderLayout());
            //将这个选项卡面板添加入该MixedForm的中区域
            add(tabbedPane,BorderLayout.CENTER);
            //随便填充几个,将东南西北填充完
            add(new JButton("东"),BorderLayout.EAST);
            add(new JButton("南"),BorderLayout.SOUTH);
            add(new JButton("西"),BorderLayout.WEST);
            add(new JButton("北"),BorderLayout.NORTH);
            //设置MixedForm的相关属性
            setBounds(10,10,570,390);
            setVisible(true);
            setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
            //validate();//验证组件,可以有
        }
    }
    //启动类
    public class Main  { 
   
        public static void main(String[] args)
        { 
   
            MixedForm form=new MixedForm();
        }
    }

注意在设置很多布局之后调用一次
void validate()验证此容器及其所有子组件。函数,更新验证。【可以有】
效果如下图
在这里插入图片描述
在这里插入图片描述

盒子布局的展示
代码如下

    public class UserInputPanel extends JFrame { 
   
        private Box userInputBox;//用户输入部分的盒子,主要包含了用户名和密码,垂直排列
        private Box usernameBox;//用户名盒子,包含两个部分,一个label一个TextFiled,水平排列
        private Box passwordBox;//密码盒子,包含两个部分,一个label一个passwordField,水平排列
        private Box buttonBox;//按钮盒子,包含登录和忘记密码两个按钮,水平排列
        private JLabel userNameLabel;//
        private JLabel passwordLabel;//两个label组件提示用户
        private JTextField userNameInput;//用户名输入框
        private JPasswordField passwordInput;//密码输入框
        private JButton loginBtn;//登录按钮
        private JButton forgetPasswordBtn;//忘记密码按钮
        public UserInputPanel()
        { 
   
    
            //实例化所有的对象
            userNameLabel=new JLabel("用户名");
            passwordLabel=new JLabel("密码");
            userNameInput=new JTextField();
            passwordInput=new JPasswordField();
            loginBtn=new JButton("登录");
            forgetPasswordBtn=new JButton("忘记密码");
            userInputBox=Box.createVerticalBox();//内部组件,垂直排列
            buttonBox=Box.createHorizontalBox();//内部组件,水平排列
            usernameBox=Box.createHorizontalBox();//内部组件,水平排列
            passwordBox=Box.createHorizontalBox();//内部组件,水平排列
            //将用户名相关内容加入用户名盒子
            usernameBox.add(userNameLabel);
            usernameBox.add(Box.createHorizontalStrut(10));//输入框与label的横向间隔
            usernameBox.add(userNameInput);
            //将密码相关内容加入密码盒子
            passwordBox.add(passwordLabel);
            passwordBox.add(Box.createHorizontalStrut(10));//输入框和label的横向间距
            passwordBox.add(passwordInput);
            //将用户名盒子和密码盒子加入用户输入userInputBox盒子
            userInputBox.add(usernameBox);
            userInputBox.add(Box.createVerticalStrut(10));//两行之间的间距
            userInputBox.add(passwordBox);
            //将两个按钮加入到按钮盒子
            buttonBox.add(Box.createHorizontalStrut(20));//第一个按钮和左边界的距离
            buttonBox.add(loginBtn);
            buttonBox.add(Box.createHorizontalStrut(10));//两个按钮之间的间距
            buttonBox.add(forgetPasswordBtn);
            //这个面板为空布局
            //设置这两个大盒子userInputBox和buttonBox的位置
            setLayout(null);
            setBounds(50,50,500,400);//该窗口本身的位置和大小
            //加入这两个大Box
            add(userInputBox);
            add(buttonBox);
            //设置这两个大Box的位置和大小
            userInputBox.setBounds(20,20,400,100);
            buttonBox.setBounds(20,200,400,100);
            setVisible(true);
            setDefaultCloseOperation(DISPOSE_ON_CLOSE);
            validate();
        }
    }

执行的效果如下
在这里插入图片描述
就此,界面的相关内容介绍的差不多了。下面介绍最重要的”事件”
可以关注我的博客,观看后续学习记录
下一节:java swing 窗体程序开发(二)事件(Action,Item,Document)
https://blog.csdn.net/tanyu159/article/details/89082367

【!!!】欢迎关注我的个人线上课堂https://www.zuikakuedu.cn,内含JavaWeb与Unity游戏开发实战教程,完全免费!,Csdn博客涉及的课程资料也在该网站上

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/172391.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 无人机超远距离WiFi传输,CV5200无线通信模组,无线音视频传输方案「建议收藏」

    无人机超远距离WiFi传输,CV5200无线通信模组,无线音视频传输方案「建议收藏」在绝大多数任务场合都需要在远离现场的情况下,实时、可靠的观察或获取现场图像及视频,而此时无人机图传系统就会显现出它的重要作用。什么是无人机图传呢?将现场无人机所搭载的摄像机拍摄到的视频以无线方式实时传送到远距离后方的一种无线电子传输产品。因此无人机图传也被称为无人机的“眼睛”。智能cv5200双向无线通信系统,基于802.11无线通信标准,采用自身开发的LR-WiFi(远距离WiFi)私有协议,具备ML,MRC,LDPC,MIMO-OFDM等高级无线技术。具有传输距离远、可组网、抗干扰性强、

  • 申请https域名,证书和部署流程

    申请https域名,证书和部署流程我把申请https域名,证书和部署流程,大致整理了一下。同道中人,以后遇到类似业务,可以参照这个。少踩一下坑!一:相关知识SSL安全套接层(SecureSocketLayer)SSL证书是数字证书的一种,就像是我们平常用的驾驶证和营业执照的电子证书副本一样。因为配置在服务器上,所以被我们称为SSL服务器证书。https://www.wosign.com/faq/faq-…

  • 360自动拦截的防护怎么修改_微信屏蔽投诉按钮代码

    360自动拦截的防护怎么修改_微信屏蔽投诉按钮代码个人有各自不同的编写方法。不必拘泥一格。只要了解原理是访问首页,运行js文件,在JS文件里面调用一个文件,显示网站。JS的写法有很多,比如还有下面的写法:document.write(unescape(unescape(unescape(unescape(unescape(‘%252525253Cframeset%2525252520rows%252525253D%2525252522*%

  • 使用 openssl 生成证书(含openssl详解)「建议收藏」

    使用 openssl 生成证书(含openssl详解)「建议收藏」原文一、openssl简介openssl是目前最流行的SSL密码库工具,其提供了一个通用、健壮、功能完备的工具套件,用以支持SSL/TLS协议的实现。官网:https://www.openssl.org/source/构成部分密码算法库密钥和证书封装管理功能SSL通信API接口用途建立RSA、DH、DSAkey参数建立X.5

  • C++ 使用LockWorkStation()的过程遇到的问题[通俗易懂]

    C++ 使用LockWorkStation()的过程遇到的问题[通俗易懂]关于函数“LockWorkStation()”,参见:https://msdn.microsoft.com/en-us/library/windows/desktop/aa376875.aspxHo

  • 什么是前端架构?[通俗易懂]

    什么是前端架构?[通俗易懂]什么是前端架构

    2022年10月31日

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号