GUI学习

news/2024/9/20 11:51:34

GUI学习

前言:本来不打算学习Gui的,不过最近需要用到还是学习一下吧

1.1 awt 与swing

java的图形化界面的对象存在于awt与swing包中,awt需要调用本地系统方法实现功能,在不同的

平台下显示不同,swing是在awt的基础上实现的一套图形化界面,提供了更多组件,由于全部都适

用java完成,所以在不同平台下显示相同,这就给移植到不同平台提供了可能。

在java gui中,所有的内容都是通过组件实现的。组件和容器

1.2 Frame的使用

package com.ch2;import javax.swing.*;
import java.awt.*;
public class Gui {public static void main(String[] args){Frame frame =new Frame("first gui");frame.setVisible(true);//可视化frame.setSize(300,300);frame.setBackground(new Color(135, 36, 36));//背景颜色frame.setLocation(100,100);//窗口位置frame.setResizable(false);//不能缩放大小}
}

通过上述操作,我们就生成了一个窗口,并设定了大小,背景颜色等

每次都要初始化比较麻烦,我们通过继承进行封装

package com.ch2;import java.awt.*;public class Test {public static void main(String[] args){new Nframe(100,200,300,200);new Nframe(380,200,300,200);new Nframe(700,200,300,200);}
}
class Nframe extends Frame{static int id=0;public Nframe(int x,int y,int w,int h){super("Frame"+id++);this.setVisible(true);this.setBounds(x,y,w,h);this.setBackground(new Color(241, 232, 232));}
}

1.3 Panel的使用

package com.ch2;import javax.swing.*;
import java.awt.*;
public class Gui {public static void main(String[] args) {Frame frame =new Frame();Panel panel=new Panel();frame.setLayout(null);frame.setBackground(Color.red);frame.setBounds(100,100,500,500);panel.setBackground(Color.blue);panel.setBounds(10,10,500,500);frame.add(panel);panel.setVisible(true);frame.setVisible(true);}
}

panel并不像frame一样直接具有可见性,想要利用panel必须将其添加到容器中比如frame我们在

设置panel时 panel.setBounds(10,10,500,500);选定的是相对其父容器的位置,也就是0,0点是该

frame的左上角

1.4 关闭窗口

就比如我们上面的那个窗口,如果我们想要关闭需要怎么操作呢

package com.ch2;import javax.swing.*;
import java.awt.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;public class Gui {public static void main(String[] args) {Frame frame =new Frame();Panel panel=new Panel();frame.setLayout(null);frame.setBackground(Color.red);frame.setBounds(100,100,500,500);panel.setBackground(Color.blue);panel.setBounds(10,10,500,500);frame.add(panel);panel.setVisible(true);frame.setVisible(true);frame.addWindowListener(new WindowAdapter() {@Overridepublic void windowClosing(WindowEvent e) {System.exit(0);}});}
}

向窗口中添加一个窗口监听器,重写在点击关闭键时需要调用的方法,我们这里只需要关闭当前窗

口即可。

1.5 布局方式

流式布局

package com.ch2;import javax.swing.*;
import java.awt.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;public class Gui {public static void main(String[] args) {Frame frame =new Frame();Panel panel=new Panel();frame.setLayout(null);frame.setBackground(new Color(248, 244, 244));frame.setBounds(100,100,500,500);
//        panel.setBackground(Color.blue);
//        panel.setBounds(10,10,500,500);
//        frame.add(panel);
//        panel.setVisible(true);frame.setVisible(true);Button button1 = new Button("Button1");Button button2 = new Button("Button2");frame.add(button1);frame.add(button2);frame.setLayout(new FlowLayout());//流式布局frame.addWindowListener(new WindowAdapter() {@Overridepublic void windowClosing(WindowEvent e) {System.exit(0);}});}
}

当我们向面板中添加比如按钮等组件时(这里先放在窗口中),需要设置组件的布局方式,即这些组件需要放

的位置,通过setLayout(); 来设置,我们先学习流式布局FlowLayout(),按行从上到下进行布局,一行满

了进入下一行,如果不加参数的话,默认情况下在同一行是进行居中放置的。

我们想要靠右可以new FlowLayout(FlowLayout.RIGHT) 靠左同理

东西南北中布局

如果我们想要让组件按东西南北中分布,则可以像下面这样操作

package com.ch2;import javax.swing.*;
import java.awt.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;public class Gui {public static void main(String[] args) {Frame frame =new Frame();Panel panel=new Panel();frame.setBackground(new Color(248, 244, 244));frame.setBounds(100,100,500,500);
//        panel.setBackground(Color.blue);
//        panel.setBounds(10,10,500,500);
//        frame.add(panel);
//        panel.setVisible(true);frame.setVisible(true);Button button1 = new Button("Button1");Button button2 = new Button("Button2");Button button3 = new Button("Button3");Button button4 = new Button("Button4");frame.add(button1, BorderLayout.SOUTH);frame.add(button2, BorderLayout.NORTH);frame.add(button3, BorderLayout.WEST);frame.add(button4, BorderLayout.EAST);frame.addWindowListener(new WindowAdapter() {@Overridepublic void windowClosing(WindowEvent e) {System.exit(0);}});}
}

这种布局只能这样设置

表格布局

package com.ch2;import javax.swing.*;
import java.awt.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;public class Gui {public static void main(String[] args) {Frame frame =new Frame();Panel panel=new Panel();frame.setBackground(new Color(248, 244, 244));frame.setBounds(100,100,500,500);
//        panel.setBackground(Color.blue);
//        panel.setBounds(10,10,500,500);
//        frame.add(panel);
//        panel.setVisible(true);frame.setVisible(true);Button button1 = new Button("Button1");Button button2 = new Button("Button2");Button button3 = new Button("Button3");Button button4 = new Button("Button4");frame.setLayout(new GridLayout(2,2));frame.add(button1);frame.add(button2);frame.add(button3);frame.add(button4);frame.pack();frame.addWindowListener(new WindowAdapter() {@Overridepublic void windowClosing(WindowEvent e) {System.exit(0);}});}
}

frame.setLayout(new GridLayout(2,2));用于设置表格布局,表格布局将容器按我们要求进行划分

比如当前设置的是两行两列,然后按照我们添加顺序对其进行填充。pack()是用于自动调整窗口的大小,以适

应其内容

布局间可以进行组合,通过不同布局的组合来实现不同的布局,比如我们可以这样用:

package com.ch2;import javax.swing.*;
import java.awt.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;public class Gui {public static void main(String[] args) {Frame frame =new Frame();frame.setVisible(true);frame.setBounds(100,100,400,400);frame.setLayout(new GridLayout(2,1));Panel panel1 =new Panel(new BorderLayout());Panel panel2 =new Panel(new GridLayout(2,1));Panel panel3 =new Panel(new GridLayout(2,1));Panel panel4 =new Panel(new BorderLayout());panel1.add(new Button("left"),BorderLayout.EAST);panel1.add(new Button("right"),BorderLayout.WEST);panel4.add(new Button("right"),BorderLayout.WEST);panel4.add(new Button("left"),BorderLayout.EAST);panel2.add(new Button("up"));panel2.add(new Button("down"));panel1.add(panel2,BorderLayout.CENTER);panel3.add(new Button("up"));panel3.add(new Button("down"));panel4.add(panel3,BorderLayout.CENTER);frame.add(panel1);frame.add(panel4);frame.addWindowListener(new WindowAdapter() {@Overridepublic void windowClosing(WindowEvent e) {System.exit(0);}});}
}

1.6事件监听

监听点击事件

package com.ch2;import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;public class Gui {public static void main(String[] args) {Frame frame =new Frame();Button button=new Button("button");//button.addActionListener(e -> System.out.println("111"));button.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {System.out.println("111");}});frame.add(button, BorderLayout.CENTER);frame.setBounds(100,100,300,300);frame.setVisible(true);windowClose(frame);}private static void windowClose(Frame frame){frame.addWindowListener(new WindowAdapter() {@Overridepublic void windowClosing(WindowEvent e) {System.exit(0);}});}
}

我们利用匿名内部类去实现该操作,因为该接口是一个函数接口,所以我们也可以使用lambda表达式去写,

就是注释掉的那里

触发事件时我们重构的函数中的e是事件信息,我们可以自己去设计事件信息,使用setActionComand()

e也有方法去获取该信息 getActionComand()

1.7 输入框

在java中,输入框组件是TextField

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

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

相关文章

AI制图生产力:Midjourney v5和Stable Diffusion Reimagine

随着生成型AI技术的能力提升,越来越多的注意力放在了通过AI模型提升研发效率上。业内比较火的AI模型有很多,比如画图神器Midjourney、用途多样的Stable Diffusion,以及OpenAI此前刚刚迭代的DALL-E 2。对于研发团队而言,尽管Midjourney功能强大且不需要本地安装,但它对于硬…

【编译原理】第六章课后习题(王原生第三版)

前言课本: 编译原理(第三版)[王生原、董渊..等编著] 习题: 主要习题内容是第一章到第八章,具体内容如下表章节 内容 链接第一章 课后部分选择题 https://blog.csdn.net/Zchengjisihan/article/details/136243955第二章 课后部分选择题 https://blog.csdn.net/Zchengjisiha…

【编译原理】第五章课后习题(王原生第三版)

前言课本: 编译原理(第三版)[王生原、董渊..等编著] 习题: 主要习题内容是第一章到第八章,具体内容如下表章节 内容 链接第一章 课后部分选择题 https://blog.csdn.net/Zchengjisihan/article/details/136243955第二章 课后部分选择题 https://blog.csdn.net/Zchengjisiha…

【编译原理】第四章课后习题(王原生第三版)

前言课本: 编译原理(第三版)[王生原、董渊..等编著] 习题: 主要习题内容是第一章到第八章,具体内容如下表章节 内容 链接第一章 课后部分选择题 https://blog.csdn.net/Zchengjisihan/article/details/136243955第二章 课后部分选择题 https://blog.csdn.net/Zchengjisiha…

阿里一面:Redis是单线程,这样回答,面试官口水直流....

Redis 的单线程与多线程之争 为什么 Redis 使用单线程 Redis 单线程为什么还那么快 Redis 6.0 引入多线程的原因 Redis 的网络模型 结语Redis 是单线程的吗?带你全面了解 Redis 内容目录 Redis 的单线程与多线程之争为什么 Redis 使用单线程Redis 单线程为什么还那么快Redis 6…

Mysql-binlog日志-T

my.ini配置文件[mysqld] log_bin = "D:\Software\phpstudy_pro\Extensions\MySQL8.0.12\data" server-id = 1或集成环境中开启 查看binlog状态 show variables like %log_bin%; 查看binlog格式 show variables like binlog_format; 查看binlog文件 SHOW BINARY LOGS;…

【专题】2023中国新母婴人群研究报告PDF合集分享(附原数据表)

原文链接:https://tecdat.cn/?p=34538 原文出处:拓端数据部落公众号 在回归母婴行业主题的背景下,我们发现了一个普遍讨论的热点问题——生育率的下降。随着主要母婴群体和市场环境的变化,母婴行业已经进入存量竞争阶段。为了应对这一挑战,母婴品牌和服务机构需要调整经营…

R语言k-means聚类、层次聚类、主成分(PCA)降维及可视化分析鸢尾花iris数据

原文链接:http://tecdat.cn/?p=22838 最近我们被客户要求撰写关于鸢尾花iris数据集的研究报告,包括一些图形和统计输出。 本练习问题包括:使用R中的鸢尾花数据集(a)部分:k-means聚类使用k-means聚类法将数据集聚成2组。画一个图来显示聚类的情况使用k-means聚类法将数据集…