当前位置: 首页 > article >正文

Java学习之Swing图形界面

Java提供的Swing组件众多,下面列举其中的几种,本章主要讲解顶层容器,其余容器在下面几章会做讲解。

1、顶层容器

1)顶层容器就是不包含在其他容器中的容器,Swing中常见的顶层容器有JFrame,JFrame被称为窗口框架,常见的方法及功能如下

JFrame的方法列表
方法功能说明
JFrame()构造方法,用于创建一个初始时不可见的新窗体
JFrame(String title)构造方法,创建新的、不可见的、指定标题的窗体
frameInit()在构造方法中调用该方法来初始化窗体
add(Component comp)添加组件
setLocation(int x,int y)设置位置坐标,以像素为单位
setSize(int width,int height)设置大小,以像素为单位
setVisible(bollean b)设置是否可见
setContentPane(Container contentPane)设置容器面板
setIconImage(Image image)设置窗体左上角的图标
setDefaultCloseOperation(int operation)设置窗体默认的关闭操作,参数是常量,如EXIT_ON_CLOSE,一般可以不用设置
setTitle(String title)设置标题

比如下面这个代码

package javase;

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

public class test {
	JFrame frame=new JFrame("test");//创建一个新的、不可见的、名为test的窗体
	public test() {
		frame.setLayout(null);
		frame.setResizable(false);//用户不可改变窗口大小,即最大化按钮失效
		//frame.setLocationRelativeTo(null);//设置窗口居中,当设置了全屏时就可以不能要窗口居中
		Dimension screensize=Toolkit.getDefaultToolkit().getScreenSize();//获取屏幕大小
		frame.setUndecorated(true);//设置窗口不可拖动
		frame.setSize(screensize.width,screensize.height);//设置窗口的大小
		frame.setVisible(true);//设置窗口可见
	}
	public static void main(String[] args) {
		EventQueue.invokeLater(()->{//当GUI越来越大的时候可以避免线程之间发生错误
	new test();
		});
	}

}

运行结果为全屏显示的窗体,通过下面这张图可以看出,不仅窗体的标题看不到了,最大化最小化和关闭按钮也看不到了,此时可以通过win+M键退出。设置了全屏就需要设置键盘监听或者时把窗体大小变小一点。(键盘监听链接)

 2)JDialog

JDialog对话框可以分为两种:模式对话框和非模式对话框,所谓的模式对话框就是用户需要等到处理完对话框后才能继续与其他窗口交互的对话框,而非模式对话框是允许用户在处理对话框的同时与其他窗口交互的对话框.

简单来说,就如下图,只有处理完Dialog界面的事件返回test窗口才能继续处理test窗口的事件的对话框是模式对话框,两个界面的事件能同时处理的对话框是非模式对话框。

 代码如下:

package javase;

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

import javax.swing.*;

public class test {
	JFrame frame=new JFrame("test");//创建一个新的、不可见的、名为test的窗体
	JButton btn1=new JButton("模态对话框");
	JButton btn2=new JButton("非模态对话框");
	JButton btn3=new JButton("确定");
	JDialog dialog=new JDialog(frame,"Dialog");//创建Dialog
	JLabel label=new JLabel("标签");
	public test() {
		frame.setLayout(new FlowLayout());//设置窗口的布局管理器
		frame.setSize(500,500);//设置窗口的大小
		frame.setLocation(300, 100);
		dialog.setSize(200,100);
		dialog.setLocation(400, 300);
		dialog.setLayout(new FlowLayout());//设置对话框的布局管理器
		frame.add(btn1);
		frame.add(btn2);
		dialog.add(btn3);
		dialog.add(label);
		frame.setVisible(true);//设置窗口可见
		
		//为“模式对话框”按钮添加点击事件
		btn1.addActionListener(new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent e) {
				// TODO Auto-generated method stub
				dialog.setModal(true);
				label.setText("模式对话框,按确定按钮关闭");
				dialog.setVisible(true);//显示对话框
			}
			
		});
		//为“非模式对话框”按钮添加点击事件
		btn2.addActionListener(new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent e) {
				// TODO Auto-generated method stub
				dialog.setModal(false);
				label.setText("非模式对话框,按确定按钮关闭");
				dialog.setVisible(true);//显示对话框
			}
			
		});
		btn3.addActionListener(new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent e) {
				// TODO Auto-generated method stub
				dialog.setVisible(false);
			}
			
		});
	}
	public static void main(String[] args) {
		EventQueue.invokeLater(()->{//当GUI越来越大的时候可以避免线程之间发生错误
	new test();
		});
	}

}

