Java学习之Swing图形界面
Java提供的Swing组件众多,下面列举其中的几种,本章主要讲解顶层容器,其余容器在下面几章会做讲解。
1、顶层容器
1)顶层容器就是不包含在其他容器中的容器,Swing中常见的顶层容器有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关联的修饰。
方法 | 功能说明 |
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);