基于Java的GUI设计


在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);
        }
}

题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("登入界面");
	}
}

大致效果是酱紫哒!

最终效果


文章作者: Peyton
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Peyton !
  目录