一、GUI
1、最简单的GUI
只有一个按钮的GUI
import java.awt.*;
import javax.swing.*;
public class SimpleGUI{
JFrame frame;
Button bt;
public SimpleGUI(){
frame = new JFrame("标题栏内容");
bt = new Button("点我啊");
frame.add(bt);
frame.setSize(800,600);
frame.setVisible(true);
frame.setDefaultCloseOperation(1);
}
public static void main(String[] args){
new SimpleGUI();
}
}
2、局部管理器
(1)BorderLayout
在添加按钮到容器中的时候,可以在后面传入东西南北中的参数,指定他们的布局
将容器划分为东、南、西、北、中五个区域,组件放置在容器的边界位置,组件需添加到指定区域,每个区域只能放置一个组件,但中心区域可随窗口大小变化
import java.awt.*;
import javax.swing.*;
public class TestBorderLayout{
JFrame frame;
JButton east,west,south,north,center;
public TestBorderLayout(){
frame = new JFrame("演示如何使用BorderLayout");
east = new JButton("东邪 - 黄药师");
west = new JButton("西毒 - 欧阳锋");
south = new JButton("南帝 - 段智兴");
north = new JButton("北丐 - 洪七公");
center = new JButton("中神通 - 王重阳");
frame.setLayout(new BorderLayout());
//frame.add(east,"East");
frame.add(west,"West");
//frame.add(south,"South");
frame.add(north,"North");
frame.add(center);
frame.setSize(800,600);
frame.setVisible(true);
frame.setDefaultCloseOperation(3);
}
public static void main(String[] args){
new TestBorderLayout();
}
}
(2)FlowLayout
按照添加顺序从左到右、从上到下流动布局,组件在一行排满后自动换行,直到所有组件添加完毕。默认居中对齐,可通过构造函数设置其他对齐方式,如LEFT(左对齐)、RIGHT(右对齐)等。
import java.awt.*;
import javax.swing.*;
public class TestFlowLayout{
JFrame frame;
JPanel panel;
JLabel lab1,lab2;
JTextField username,password;
JButton register,submit,reset;
public TestFlowLayout(){
frame = new JFrame("演示如何使用FlowLayout");
panel = new JPanel(new FlowLayout());
lab1 = new JLabel("用户名:");
lab2 = new JLabel("密码:");
username = new JTextField(12);
password = new JPasswordField(12);
register = new JButton("注册用户");
submit = new JButton("提交登录");
reset = new JButton("全部重置");
panel.add(lab1);
panel.add(username);
panel.add(lab2);
panel.add(password);
panel.add(register);
panel.add(submit);
panel.add(reset);
frame.add(panel);
frame.setSize(800,80);
frame.setVisible(true);
frame.setDefaultCloseOperation(3);
}
public static void main(String[] args){
new TestFlowLayout();
}
}
(3)GridLayout
将容器分割成纵横分隔的网络,组件按从左到右、从上到下的顺序依次添加到网格中,直到所有组件添加完毕或网格被填满
import java.awt.*;
import javax.swing.*;
public class TestGridLayout{
JFrame frame;
JPanel panel;
JButton[] bts;
public TestGridLayout(){
frame = new JFrame("演示如何使用GridLayout");
panel = new JPanel(new GridLayout(4,9));
bts = new JButton[36];
for(int i = 0;i<bts.length;i++){
bts[i] = new JButton(i<10 ? i+"" : (char)(i+87)+"");
bts[i].setBackground(new Color(255,255,(int)(Math.random()*30)+226));
panel.add(bts[i]);
}
frame.add(panel);
frame.setSize(800,240);
frame.setVisible(true);
frame.setDefaultCloseOperation(3);
}
public static void main(String[] args){
new TestGridLayout();
}
}
3、窗口
frame = new JFrame("点餐窗体");命名了这个窗口的名字。
import java.awt.*;
import javax.swing.*;
public class OrderFrame{
JFrame frame;
JPanel east,south,center,cc,cs;
JLabel title,total,pic;
JButton enter,submit,reset;
List list;
public OrderFrame(){
frame = new JFrame("点餐窗体");
east = new JPanel(new BorderLayout());//东西南北中
south = new JPanel(new FlowLayout());//居中
center = new JPanel(new BorderLayout());
cc = new JPanel(new BorderLayout());
cs = new JPanel(new FlowLayout());
title = new JLabel("海鲜开会 : 880 元");
total = new JLabel("当前总共 : 0 元");
pic = new JLabel(new ImageIcon("海鲜煲.jpg"));
enter = new JButton("我要点这道菜");
submit = new JButton("提交菜单");
reset = new JButton("全部重置");
list = new List();
list.add("餐具");
list.setFont(new Font("宋体",1,18));
east.add(list);
south.add(enter);
south.add(submit);
south.add(reset);
south.add(total);
cs.add(title);
cc.add(pic);
center.add(cs,"South");
center.add(cc,"Center");
frame.add(center,"Center");
frame.add(east,"East");
frame.add(south,"South");
frame.setSize(800,400);
frame.setVisible(true);
frame.setDefaultCloseOperation(3);
}
public static void main(String[] args){
new OrderFrame();
}
}
import java.awt.*;
import javax.swing.*;
public class LoginFrame{
JFrame frame;
JPanel top,center,bottom;
JLabel lab1,lab2,pic;
JTextField username,password;
JButton register,submit,reset;
JButton[] bts;
public LoginFrame(){
frame = new JFrame("易途盛世大酒店 只能点 餐系统 v0.8");
top = new JPanel(new FlowLayout());
center = new JPanel(new BorderLayout());
bottom = new JPanel(new GridLayout(4,9));
lab1 = new JLabel("用户名:");
lab2 = new JLabel("密码:");
pic = new JLabel(new ImageIcon("enter.jpg"));
username = new JTextField(12);
password = new JPasswordField(12);
register = new JButton("注册用户");
submit = new JButton("提交登录");
reset = new JButton("全部重置");
bts = new JButton[36];
for(int i = 0;i<bts.length;i++){
bts[i] = new JButton(i<10 ? i+"" : (char)(i+87)+"");
bottom.add(bts[i]);
}
center.add(pic);
addAll(top,lab1,username,lab2,password,register,submit,reset);
frame.add(top,"North");
frame.add(center);
frame.add(bottom,"South");
frame.setSize(800,600);
frame.setVisible(true);
frame.setDefaultCloseOperation(3);
}
public static void addAll(Container ctn,Component ... cs){
for(Component c : cs){
ctn.add(c);
}
}
public static void main(String[] args){
new LoginFrame();
}
}
4、基础菜单
在 Java 中,Component
是一个类,属于 java.awt
包。它是所有 AWT(Abstract Window Toolkit)组件的基类。AWT 是 Java 提供的一个用于创建图形用户界面(GUI)的工具包。
具体来说,Component
类是所有 GUI 元素的超类,例如按钮、标签、文本框等。这些组件可以添加到容器(如 Panel
、Frame
等)中,以便在窗口中显示和交互。
在我们撰写这样的布局时,需要大量的使用add方法,因此我们不如自己写一个addAll方法,让我们直接可以一次性添加多个工具,这样可以让我们的代码变的更加简介。
import java.awt.*;
import javax.swing.*;
public class TestMenu{
JFrame frame;
JMenuBar bar;
JMenu m1,m2,m3;
JMenuItem mi11,mi12,mi13,mi21,mi22,mi31,mi32;
public TestMenu(){
frame = new JFrame("演示如何使用菜单");
bar = new JMenuBar();
m1 = new JMenu("鲁菜");
m2 = new JMenu("粤菜");
m3 = new JMenu("川菜");
mi11 = new JMenuItem("九转大肠");
mi12 = new JMenuItem("爆炒腰花");
mi13 = new JMenuItem("糖醋鲤鱼");
mi21 = new JMenuItem("龙虎斗");
mi22 = new JMenuItem("果子狸炖水鱼");
mi31 = new JMenuItem("开水白菜");
mi32 = new JMenuItem("毛血旺");
addAll(m1,mi11,mi12,mi13);
addAll(m2,mi21,mi22);
addAll(m3,mi31,mi32);
addAll(bar,m1,m2,m3);
frame.setJMenuBar(bar);
frame.setSize(800,600);
frame.setVisible(true);
frame.setDefaultCloseOperation(3);
}
public void addAll(Container ctn,Component ... cs){
for(Component c : cs){
ctn.add(c);
}
}
public static void main(String[] args){
new TestMenu();
}
}
5、配置文件
我们可以创建这样的文件结构,大包套小包,这样可以通过一个config文件,来实现整个的数据的获取。
import java.io.*;
import java.util.*;
public class TestProperties{
public static void main(String[] args)throws Exception{
Properties pro = new Properties();//Hashtable
pro.load(new InputStreamReader(new FileInputStream("config.properties"),"GBK"));
//System.out.println(pro.getProperty("鲁菜"));//get(k)
Set<String> ks = pro.stringPropertyNames();//keySet()
for(String k : ks){
System.out.println(k);
String fileName = pro.getProperty(k);
Properties pro2 = new Properties();
pro2.load(new InputStreamReader(new FileInputStream(fileName)));
Set<String> ks2 = pro2.stringPropertyNames();
for(String k2 : ks2){
System.out.println(" "+k2+pro2.getProperty(k2));
}
}
}
}
6、动态的菜单栏以及前后端实现
import java.awt.*;
import javax.swing.*;
import java.io.*;
import java.util.*;
public class OrderFrame{
JFrame frame;
JPanel east,south,center,cc,cs;
JLabel title,total,pic;
JButton enter,submit,reset;
java.awt.List list;
public OrderFrame(){
frame = new JFrame("点餐窗体");
createMenu();
east = new JPanel(new BorderLayout());
south = new JPanel(new FlowLayout());
center = new JPanel(new BorderLayout());
cc = new JPanel(new BorderLayout());
cs = new JPanel(new FlowLayout());
title = new JLabel("海鲜煲 : 560 元");
total = new JLabel("当前总共 : 0 元");
pic = new JLabel(new ImageIcon("img/海鲜煲.jpg"));
enter = new JButton("我要点这道菜");
submit = new JButton("提交菜单");
reset = new JButton("全部重置");
list = new java.awt.List();
list.add("餐具");
list.setFont(new Font("宋体",1,18));
east.add(list);
south.add(enter);
south.add(submit);
south.add(reset);
south.add(total);
cs.add(title);
cc.add(pic);
center.add(cs,"South");
center.add(cc,"Center");
frame.add(center,"Center");
frame.add(east,"East");
frame.add(south,"South");
frame.setSize(800,400);
frame.setVisible(true);
frame.setDefaultCloseOperation(3);
}
public void createMenu(){
JMenuBar bar = new JMenuBar();
Properties menuPros = new Properties();
try(InputStreamReader r = new InputStreamReader(new FileInputStream("cfg/config.properties"),"GBK")){
menuPros.load(r);
}catch(Exception e){
e.printStackTrace();
}
Set<String> menuNames = menuPros.stringPropertyNames();
for(String menuName : menuNames){
JMenu menu = new JMenu(menuName);
String fileName = menuPros.getProperty(menuName);
Properties itemPros = new Properties();
try(InputStreamReader r = new InputStreamReader(new FileInputStream("cfg/"+fileName),"GBK")){
itemPros.load(r);
}catch(Exception e){
e.printStackTrace();
}
Set<String> itemNames = itemPros.stringPropertyNames();
for(String itemName : itemNames){
JMenuItem mi = new JMenuItem(itemName);
menu.add(mi);
}
bar.add(menu);
}
frame.setJMenuBar(bar);
}
public static void main(String[] args){
new OrderFrame();
}
}
import java.awt.*;
import javax.swing.*;
public class LoginFrame{
JFrame frame;
JPanel top,center,bottom;
JLabel lab1,lab2,pic;
JTextField username,password;
JButton register,submit,reset;
JButton[] bts;
public LoginFrame(){
frame = new JFrame("易途盛世大酒店 只能点 餐系统 v0.8");
top = new JPanel(new FlowLayout());
center = new JPanel(new BorderLayout());
bottom = new JPanel(new GridLayout(4,9));
lab1 = new JLabel("用户名:");
lab2 = new JLabel("密码:");
pic = new JLabel(new ImageIcon("img/enter.jpg"));
username = new JTextField(12);
password = new JPasswordField(12);
register = new JButton("注册用户");
submit = new JButton("提交登录");
reset = new JButton("全部重置");
bts = new JButton[36];
for(int i = 0;i<bts.length;i++){
bts[i] = new JButton(i<10 ? i+"" : (char)(i+87)+"");
bottom.add(bts[i]);
}
center.add(pic);
addAll(top,lab1,username,lab2,password,register,submit,reset);
frame.add(top,"North");
frame.add(center);
frame.add(bottom,"South");
frame.setSize(800,600);
frame.setVisible(true);
frame.setDefaultCloseOperation(3);
}
public static void addAll(Container ctn,Component ... cs){
for(Component c : cs){
ctn.add(c);
}
}
public static void main(String[] args){
new LoginFrame();
}
}
7、事件监听
BigEye be = new BigEye(); 创建一个监听者
bt.addActionListener(be); 让这个监听者看这个按钮的情况
class BigEye implements ActionListener 创建这个类
public void actionPerformed(ActionEvent ae) 覆盖这个方法(该方法实现监听的具体功能)
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class SimpleGUI{
JFrame frame;
JButton bt;
int time;
long start;
public SimpleGUI(){
frame = new JFrame("标题栏内容");
bt = new JButton("点我啊");
bt.setFont(new Font("宋体",1,50));
BigEye be = new BigEye();
bt.addActionListener(be);
frame.add(bt);
frame.setSize(800,600);
frame.setVisible(true);
frame.setDefaultCloseOperation(1);
}
public static void main(String[] args){
new SimpleGUI();
}
class BigEye implements ActionListener{
@Override
public void actionPerformed(ActionEvent ae){
if(start == 0){
start = System.currentTimeMillis();
}else{
long now = System.currentTimeMillis();
if(now - start > 6000){
JOptionPane.showMessageDialog(frame,"您的APM为:"+time*10);
return;
}
}
time++;
bt.setText("我被点了"+time+"次");
}
}
}