3)JWindow

JWindow是一个容器,可以显示在用户桌面上的任何位置,它没有标题栏、窗口管理按钮或者其他与JFrame关联的修饰。

JWindow常用方法
方法功能说明
window.add()添加组件
JWindow()没有指定所有者的窗口
JWindow(Frame owner)指定所有者的框架窗口
JWindow(GraphicsConfiguration gc)使用屏幕设备的指定gc创建一个窗口

比如下面这段代码:

package javase;

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

import javax.swing.*;

public class test {
	JFrame frame=new JFrame("test");//创建一个新的、不可见的、名为test的窗体
	JLabel label1=new JLabel("登录界面",JLabel.CENTER);
	JLabel label2=new JLabel("用户名");
	JLabel label3=new JLabel("密码");
	JTextField f1=new JTextField();
	JTextField f2=new JTextField();
	JPanel panel=new JPanel();
	JWindow wd=new JWindow();
	public test() {
		panel.setLayout(null);
		frame.setSize(300,300);//设置窗口的大小
		frame.setLocation(300, 100);
		label1.setBounds(0,0,300,30);
		label2.setBounds(50, 50, 50, 30);
		f1.setBounds(100, 50, 100, 30);
		label3.setBounds(50,100,50,30);
		f2.setBounds(100, 100, 100, 30);
		panel.add(label1);
		panel.add(label2);
		panel.add(label3);
		panel.add(f1);
		panel.add(f2);
		frame.add(panel);
		wd.setSize(400,300);
		wd.setLocationRelativeTo(null);
		wd.add(panel);
		wd.setVisible(true);
	//	frame.setVisible(true);//设置窗口可见
	}
	public static void main(String[] args) {
		EventQueue.invokeLater(()->{//当GUI越来越大的时候可以避免线程之间发生错误
	new test();
		});
	}

}

实现效果如下图,它和JFrame窗口差不多,但是除去了一些修饰,所以窗口无法拖动也无法最大化最小化,其实在JFrame中添加一行代码也能实现这样的效果

frame.setUndecorated(true);

 


http://www.kler.cn/a/17802.html

相关文章:

  • UniApp 应用、页面与组件的生命周期详解
  • MySQL与Oracle对比及区别
  • DataWorks on EMR StarRocks,打造标准湖仓新范式
  • 前端-同源与跨域
  • Appium配置2024.11.12
  • MacOS 本地生成SSH key并关联Github
  • 关于面试官问Qt Connect的链接方式和类型问题
  • jQuery -- 常用API(下)
  • 《Netty》从零开始学netty源码(五十二)之PoolThreadCache
  • SpringBoot整合FreeMarker
  • 使用zabbix监控Windows指定服务| zabbix Windows service filter
  • 【网络】4万字细品TCP协议
  • yolov8 OpenCV DNN 部署 推理报错
  • 科大版中国版ChatGPT来啦!抢先体验
  • 还能这么玩?清华给 ChatGPT 做逆向,发现了 ChatGPT 的进化轨迹!
  • 记一次产线打印json导致的redis连接超时
  • 【算法】Check If Word Is Valid After Substitutions 检查替换后的词是否有效
  • MySQL高频面试题
  • 多通道振弦传感器无线采集仪通过短信和FTP文件修改参数
  • 设计原则之【接口隔离原则】
  • 22.Java多线程
  • SpreadJS 16.1 EN + SpreadJS 16.1 CN Crack
  • 【Linux】linux进程间通信netlink socket(用户与内核通信)
  • PBDB Data Service:Special parameters(特殊参数)
  • 公司新来的00后真是卷王,工作没2年,跳槽到我们公司起薪18K都快接近我了
  • JAVA原生语言开发多学校Saas模式校园管理系统