Java图形化界面的使用以及案例
关于java的图形化界面的使用的具体细节,又有哪些组件,容器,这么使用这里就不多说了,具体可以参考下面的链接博主写的很超详细
http://blog.csdn.net/xietansheng/article/details/72814492
大家可以按照下面这个图来理解java图形化界面设计
我们直接看案例,用图形化界面做一个用户注册,登陆,及答题的系统(答题只做了界面,功能并没有实现),用户数据用文件存储
用户名输入错以后
登陆成功后
用户注册界面
testSystem类(程序的主函数,login类用户登陆)
package testSystem;
import java.util.*;
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
import java.util.EventListener;
//BorderLayout边界布局管理器 FlowLayout流式布局管理器 JFrame顶层容器
class Login extends JFrame{
public static String name;//定义静态的全局变量
JButton btnLogin,btnRegister,btnCancel;//定义按钮
JPanel pnlSouth,pnlNorth,pnlCenter,pnlCenter1,pnlCenter2;
//定义中间容器
JLabel lbl1,lbl2,lbl3;
//定义标签
JTextField tfName;//定义单行文本框
JPasswordField Pwd;//定义密码输入框
Login(String title){
super(title);
init();
}
//定义构造函数
/**
* 内部类的使用
* @author hp
*
*/
class ButtonListener implements ActionListener{
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
if (e.getSource()==btnLogin)
{
check();
}
else if(e.getSource()==btnRegister)
{
//dispose();
JFrame u=new UserRegister("用户注册:");
u.setBounds(200, 400, 250, 270);
u.setLocationRelativeTo(null);
u.setVisible(true);
}
else
{
dispose();
}
}
}
public void init(){
pnlNorth=new JPanel();
lbl1=new JLabel("欢迎来到登录系统");
Font f=new Font("Dialog",1,18);//定义字体字号大小
lbl1.setFont(f);
lbl1.setForeground(Color.blue);//定义字体颜色
pnlNorth.add(lbl1);
this.add(pnlNorth,BorderLayout.NORTH);
//添加容器到北部
//Center
pnlCenter=new JPanel();
pnlCenter1=new JPanel();
pnlCenter2=new JPanel();
pnlCenter.setLayout(new BorderLayout());
lbl2=new JLabel("用户名");
tfName=new JTextField(10);
pnlCenter1.add(lbl2);
pnlCenter1.add(tfName);
pnlCenter.add(pnlCenter1,BorderLayout.NORTH);
lbl3=new JLabel("密码:");
Pwd=new JPasswordField(10);
Pwd.setEchoChar('*');//设置密码为*;
pnlCenter2.add(lbl3);
pnlCenter2.add(Pwd);
pnlCenter.add(pnlCenter2,BorderLayout.SOUTH);
this.add(pnlCenter,BorderLayout.CENTER);
//添加布局器到中部
//south
pnlSouth=new JPanel();
btnLogin=new JButton("登录");
btnRegister=new JButton("注册");
btnCancel=new JButton("取消");
pnlSouth.add(btnLogin);
pnlSouth.add(btnRegister);
pnlSouth.add(btnCancel);
this.add(pnlSouth,BorderLayout.SOUTH);
this.setBounds(100, 200, 500, 500);
this.pack();//调整此窗口的大小,以适合其子组件的首选大小和布局。
this.setVisible(true);//显示窗体
ButtonListener Listen=new ButtonListener();//注册监听按钮
btnLogin.addActionListener(Listen);//对监听器进行授权
btnRegister.addActionListener(Listen);
btnCancel.addActionListener(Listen);
/***
* 内部匿名类的定义,使用
btnRegister.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
if (e.getSource()==btnLogin)
{
check();
}
else if(e.getSource()==btnRegister)
{
dispose();
JFrame u=new UserRegister("用户注册:");
u.setBounds(200, 400, 250, 270);
u.setLocationRelativeTo(null);
u.setVisible(true);
}
else{}
}
});*/
//居中显示
/*Toolkit kit = Toolkit.getDefaultToolkit(); // 定义工具包
Dimension screenSize = kit.getScreenSize(); // 获取屏幕的尺寸
int screenWidth = screenSize.width/2; // 获取屏幕的宽
int screenHeight = screenSize.height/2; // 获取屏幕的高
int width = this.getWidth();//获取窗口的宽
int height = this.getHeight();//获取窗口的高*/
/*System.out.println(screenWidth);
System.out.println(width);*/
//setLocation(screenWidth, screenHeight);
//setLocation(screenWidth-width/2, screenHeight-height/2);
}
public int check()
{
int j=0;
int count=0;
ArrayList UserNameList=FileMange.ReadFile(0);
ArrayList PassWordList=FileMange.ReadFile(1);
for(int i=0;i<UserNameList.size();i++)
if(tfName.getText().trim().equals(UserNameList.get(i)))
{
count=1;
j=i;
}
if(count==0)
{
JOptionPane.showMessageDialog(this,"用户名不存在");
tfName.setText("");
return 0;
}
if((new String(Pwd.getPassword()).trim().equals(PassWordList.get(j))))
{name=tfName.getText().trim();
JOptionPane.showMessageDialog(this,"登录成功");
JFrame s=new StudentTest("学生在线考试系统");
s.setBounds(700, 700,600,600);
s.setLocationRelativeTo(null);
return 1;}
else
{JOptionPane.showMessageDialog(this, "密码不存在");
Pwd.setText("");
return 0;
}
}
}
public class TestSystem {
public static void main(String[] args) {
// TODO Auto-generated method stub
JFrame f=new Login("用户登录");
f.setResizable(false);//设置其不能最大化
f.setLocationRelativeTo(null);//居中显示
//f.setLocation(100, 100);
//f.setSize(500,500);
//f.setBounds(100, 100, 500,500);
//f.setVisible(true);
/*
JFrame u=new UserRegister("用户注册:");
u.setBounds(200, 400, 250, 270);
u.setLocationRelativeTo(null);
u.setVisible(true);*/
/*
JFrame s=new StudentTest("学生在线考试系统");
s.setBounds(700, 700,600,600);
s.setLocationRelativeTo(null);*/
}
}
UserResgister类(用户注册)
package testSystem;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.*;
import java.util.*;
import javax.swing.*;
class UserRegister extends JFrame{
JLabel lbl1,lbl2,lbl3,lbl4,lbl5,lbl6,lbl7;
JPanel pnlSouth,pnlNorth,pnlCenter,pnlCenter1,
pnlCenter2,pnlCenter3,pnlCenter4,pnlNorth1,pnlEast,pnlWest,pnlSouth1;
JTextField tfName,tfAge;
JPasswordField Pwd,cPwd;//定义密码框
JButton btnRegister,btnReset,btnCancel;
ButtonGroup cgSex;//定义复选框
JRadioButton cm,cf;
JComboBox<String>cclass;//定义下拉框
UserRegister(String title){super(title);init();}
/**
* 设置鼠标点击事件
*/
class ButtonListener implements ActionListener{
@Override
public void actionPerformed(ActionEvent e) {
if(e.getActionCommand()=="注册")
register();
else if(e.getActionCommand()=="重置")
{
tfName.setText("");
Pwd.setText("");
cPwd.setText("");
tfAge.setText("");
}
else dispose();
}
}
public int register()
{
String pwd=new String(Pwd.getPassword()).trim();
String cpwd=new String(cPwd.getPassword()).trim();
ArrayList UserNameList=FileMange.ReadFile(0);
String s="";
String value=cclass.getSelectedItem().toString();
ArrayList slist=new ArrayList();
//String pwd=Pwd.getPassword().toString().trim();
if(!((!tfName.getText().equals(""))&&(!pwd.equals(""))&&(!cm.getText().equals("")
||!cf.getText().equals(""))&&(!tfAge.getText().equals(""))&&(!value.equals(""))))
{
JOptionPane.showMessageDialog(this,"信息没有填完整");
return 0;
}
for(int i=0;i<UserNameList.size();i++)
if(tfName.getText().trim().equals(UserNameList.get(i)))
{
JOptionPane.showMessageDialog(this, "用户名已存在");
return 0;
}
if(pwd.length()<6)
{
JOptionPane.showMessageDialog(this, "密码必须是6位数及以上");
return 0;}
int count1=0;
int count2=0;
for(int j=0;j<pwd.length();j++)
{if(!((pwd.charAt(j)>='0'&&pwd.charAt(j)<='9')||(pwd.charAt(j)>='a'&&pwd.charAt(j)<='z')
||(pwd.charAt(j)>='A'&&pwd.charAt(j)<='Z')))
{
JOptionPane.showMessageDialog(this, "密码必须是由字母和数字组合而成,且密码必须是6位数及以上");
return 0;
}
if(pwd.charAt(j)>='0'&&pwd.charAt(j)<='9')
{
count1=1;
}
else count2=1;
}
if(!(count1==1&&count2==1))
{JOptionPane.showMessageDialog(this, "密码必须是由字母和数字组合而成,且密码必须是6位数及以上");
return 0;}
if(!cpwd.equals(pwd))
{
JOptionPane.showMessageDialog(this,"密码与确认密码不一致");
return 0;
}
slist.add(tfName.getText());
slist.add(pwd);
if(cm.isSelected())
slist.add(cm.getText());
else slist.add(cf.getText());
slist.add(tfAge.getText());
slist.add(value);
for(int i=0;i<slist.size();i++)
s=s+(String)slist.get(i)+" ";
FileMange.WriteFile(s);
//slist.add(cgSex.getSelectedJRadioButton(cgSex))
//slist.add()
//String []SArray=s.split(",");
JOptionPane.showMessageDialog(this, "注册成功");
return 1;
}
public void init(){
pnlNorth=new JPanel();
lbl1=new JLabel("用户注册");
pnlNorth.add(lbl1);
this.add(pnlNorth,BorderLayout.NORTH);
pnlCenter=new JPanel();
pnlCenter1=new JPanel();
pnlCenter2=new JPanel();
pnlCenter3=new JPanel();
pnlCenter.setLayout(new BorderLayout());
lbl2=new JLabel("用户名: ");
tfName=new JTextField(10);
pnlCenter1.add(lbl2);
pnlCenter1.add(tfName);
pnlCenter.add(pnlCenter1,BorderLayout.NORTH);
lbl3=new JLabel("密码: ");
Pwd=new JPasswordField(10);
Pwd.setEchoChar('*');
pnlCenter2.add(lbl3);
pnlCenter2.add(Pwd);
pnlCenter.add(pnlCenter2,BorderLayout.CENTER);
lbl4=new JLabel("确认密码:");
cPwd=new JPasswordField(10);
cPwd.setEchoChar('*');
pnlCenter3.add(lbl4);
pnlCenter3.add(cPwd);
pnlCenter.add(pnlCenter3,BorderLayout.SOUTH);
this.add(pnlCenter,BorderLayout.CENTER);
pnlSouth=new JPanel(new BorderLayout());
pnlNorth1=new JPanel(new BorderLayout());
pnlWest=new JPanel();
pnlEast=new JPanel();
lbl5=new JLabel("性别");
cgSex=new ButtonGroup();
cm=new JRadioButton("男");
cf=new JRadioButton("女");
cgSex.add(cm);
cgSex.add(cf);
pnlWest.add(lbl5);
pnlWest.add(cm);
pnlWest.add(cf);
pnlNorth1.add(pnlWest,BorderLayout.WEST);
lbl6=new JLabel("年龄:");
tfAge=new JTextField(3);
pnlEast.add(lbl6);
pnlEast.add(tfAge);
pnlNorth1.add(pnlEast,BorderLayout.EAST);
pnlSouth.add(pnlNorth1,BorderLayout.NORTH);
pnlCenter4=new JPanel();
lbl7=new JLabel("班级所属:");
String[] sg={"计算机科学与技术01","计算机科学与技术02","物联网03","软件工程04"};
cclass=new JComboBox<String>(sg);//下拉框的使用
pnlCenter4.add(lbl7);
pnlCenter4.add(cclass);
pnlSouth.add(pnlCenter4,BorderLayout.CENTER);
pnlSouth1=new JPanel();
btnRegister=new JButton("注册");
btnReset=new JButton("重置");
btnCancel=new JButton("取消");
pnlSouth1.add(btnRegister);
pnlSouth1.add(btnReset);
pnlSouth1.add(btnCancel);
pnlSouth.add(pnlSouth1,BorderLayout.SOUTH);
this.add(pnlSouth,BorderLayout.SOUTH);
this.pack();
ButtonListener Listen=new ButtonListener();
btnRegister.addActionListener(Listen);
btnReset.addActionListener(Listen);
btnCancel.addActionListener(Listen);
}
}
StudentTest类(用户答题界面)
package testSystem;
import java.awt.*;
import java.util.ArrayList;
import javax.swing.*;
class StudentTest extends JFrame{
JPanel pnlNorth,pnlSouth,pnlCenter,pnlSouth1,pnlNorth1;
JButton Start,Lastq,Nextq,Submit;
JMenu fileMenu,editMenu;
JLabel lbl1,lbl2,lbl3,lbl4,lbl5,lbl6,lbl7;
JTextArea area;
JScrollPane pane;
CheckboxGroup choice;
Checkbox a,b,c,d;
Timer myTimer;
StudentTest(String title){
super(title);init();
}
void init()
{
fileMenu=new JMenu("文件");
editMenu=new JMenu("编辑");
JMenuBar menuBar=new JMenuBar();
menuBar.add(fileMenu);
menuBar.add(editMenu);
JMenuItem tool=new JMenuItem("工具");
fileMenu.add(tool);
JCheckBoxMenuItem casemenuItem=new JCheckBoxMenuItem("区分大小写");
fileMenu.add(casemenuItem);
setJMenuBar(menuBar);
//setSize(300,200);
pnlNorth=new JPanel(new FlowLayout());
lbl1=new JLabel("总的考试时间:100分钟");
pnlNorth.add(lbl1);
lbl2=new JLabel("剩余考试时间:100分钟");
pnlNorth.add(lbl2);
Start =new JButton("开始考试");
pnlNorth.add(Start);
this.add(pnlNorth,BorderLayout.NORTH);
pnlCenter=new JPanel(new FlowLayout());
lbl3=new JLabel("第10题");
lbl4=new JLabel("共10题");
lbl5=new JLabel("考生:");
lbl6=new JLabel(Login.name);
//myTimer=new Timer(1000);
pnlCenter.add(lbl3);
pnlCenter.add(lbl4);
pnlCenter.add(lbl5);
pnlCenter.add(lbl6);
this.add(pnlCenter,BorderLayout.CENTER);
pnlSouth=new JPanel(new BorderLayout());
pnlNorth1=new JPanel();
pnlSouth1=new JPanel(new FlowLayout());
String s="全国计算机等级考试考场规则\n"
+ "(一)、考生于考前30分钟到达考场,入场时主动出示本人准考证和有效身份证件接受考试工作人员核验,并在《上机考场考生签到表》上签名。\n"
+ "(二)、考生只准携带必要的考试文具(如钢笔,圆珠笔等)入场,不得携带任何书籍资料、通讯设备、数据存储设备、智能电子设备等辅助工具及其它未经允许的物品。\n"
+"(三)、考生入场后,应对号入座,并将本人的准考证、有效身份证件放在课桌上。\n"
+"(四)、考生在计算机上输入自己的准考证号,并核验屏幕上显示的姓名、有效身份证件号码,如不相符,应立刻举手,与监考人员取得联系,说明情况。\n"
+"(五)、核验无误后,待监考人员发布“考试开始”的指令后开始作答。\n"
+"(六)、考试开始后,迟到考生不得进入考场。\n"
+"(七)、考试时间由系统自动控制,计时结束后系统将自动退出作答界面。\n"
+"(八)、考生在考场内应保持安静,严格遵守考场纪律。\n"
+"(九)、在考试过程中,如果出现死机或系统错误等,应立刻停止操作,举手与监考人员联系。\n"
+"(十)、考试时,严禁抄录有关试题信息。\n"
+"(十一)、考生点击交卷后,举手与监考人员联系,等监考人员确认考生交卷正常后,方可离开。\n";
area=new JTextArea(s,20,35);
area.setEditable(false);
area.setLineWrap(true);
pane=new JScrollPane(area,JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
pnlNorth1.add(pane);
pnlSouth.add(pnlNorth1,BorderLayout.NORTH);
lbl7=new JLabel("选项");
pnlSouth.add(lbl7);
choice=new CheckboxGroup();
a=new Checkbox("a",choice,true);
b=new Checkbox("b",choice,true);
c=new Checkbox("c",choice,true);
d=new Checkbox("d",choice,true);
pnlSouth1.add(a);
pnlSouth1.add(b);
pnlSouth1.add(c);
pnlSouth1.add(d);
Lastq=new JButton("上一题");
Nextq=new JButton("下一题");
Submit=new JButton("提交");
pnlSouth1.add(Lastq);
pnlSouth1.add(Nextq);
pnlSouth1.add(Submit);
pnlSouth.add(pnlSouth1);
this.add(pnlSouth,BorderLayout.SOUTH);
setVisible(true);
}
}
FileMange类(与文件操作相关)
package testSystem;
import java.io.*;
import java.util.ArrayList;
public class FileMange {
public static void WriteFile(String s) //文件的写入
{
FileWriter fw=null;
BufferedWriter bw=null;
try{
fw=new FileWriter("D:\\java_project\\TestSystem\\src\\testSystem\\user.txt",true);
//使文件写入时不覆盖上一次的内容使其在后面追加
bw=new BufferedWriter(fw);
bw.append(s,0,s.length());
bw.newLine();//写入行分隔符
bw.flush();
}
catch(IOException e){System.out.println("写入文件出错");}
finally{
if(fw!=null){
try {
fw.close();
}
catch (IOException e) {
// TODO Auto-generated catch block
System.out.println("关闭文件出错");
}
}
}
}
public static ArrayList ReadFile(int choce)//文件的读入
{
ArrayList PassWordList=new ArrayList();
String s=new String();
String[] sArray=new String[100];
FileReader fr=null;//创建文件字符流
BufferedReader br=null;//缓冲区读取
//open
try {
fr=new FileReader("D:\\java_project\\TestSystem\\src\\testSystem\\user.txt");
br=new BufferedReader(fr);//创建一个使用默认大小输入缓冲区的缓冲字符输入流
while((s=br.readLine())!=null)//读取一个文本行。包含该行内容的字符串,不包含任何行终止符,如果已到达流末尾,则返回 null 。
{
//System.out.println(s);
//sArray是一个人的信息
sArray=s.split(" ");
PassWordList.add(sArray[choce]);
}
} catch (FileNotFoundException e) {
System.out.print("文件没有找到");
// TODO Auto-generated catch block
}
catch(IOException e)
{
System.out.println("读文件出错");
}finally{
if(fr!=null){
try {
fr.close();
} catch (IOException e) {
// TODO Auto-generated catch block
System.out.println("关闭文件出错");
}
}
}
return PassWordList;
}
}
图形化界面的代码实际上很简单,只要理解清楚它逻辑上的布局(特别是多种布局的嵌套),而具体的组件,复选框或者下拉框等可以直接百度就可以用了,组件并没有特别难以理解的。代码要多敲,仅仅看别人的代码学习是没有用的。