GUI----图形用户接口(Graphical User Interface)
就是采用图形的方式,进行操作页面的显示
Java提供了两个对GUI的实现:
- AWT(Abstract Window Toolkit,抽象窗体工具包)
- Swing(是后来出现的版本,功能更多,效果更好看,而且Swing是轻量级的)
文章目录
创建可见窗体
使用JFrame frame = new JFrame();
和frame.setVisible(true);
package GUI;
import javax.swing.*;
public class TestGUI {
public static void main(String[] args) {
//1.先创建一个窗体
JFrame frame = new JFrame();
//2.设置窗体的属性状态--从隐藏变为显示
frame.setVisible(true);
}
}
运行后,看电脑屏幕的左上角:
可以通过鼠标把它拉伸:
使右上角按钮真实的关闭
使用frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
这个窗体被创建出来后,右上方的三个按钮都是有用的(最小化,最大化,关闭)
但是关闭按钮的作用实际上不是真的关闭窗体,你看:
还在执行中,实际上他只是把窗体的状态切换回隐藏状态
解决办法:
package GUI;
import javax.swing.*;
public class TestGUI {
public static void main(String[] args) {
JFrame frame = new JFrame();
frame.setVisible(true);
//设置点击关闭按钮,则窗体执行完毕
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}
设置窗体出现的位置和大小
frame.setBounds(500,250,300,300);
这个窗体有点羞涩啊,每次都从左上角出现,这很不好
而且出现时的大小就这么一丢丢,也不好
在Java中坐标系是这么表示的:
解决办法:
package GUI;
import javax.swing.*;
public class TestGUI {
public static void main(String[] args) {
JFrame frame = new JFrame();
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//设置窗体出现时的位置和初始大小
frame.setBounds(500,250,300,300);
//四个参数:窗体左上角的x坐标,窗体左上角的y坐标,width,height
}
}
执行后:
设置窗体的标题
有两种方法:
package GUI;
import javax.swing.*;
public class TestGUI {
public static void main(String[] args) {
//第一种方法:构造JFrame时传的参数就是titile
JFrame frame = new JFrame("第一种设置标题的方法");
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setBounds(500,250,400,300);
}
}
执行后:
package GUI;
import javax.swing.*;
public class TestGUI {
public static void main(String[] args) {
JFrame frame = new JFrame("第一种设置标题的方法");
//第二种方法:
frame.setTitle("第二种设置标题的方法");
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setBounds(500,250,400,300);
}
}
运行后:
添加按钮
package GUI;
import javax.swing.*;
public class TestGUI {
public static void main(String[] args) {
JFrame frame = new JFrame("添加按钮");
//1.创建一个按钮
JButton button = new JButton("我是一个大按钮");
//2.将按钮添加到窗体内
frame.add(button);
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setBounds(500,250,400,300);
}
}
运行后:
一个屏幕都是按钮,真丑啊
添加面板
面板可以在创建多个,是对窗体进行区域分隔的
面板是个无色透明的
package GUI;
import javax.swing.*;
public class TestGUI {
public static void main(String[] args) {
JFrame frame = new JFrame("添加按钮");
JButton button = new JButton("我是一个大按钮");
//1.创建一个面板
JPanel panel = new JPanel();
//2.将面板添加到窗体内
frame.add(panel);
//3.将按钮添加到面板内
panel.add(button);
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setBounds(500,250,400,300);
}
}
运行后:
JPanel和JFrame都有自身的管控组件排布的布局管理规则,JPanel是流式的,JFrame是边界式的
所以才会两次显示不一样
添加文本框
package GUI;
import javax.swing.*;
public class TestGUI {
public static void main(String[] args) {
JFrame frame = new JFrame("添加按钮");
JButton button = new JButton("我是一个大按钮");
JPanel panel = new JPanel();
//1.创建一个文本框
JTextField text = new JTextField("亚索,你一路走好啊");
panel.add(text);
frame.add(panel);
panel.add(button);
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setBounds(500,250,400,300);
}
}
运行后:
我还可以在窗体的文本框中,直接重新输入
文本框的长度还可以设置:
package GUI;
import javax.swing.*;
public class TestGUI {
public static void main(String[] args) {
JFrame frame = new JFrame("添加按钮");
JButton button = new JButton("我是一个大按钮");
JPanel panel = new JPanel();
//参数内传数值,就是设置文本框的长度
JTextField text = new JTextField(20);
panel.add(text);
frame.add(panel);
panel.add(button);
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setBounds(500,250,400,300);
}
}
运行后:
添加密码框,添加标签
package GUI;
import javax.swing.*;
public class TestGUI {
public static void main(String[] args) {
JFrame frame = new JFrame("登录");
JButton button = new JButton("登录");
JTextField text = new JTextField(20);
JPanel panel = new JPanel();
//创建一个密码框
JPasswordField pass = new JPasswordField(20);
//创建两个标签
JLabel lable1 = new JLabel("账户:");
JLabel lable2 = new JLabel("密码:");
frame.add(panel);
panel.add(lable1);
panel.add(text);
panel.add(lable2);
panel.add(pass);
panel.add(button);
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setBounds(500,250,400,300);
}
}
运行结果:
然后我通过鼠标,把窗体拉伸的好看一点:
设置不让窗体可以被鼠标拖拽大小
加一句这个就行frame.setResizable(false);
添加复选框
package GUI;
import javax.swing.*;
public class TestGUI {
public static void main(String[] args) {
JFrame frame = new JFrame("登录");
JButton button = new JButton("登录");
JTextField text = new JTextField(20);
JPanel panel = new JPanel();
JPasswordField pass = new JPasswordField(20);
JLabel lable1 = new JLabel("账户:");
JLabel lable2 = new JLabel("密码:");
//创建三个复选框
JCheckBox box1 = new JCheckBox("抽烟");
JCheckBox box2 = new JCheckBox("喝酒");
JCheckBox box3 = new JCheckBox("烫头");
frame.add(panel);
panel.add(lable1);
panel.add(text);
panel.add(lable2);
panel.add(pass);
panel.add(button);
panel.add(box1);
panel.add(box2);
panel.add(box3);
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setBounds(500,250,300,300);
frame.setResizable(false);
}
}
运行后:
所谓复选框,就是三个按钮,我想选几个就几个
比如,我三个都选
添加单选框
package GUI;
import javax.swing.*;
public class TestGUI {
public static void main(String[] args) {
JFrame frame = new JFrame("登录");
JButton button = new JButton("登录");
JTextField text = new JTextField(20);
JPanel panel = new JPanel();
JPasswordField pass = new JPasswordField(20);
JLabel lable1 = new JLabel("账户:");
JLabel lable2 = new JLabel("密码:");
//创建三个单选框
JRadioButton r1 = new JRadioButton("男");
JRadioButton r2 = new JRadioButton("女");
JRadioButton r3 = new JRadioButton("不可描述");
frame.add(panel);
panel.add(lable1);
panel.add(text);
panel.add(lable2);
panel.add(pass);
panel.add(button);
panel.add(r1);
panel.add(r2);
panel.add(r3);
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setBounds(500,250,300,300);
frame.setResizable(false);
}
}
运行后:
不过有个小问题,现在这还不是单选按钮,因为这三个按钮没有关系,还不是单选;
要将这三个单选框放到一个组里,才能成为单选
package GUI;
import javax.swing.*;
public class TestGUI {
public static void main(String[] args) {
JFrame frame = new JFrame("登录");
JButton button = new JButton("登录");
JTextField text = new JTextField(20);
JPanel panel = new JPanel();
JPasswordField pass = new JPasswordField(20);
JLabel lable1 = new JLabel("账户:");
JLabel lable2 = new JLabel("密码:");
//创建三个单选框
JRadioButton r1 = new JRadioButton("男");
JRadioButton r2 = new JRadioButton("女");
JRadioButton r3 = new JRadioButton("不可描述");
//这三个单选框放到一个组里
ButtonGroup group = new ButtonGroup();//但是这个组本身不是组件
group.add(r1);
group.add(r2);
group.add(r3);
frame.add(panel);
panel.add(lable1);
panel.add(text);
panel.add(lable2);
panel.add(pass);
panel.add(button);
panel.add(r1);
panel.add(r2);
panel.add(r3);
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setBounds(500,250,300,300);
frame.setResizable(false);
}
}
运行后,我选了一个按钮
添加文本域
package GUI;
import javax.swing.*;
public class TestGUI {
public static void main(String[] args) {
JFrame frame = new JFrame("登录");
JButton button = new JButton("登录");
JTextField text = new JTextField(20);
JPanel panel = new JPanel();
JPasswordField pass = new JPasswordField(20);
JLabel lable1 = new JLabel("账户:");
JLabel lable2 = new JLabel("密码:");
JRadioButton r1 = new JRadioButton("男");
JRadioButton r2 = new JRadioButton("女");
JRadioButton r3 = new JRadioButton("不可描述");
ButtonGroup group = new ButtonGroup();
group.add(r1);
group.add(r2);
group.add(r3);
//创建文本域
JTextArea area = new JTextArea(5,20);
//参数:行数,列数
frame.add(panel);
panel.add(lable1);
panel.add(text);
panel.add(lable2);
panel.add(pass);
panel.add(button);
panel.add(r1);
panel.add(r2);
panel.add(r3);
panel.add(area);
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setBounds(500,250,300,300);
frame.setResizable(false);
}
}
运行后:
但是它还存在一个小问题,随着我的输入,他会变大
我给它加个滚动条
package GUI;
import javax.swing.*;
public class TestGUI {
public static void main(String[] args) {
JFrame frame = new JFrame("登录");
JButton button = new JButton("登录");
JTextField text = new JTextField(20);
JPanel panel = new JPanel();
JPasswordField pass = new JPasswordField(20);
JLabel lable1 = new JLabel("账户:");
JLabel lable2 = new JLabel("密码:");
JRadioButton r1 = new JRadioButton("男");
JRadioButton r2 = new JRadioButton("女");
JRadioButton r3 = new JRadioButton("不可描述");
ButtonGroup group = new ButtonGroup();
group.add(r1);
group.add(r2);
group.add(r3);
JTextArea area = new JTextArea(5,20);
//滚动条
JScrollPane pane = new JScrollPane(area);//是滚动条包着文本域
frame.add(panel);
panel.add(lable1);
panel.add(text);
panel.add(lable2);
panel.add(pass);
panel.add(button);
panel.add(r1);
panel.add(r2);
panel.add(r3);
panel.add(pane);//所以这里只添加滚动条即可
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setBounds(500,250,300,300);
frame.setResizable(false);
}
}
运行后:
瞎吉儿输入后:
菜单条,菜单,带单项
package GUI;
import javax.swing.*;
public class TestGUI {
public static void main(String[] args) {
JFrame frame = new JFrame("菜单条,菜单,菜单项");
JPanel panel = new JPanel();
//创建菜单条
JMenuBar bar = new JMenuBar();
//创建三个菜单
JMenu menu1 = new JMenu("File");
JMenu menu2 = new JMenu("Edit");
JMenu menu3 = new JMenu("Navigation");
bar.add(menu1);
bar.add(menu2);
bar.add(menu3);
//创建若干个菜单项
JMenuItem item1 = new JMenuItem("New");
JMenuItem item2 = new JMenuItem("Open");
menu1.add(item1);
menu1.add(item2);
JMenuItem item3 = new JMenuItem("Cut");
JMenuItem item4 = new JMenuItem("Copy");
menu2.add(item3);
menu2.add(item4);
JMenuItem item5 = new JMenuItem("Class...");
menu3.add(item5);
frame.add(panel);
panel.add(bar);
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setBounds(500,250,300,300);
frame.setResizable(false);
}
}
运行后:
将菜单条,直接放置在JFrame上,有不同的表示效果:
package GUI;
import javax.swing.*;
public class TestGUI {
public static void main(String[] args) {
JFrame frame = new JFrame("菜单条,菜单,菜单项");
//创建菜单条
JMenuBar bar = new JMenuBar();
frame.setJMenuBar(bar);
//创建三个菜单
JMenu menu1 = new JMenu("File");
JMenu menu2 = new JMenu("Edit");
JMenu menu3 = new JMenu("Navigation");
bar.add(menu1);
bar.add(menu2);
bar.add(menu3);
//创建若干个菜单项
JMenuItem item1 = new JMenuItem("New");
JMenuItem item2 = new JMenuItem("Open");
menu1.add(item1);
menu1.add(item2);
JMenuItem item3 = new JMenuItem("Cut");
JMenuItem item4 = new JMenuItem("Copy");
menu2.add(item3);
menu2.add(item4);
JMenuItem item5 = new JMenuItem("Class...");
menu3.add(item5);
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setBounds(500,250,300,300);
frame.setResizable(false);
}
}
运行后: