在2020的今天,GUI,可能已经是大家耳熟能详的词了。所谓GUI即是用户界面,像我们的QQ,WeChat等等都是以用户界面的形式呈现在我们眼前的。而Java作为一种运用广泛的程序语言,自然在GUI设计上也有其独特之处。下面就以2道常规GUI题来实战一下吧!此次的题目以及代码是我们优秀的冯py同学投稿!大家慢慢欣赏哦!
题1
创建一个可以移动、改变大小、最大化、且可以关闭的JFrame窗口,并且添加菜单和工具条;设计相应的菜单加速键以及快捷键图标。
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
public class test extends JFrame{
//定义菜单
JMenuBar mb = new JMenuBar();
//工具栏对象
JToolBar mtb = new JToolBar();
JMenu mFile = new JMenu("文件(F)");
JMenuItem miNew=new JMenuItem("新建(N)",KeyEvent.VK_N),
miOpen=new JMenuItem("打开(O)...",KeyEvent.VK_O),
miSave=new JMenuItem("保存(S)",KeyEvent.VK_S),
miFont=new JMenuItem("字体与颜色(F)...",KeyEvent.VK_F),
miQuit=new JMenuItem("退出(X)",KeyEvent.VK_X); //菜单选项
//构造函数
test(String sTitle){
super(sTitle);
//添加组件
addMenus();
//设置窗口大小
setSize(500,300);
//设置close按钮操作
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//设置工具栏
addToolBar();
//设置输入框
addTextField();
//添加按钮
addButton();
}
//添加菜单
private void addMenus() {
setJMenuBar(mb);
//设置快捷键
miNew.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_N,InputEvent.CTRL_DOWN_MASK));
miOpen.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_O,InputEvent.CTRL_DOWN_MASK|InputEvent.SHIFT_DOWN_MASK));
mFile.add(miNew); //新建
mFile.add(miOpen); //打开
mFile.add(miSave); //保存
mFile.addSeparator(); //分割线
mFile.add(miFont); //字体和颜色
mFile.addSeparator(); //分割线
mFile.add(miQuit); //退出
mb.add(mFile);
/*//改变窗口坐标
Toolkit tk = getToolkit();//得到一个Toolkit对象
Image icon = tk.getImage("online.gif");
setIconImage(icon);*/
}
//添加工具条
private void addToolBar() {
//工具条
Container c = getContentPane();
c.add(BorderLayout.NORTH,mtb);
mtb.setLayout(new FlowLayout(FlowLayout.LEFT));
FgButton [] btn = {new FgButton("新建文件"),
new FgButton("打开文件"),
new FgButton("保存文件")};
for (int i = 0; i < btn.length; i++) {
btn[1].setBorder(BorderFactory.createEmptyBorder());
mtb.add(btn[i]);
}
//设置不可以浮动
mtb.setFloatable(false);
}
//添加标签和输入框
public void addTextField() {
Container c = getContentPane();
c.setLayout(new FlowLayout());
c.add(new JLabel("用户名:"));
c.add(new JTextField("",15));
c.add(new JLabel("密 码 :"));
c.add(new JPasswordField("",15));
}
//按钮添加
public void addButton() {
Container c=getContentPane();
JButton[] ic = {new JButton("登入")};
c.add(ic[0]);
}
//测试函数
public static void main(String[] args) {
//创建窗口对象
test frm = new test("one");
//显示窗口
frm.setVisible(true);
}
}
//自定义按钮
class FgButton extends JButton{
public FgButton(){
super();
}
//Icon对象用来引入图片
public FgButton(Icon icon,String strToolTipText){
super(icon);
setToolTipText(strToolTipText);
}
public FgButton(String strToolTipText){
setToolTipText(strToolTipText);
}
}
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
public class test extends JFrame{
//定义菜单
JMenuBar mb = new JMenuBar();
//工具栏对象
JToolBar mtb = new JToolBar();
JMenu mFile = new JMenu("文件(F)");
JMenuItem miNew=new JMenuItem("新建(N)",KeyEvent.VK_N),
miOpen=new JMenuItem("打开(O)...",KeyEvent.VK_O),
miSave=new JMenuItem("保存(S)",KeyEvent.VK_S),
miFont=new JMenuItem("字体与颜色(F)...",KeyEvent.VK_F),
miQuit=new JMenuItem("退出(X)",KeyEvent.VK_X); //菜单选项
//构造函数
test(String sTitle){
super(sTitle);
//添加组件
addMenus();
//设置窗口大小
setSize(500,300);
//设置close按钮操作
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//设置工具栏
addToolBar();
//设置输入框
addTextField();
//添加按钮
addButton();
}
//添加菜单
private void addMenus() {
setJMenuBar(mb);
//设置快捷键
miNew.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_N,InputEvent.CTRL_DOWN_MASK));
miOpen.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_O,InputEvent.CTRL_DOWN_MASK|InputEvent.SHIFT_DOWN_MASK));
mFile.add(miNew); //新建
mFile.add(miOpen); //打开
mFile.add(miSave); //保存
mFile.addSeparator(); //分割线
mFile.add(miFont); //字体和颜色
mFile.addSeparator(); //分割线
mFile.add(miQuit); //退出
mb.add(mFile);
/*//改变窗口坐标
Toolkit tk = getToolkit();//得到一个Toolkit对象
Image icon = tk.getImage("online.gif");
setIconImage(icon);*/
}
//添加工具条
private void addToolBar() {
//工具条
Container c = getContentPane();
c.add(BorderLayout.NORTH,mtb);
mtb.setLayout(new FlowLayout(FlowLayout.LEFT));
FgButton [] btn = {new FgButton("新建文件"),
new FgButton("打开文件"),
new FgButton("保存文件")};
for (int i = 0; i < btn.length; i++) {
btn[1].setBorder(BorderFactory.createEmptyBorder());
mtb.add(btn[i]);
}
//设置不可以浮动
mtb.setFloatable(false);
}
//添加标签和输入框
public void addTextField() {
Container c = getContentPane();
c.setLayout(new FlowLayout());
c.add(new JLabel("用户名:"));
c.add(new JTextField("",15));
c.add(new JLabel("密 码 :"));
c.add(new JPasswordField("",15));
}
//按钮添加
public void addButton() {
Container c=getContentPane();
JButton[] ic = {new JButton("登入")};
c.add(ic[0]);
}
//测试函数
public static void main(String[] args) {
//创建窗口对象
test frm = new test("one");
//显示窗口
frm.setVisible(true);
}
}
//自定义按钮
class FgButton extends JButton{
public FgButton(){
super();
}
//Icon对象用来引入图片
public FgButton(Icon icon,String strToolTipText){
super(icon);
setToolTipText(strToolTipText);
}
public FgButton(String strToolTipText){
setToolTipText(strToolTipText);
}
}
题2
设计编写登录窗口,该应用程序维护一张记录合法用户名和密码的列表;只有合法的用户才能通过登录程序;需要实现:1)最多尝试3次;2)登录成功推出登录窗口;3)用户名或密码为空时,提示信息;4)用户名和密码错误时,清空密码,并将用户名选中;5)居中显示窗口。
import javax.swing.*;
import java.awt.event.*;
import java.util.*;
import java.awt.*;
public class TestTextField extends JFrame implements ActionListener{
JTextField t0,t1;
JButton jb;
int count=3;
Map<String, Integer> map=new HashMap<String,Integer>();
//构造函数
public TestTextField(String xTitle){
super(xTitle); //为窗口设置名字
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(250,200); //设置窗口大小
Container c=getContentPane(); //获得窗口容器
c.setLayout(new GridLayout(3,1)); // 为容器设置布局
//用户名panel
JPanel panel1=new JPanel(); //创建小容器
panel1.setLayout(new FlowLayout(FlowLayout.CENTER));//设置小容器的布局
panel1.add(new JLabel("用户名:")); //添加标签
t0=new JTextField("",15);
panel1.add(t0); //添加输入框
c.add(panel1); //把小容器放到大容器中
//密码panel
JPanel panel2=new JPanel(); //创建小容器
panel2.setLayout(new FlowLayout(FlowLayout.CENTER));//设置小容器的布局
panel2.add(new JLabel("密 码:")); //添加标签
t1=new JPasswordField("",15);
panel2.add(t1); //添加输入框
c.add(panel2); //把小容器放到大容器中
//登录按钮panel
JPanel panel3=new JPanel(); //创建小容器
panel3.setLayout(new FlowLayout(FlowLayout.RIGHT));//设置小容器的布局
jb=new JButton("登录");
jb.addActionListener(this); //注册监听者
panel3.add(jb); //添加按钮
c.add(panel3); //把小容器放到大容器中
setVisible(true); //设置可见
map.put("cpt",123456); //列表初始化
map.put("fpy",123456);
}
//接口函数实现
public void actionPerformed(ActionEvent e) {
count--; //测试次数减一
if(count==0) { //若尝试次数超过3次
System.out.println("你没机会了");
System.exit(0);
}
String name=null;
int password=0;
try { //获得用户输入
name=t0.getText();
password=Integer.parseInt(t1.getText());
} catch(NumberFormatException ex){
ex.printStackTrace();
}
String message=test(name, password);//用户名检验
JOptionPane.showMessageDialog(null,message,"信息提示",JOptionPane.INFORMATION_MESSAGE); //输出提示框
}
//检验用户函数
private String test(String name, int password) {
//使用Map内部接口Entry进行迭代
for(Map.Entry<String, Integer> entry: map.entrySet())
{
String key = entry.getKey();
int value = entry.getValue();
if(key.equals(name)){
if("0".equals(String.valueOf(password)) ){
return "用户名或密码为空,还有" + count + "次机会";
}
else if (!(password == value)){
t1.setText("");
return "密码错误,还有" + count + "次机会";
}
else {
System.out.println("登录成功");
System.exit(0);
}
}
}
t1.setText(""); //清空密码
return "用户名是非法的,还有" + count + "次机会";
}
//测试函数
public static void main(String[] args) {
TestTextField a=new TestTextField("登入界面");
}
}
大致效果是酱紫哒!
