Java做界面思路整理

Posted efine_dxq

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java做界面思路整理相关的知识,希望对你有一定的参考价值。

        说起大一就学过C++,但从未接触过VC++,至于做界面也是直到学java才开始,所以自己还是个新手啊。。。

        步入正题,通过自己写的两个小程序,对做界面的思路进行一下整理。

        首先,构想出自己想要实现的界面是什么样子。可以在纸上画出个轮廓(我是这么干的。。。),尽量详尽,比如点击按钮后的实现一个页面的跳转,跳转之后的页面也画出来。为什么要这样呢?都知道界面是由控件和容器组成的,画的目的就是清楚要用哪些组件,并且根据自己的界面,然后组织容器,再进而组织布局。对于布局可能会比较麻烦一点,这要根据你的窗口是固定不变的大小,还是大小可变的。如果窗口是固定大小,那就好弄点,因为不用考虑窗口大小的改变对组件位置的影响。如果是窗口大小可变的话,就尽量避免使用null布局,null布局我称其为绝对布局(web css里面有绝对布局,当然跟那个不大一样,反正就这么叫了。。。),null布局位置不会改变,采用null布局内的控件大小不会改变,所以窗口可变的话,就很难看了。。。不过根据实际情况,有些地方也是可以用的。布局有很多种,一般都是嵌套使用。每种布局都有自己的优缺点,网格布局可将面板分成n*m的小方格,每个格子中的控件大小一样,并且随着窗口的改变,控件大小跟着变,但相对位置保持不变;流式布局,根据对齐方式不同,可将组件挨个排序,该行排满换行,窗口大小改变后,控件位置就像流水一样顺着动。其他方式还没去具体实践,就不说了。

         然后,构想完界面,声明完控件,然后就开始编界面吧。对于界面,首先是一个Frame框架,对于Frame,可以设置它的标题setTitle();(标题也可以创建的时候在构造函数中确定标题。),然后是窗口大小,这个可能对新手而言很头疼,到底要设置多大呢?其实也很简单,在java核心卷一中讲到一个函数,可以得到该pc窗口的实际大小,根据这个值来调整就行。(代码附下面了。。)然后设置是否可见,关闭属性等。。到这里框架已经建好,下面开始添加容器。

    

		//得到pc窗口大小
                Toolkit kit = Toolkit.getDefaultToolkit();
		Dimension screenSize = kit.getScreenSize();
		int screenWidth = screenSize.width;
  		int screenHeight = screenSize.height;

		frame = new JFrame("Java小课堂");
		frame.setBounds(screenWidth / 3, screenHeight / 4, 450, 300); // 设置位置及大小
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.getContentPane().setBackground(Color.lightGray);
		frame.getContentPane().setLayout(null); // 使用绝对布局
		frame.setResizable(false); // 设置窗口大小不可变

          对于容器也没什么难理解的,如果把框架比作画板,那么容器就相当于画纸,纸是在板表面的,所以有层次之分,重点是你要时刻知道是哪张纸位于最上边。这里的纸就是 JPanel ,跟Frame差不多了,设置大小,设置布局,设置背景颜色,设置位置。其实创建任何一个组件也都是一个套路,位置,大小,内容,颜色等。如果前边做的比较好,那么对于布局,就是一个劲的添东西就行了。

         下面附上两个程序的代码

       

import java.awt.Color;
import java.awt.Frame;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;

import javax.swing.ButtonGroup;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;
import javax.swing.SwingConstants;

public class 第九题 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		MyWindow win = new MyWindow();
		
	}
}

class MyWindow extends Frame implements ActionListener {
	String s , str[] = new String[7];
	File f = new File("E:\\\\", "English.txt");
	FileReader inOne;
	BufferedReader inTwo;
	JButton btn_ans, btn_next, btn_new;
	JCheckBox checkbox[];
	JTextField test, result;
	JLabel Label, Label2;
	ButtonGroup sele = new ButtonGroup();
	
	int score = 0;
	JFrame frame;

	MyWindow() {
		frame = new JFrame("英语测试");
//		frame.setBackground(Color.MAGENTA);
//		frame.getContentPane().setBackground(Color.LIGHT_GRAY);
		frame.setBounds(100, 100, 450, 300);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.getContentPane().setLayout(null);

		btn_next = new JButton("下一题");
		btn_next.setBounds(38, 197, 93, 23);
		frame.getContentPane().add(btn_next);
		btn_next.addActionListener(this);

		btn_ans = new JButton("结果");
		btn_ans.setBounds(166, 197, 93, 23);
		frame.getContentPane().add(btn_ans);
		btn_ans.addActionListener(this);
		 
	    btn_new = new JButton("重做一遍");
		btn_new.setBounds(294, 197, 93, 23);
		frame.getContentPane().add(btn_new);
		btn_new.addActionListener(this);

		
		result = new JTextField();
		result.setBounds(351, 22, 66, 21);
		frame.getContentPane().add(result);
		result.setColumns(10);
		result.setEditable(false);
		result.setFocusable(false);

		Label = new JLabel("分数:");
		Label.setHorizontalAlignment(SwingConstants.CENTER);
		Label.setBounds(290, 24, 54, 15);
		frame.getContentPane().add(Label);

		Label2 = new JLabel("题干:");
		Label2.setBounds(10, 22, 54, 15);
		frame.getContentPane().add(Label2);

		test = new JTextField();
		test.setBounds(0, 47, 434, 29);
		frame.getContentPane().add(test);
		test.setColumns(40);
		test.setEditable(false);
		test.setFocusable(false);

		checkbox = new JCheckBox[4];
		
		for (int i = 0; i <= 3; i++) {
			checkbox[i] = new JCheckBox("New check box");
			sele.add(checkbox[i]);
		}
		checkbox[0].setBounds(61, 100, 103, 23);
	
		checkbox[1].setBounds(61, 151, 103, 23);
	
		checkbox[2].setBounds(224, 100, 103, 23);
	
		checkbox[3].setBounds(224, 151, 103, 23);
		for (int i = 0; i <= 3; i++) {
			frame.getContentPane().add(checkbox[i]);
		}
		
		frame.setVisible(true);

		try {
			inOne = new FileReader(f);
			inTwo = new BufferedReader(inOne);
		} catch (IOException e) {
		}

		getText();
	}

	public void getText() {

		try {
			 s = inTwo.readLine();
			if (!s.contains("endend")) {
				
//				String regex = "#";
				
			    str = s.split("#");
			    
//				for(int i = 0; i < str.length; i++){
//			
//				}
//				char[] ch = new char[s.length()];
//				s.getChars(0, s.length(), ch, 0);
//				int cnt = 0, pos = 0;

//				for (int i = 0; i < s.length(); i++) {
//
//					if (ch[i] == '#') {
//						str[cnt++] = s.substring(pos, i);
//						pos = i + 1;
//					}
//				}
//				str[cnt++] = s.substring(pos, s.length());

				test.setText(str[0]);
				for (int j = 1; j <= 4; j++) {
					checkbox[j - 1].setText(str[j]);
				}
			} else {
				test.setText("学习完毕");
				for (int j = 0; j < 4; j++) {
					checkbox[j].setText("end");
					inTwo.close();
					inOne.close();
				}
			}

		} catch (IOException e) {
			test.setText("文件不存在");
		}
	}

	public void actionPerformed(ActionEvent event) {
		if (event.getSource() == btn_new) {
			score = 0;
			result.setText(s.valueOf(score));
			try {
				inOne = new FileReader(f);
				inTwo = new BufferedReader(inOne);
			} catch (IOException e) {

			}
			for (int j = 0; j < 4; j++) {
				checkbox[j].setEnabled(true);
			}
			btn_ans.setEnabled(true);
			getText();
		}

		if (event.getSource() == btn_next) {
			// 读下一题
			getText();
			for (int j = 0; j < 4; j++) {
				checkbox[j].setEnabled(true);
			}
			btn_ans.setEnabled(true);
		}
		
		if (event.getSource() == btn_ans) {
			for (int j = 0; j < 4; j++) {
				if (checkbox[j].getText().equals(str[5]) && checkbox[j].isSelected()) {
					score++;
					result.setText(s.valueOf(score));
				}
				checkbox[j].setEnabled(false);
			}
			btn_ans.setEnabled(false);
		}
	}
}

第二个

public class Login {
    public  static void main(String[] args){
    	 new MainWindow();
    }
}
import java.awt.*;
import java.awt.event.*;

import javax.swing.*;

@SuppressWarnings("serial")
public class MainWindow extends JFrame {
	// *********************************************
	// 第一步声明程序所需控件
	// *********************************************
	JFrame frame;
	// 上边面板的控件
	JButton btn_add, btn_query_stu, btn_query_cnt;
	JPanel panel_head, panel_add, panel_query_stu, panel_query_cnt;
	// 下面第二个面板的控件
	JLabel label_query_name;
	JTextField text_in;
	JTextArea text_result;
	JButton btn_Ok;
	// 下面第一个面板的控件
	JButton btn_submit;
	JLabel label_name, label_number, label_mark;
	JTextField text_name, text_number, text_mark, text_sta;
	// 下面第三个面板的控件
	JLabel label;
	JTextArea text_cnt;

	public MainWindow() {
		// ********************************
		// 第二步设置 底层窗口属性
		// ********************************
		// 得到当前屏幕的尺寸
		Toolkit kit = Toolkit.getDefaultToolkit();
		Dimension screenSize = kit.getScreenSize();
		int screenWidth = screenSize.width;
		int screenHeight = screenSize.height;
		// frame指底层窗口
		frame = new JFrame("Java小课堂");
		frame.setBounds(screenWidth / 3, screenHeight / 4, 450, 300); // 设置位置及大小
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.getContentPane().setBackground(Color.lightGray);
		frame.getContentPane().setLayout(null); // 使用绝对布局
		frame.setResizable(false); // 设置窗口大小不可变

		// 上层面板
		panel_head = new JPanel();
		panel_head.setBounds(2, 0, 440, 40);
		panel_head.setBackground(Color.lightGray);
		panel_head.setVisible(true);
		panel_head.setLayout(new GridLayout(1, 3, 2, 0));

		btn_add = new JButton("新增");
		btn_add.setFont(new Font("宋体", 1, 12)); // 设置字体 格式 大小
		btn_add.setVisible(true);
		panel_head.add(btn_add);
		btn_add.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				panel_add.setVisible(true);
				panel_query_stu.setVisible(false);
				panel_query_cnt.setVisible(false);
			}
		});

		btn_query_stu = new JButton("查询学生");
		btn_query_stu.setVisible(true);
		panel_head.add(btn_query_stu);
		btn_query_stu.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				panel_add.setVisible(false);
				panel_query_stu.setVisible(true);
				panel_query_cnt.setVisible(false);
			}
		});

		btn_query_cnt = new JButton("及格人数");
		btn_query_cnt.setVisible(true);
		panel_head.add(btn_query_cnt);
		btn_query_cnt.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				panel_add.setVisible(false);
				panel_query_stu.setVisible(false);
				panel_query_cnt.setVisible(true);
				text_cnt.setText(operator.query_num());
			}
		});

		frame.getContentPane().add(panel_head);

		// 下层面板

		Font font = new Font("宋体", 1, 16);

		panel_add = new JPanel();
		panel_add.setBounds(2, 45, 440, 225);
		panel_add.setBackground(Color.lightGray);
		panel_add.setLayout(new GridLayout(4, 2, 20, 20));

		label_number = new JLabel("学号:");
		label_number.setFont(font);
		label_number.setHorizontalAlignment(SwingConstants.CENTER);
		panel_add.add(label_number);

		text_number = new JTextField();
		text_number.setFont(font);
		panel_add.add(text_number);

		label_name = new JLabel("姓名:");
		label_name.setFont(font);
		label_name.setHorizontalAlignment(SwingConstants.CENTER);
		panel_add.add(label_name);

		text_name = new JTextField();
		text_name.setFont(font);
		panel_add.add(text_name);

		label_mark = new JLabel("成绩:");
		label_mark.setFont(font);
		label_mark.setHorizontalAlignment(SwingConstants.CENTER);
		panel_add.add(label_mark);

		text_mark = new JTextField();
		text_mark.setFont(font);
		panel_add.add(text_mark);

		btn_submit = new JButton("提交");
		btn_submit.setFont(font);
		btn_submit.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				String s = text_mark.getText();
				String sta = operator.adds(text_number.getText(),
						text_name.getText(), Double.parseDouble(s));
				if ("添加成功".equals(sta)) {
					text_number.setText(null);
					text_name.setText(null);
					text_mark.setText(null);
				}
				text_sta.setText(sta);
			}
		});
		panel_add.add(btn_submit);

		text_sta = new JTextField();
		panel_add.add(text_sta);

		panel_add.setVisible(true);
		frame.getContentPane().add(panel_add);

		// 下层面板
		panel_query_stu = new JPanel();
		panel_query_stu.setBounds(2, 45, 440, 225);
		panel_query_stu.setBackground(Color.lightGray);
		panel_query_stu.setLayout(null);

		label_query_name = new JLabel("输入要查询的学生姓名:");
		label_query_name.setBounds(10, 10, 150, 40);
		panel_query_stu.add(label_query_name);

		text_in = new JTextField();
		text_in.setBounds(160, 10, 100, 40);
		panel_query_stu.add(text_in);

		text_result = new JTextArea();
		text_result.setBounds(10, 60, 420, 140);
		text_result.setFont(font);
		text_result.setEditable(false);
		panel_query_stu.add(text_result);

		btn_Ok = new JButton("查询");
		btn_Ok.setFont(font);
		btn_Ok.setBounds(300, 10, 100, 40);
		btn_Ok.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				text_result.setText(operator.query_stu(text_in.getText()));
			}
		});
		panel_query_stu.add(btn_Ok);

		panel_query_stu.setVisible(false);
		frame.getContentPane().add(panel_query_stu);

		// // 下层面板
		 panel_query_cnt = new JPanel();
		 panel_query_cnt.setBounds(2, 45, 440, 225);
		 panel_query_cnt.setBackground(Color.lightGray);
		 panel_query_cnt.setLayout(null);
		 
		 label = new JLabel("及格人数为:");
		 label.setBounds(10, 10, 150, 40);
		 label.setFont(font);
		 panel_query_cnt.add(label);
		 
		 text_cnt = new JTextArea();
		 text_cnt.setFont(new Font("宋体",1,30));
		 text_cnt.setBounds(10, 60, 420, 140);
		 panel_query_cnt.add(text_cnt);
		
		 frame.getContentPane().add(panel_query_cnt);
		 panel_query_cnt.setVisible(false);

		// 需添加完组件后设置可见
		frame.setVisible(true); // 设置窗口可见

	}
}

public class operator {
	public static String adds(String number, String name, double mark) {
		sql_operator ops = new sql_operator();
		String datasorce = "javalecture";
		String tableName = "javareport";
		ops.setDatasourceName(datasorce);
		ops.setTableName(tableName);
		ops.setNumber(number);
		ops.setName(name);
		ops.setMark(mark);
		return ops.addRecord();
	}

	public static String query_stu(String name) {
		sql_operator ops = new sql_operator();
		String datasorce = "javalecture";
		String tableName = "javareport";
		ops.setDatasourceName(datasorce);
		ops.setTableName(tableName);
		ops.setName(name);
		return ops.query_stu();
	}
	public static String query_num() {
		sql_operator ops = new sql_operator();
		String datasorce = "javalecture";
		String tableName = "javareport";
		ops.setDatasourceName(datasorce);
		ops.setTableName(tableName);
		return ops.query_cnt();
	}
}


import java.util.*;
import java.sql.*;

public class sql_operator {

	String datasourceName = "";
	String tableName = "";

	String number = "", name = "";
	double mark;

	ArrayList<StringBuffer> queryResult;

	public sql_operator() {
		try {
			Class.forName("com.mysql.jdbc.Driver");

		} catch (ClassNotFoundException e) {
			System.out.println(e);
		}
	}

	public void setDatasourceName(String s) {
		datasourceName = s.trim();
	}

	public void setTableName(String s) {
		tableName = s.trim();
	}

	public void setNumber(String s) {
		number = s.trim();
	}

	public void setName(String s) {
		name = s.trim();
	}

	public void setMark(double m) {
		mark = m;
	}

	public String query_stu() {
		String queryResult = "";
		Connection con;
		PreparedStatement sql;
		ResultSet rs;
		try {
			String uri = "jdbc:mysql://localhost:3306/" + datasourceName
					+ "?characterEncoding=utf8&useSSL=true";
			String id = "root";
			String password = "";
			con = DriverManager.getConnection(uri, id, password);
			
			String insertCondition = "SELECT * FROM " + tableName
					+ " WHERE name=?";
			sql = con.prepareStatement(insertCondition);
			sql.setString(1, name);
			rs = sql.executeQuery();
			while (rs.next()) {
				queryResult = rs.getString(1) + " "+rs.getString(2)+" "
						+ rs.getString(3);
			}
			con.close();
		} catch (SQLException e) {
			return e.toString();
		}
		return queryResult;
	}
	
	public String query_cnt() {
		int cnt = 0;
		Connection con;
		PreparedStatement sql;
		ResultSet rs;
		try {
			String uri = "jdbc:mysql://localhost:3306/" + datasourceName
					+ "?characterEncoding=utf8&useSSL=true";
			String id = "root";
			String password = "";
			con = DriverManager.getConnection(uri, id, password);
			
			String insertCondition = "SELECT COUNT(DISTINCT number) FROM "
					+ tableName + " WHERE mark>=60";
			sql = con.prepareStatement(insertCondition);
			rs = sql.executeQuery();
			// java.sql.SQLException: Before start of result set
			// 解决方法:使用rs.getString();前一定要加上rs.next();

			// 原因:ResultSet对象代表SQL语句执行的结果集,维护指向其当前数据行的光标。
			// 每调用一次next()方法,光标向下移动一行。最初它位于第一行之前,因此第一次调用next()
			// 应把光标置于第一行上,使它成为当前行。随着每次调用next()将导致光标向下移动一行。
			// 在ResultSe对象及其t父辈Statement对象关闭之前,光标一直保持有效。
			while (rs.next()) {
				cnt = rs.getInt(1);
			}
			con.close();
		} catch (SQLException e) {
			return e.toString();
		}
		return String.valueOf(cnt);
	}

	public String addRecord() {
		Connection con;
		PreparedStatement sql;
		try {
			String uri = "jdbc:mysql://localhost:3306/" + datasourceName
					+ "?characterEncoding=utf8&useSSL=true";
			String id = "root";
			String password = "";
			con = DriverManager.getConnection(uri, id, password);
			
			String insertCondition = "INSERT INTO " + tableName
					+ " VALUES (?,?,?)";
			sql = con.prepareStatement(insertCondition);

			if (9 == number.length()&&mark>=0&&mark<=100) {
				sql.setString(1, number);
				sql.setString(2, name);
				sql.setDouble(3, mark);
				int m = sql.executeUpdate();
				if (m != 0) {
					 con.close();
					return "添加成功";
				} else {
					 con.close();
					return "添加失败";
				}
			}else{
				con.close();
				if(9 == number.length()) return "成绩不合法,插入失败";
				else return "学号不合法,插入失败";
			}
		} catch (SQLException e) {
			return e.toString();
		}
	}
}

第二个程序的界面


以上是关于Java做界面思路整理的主要内容,如果未能解决你的问题,请参考以下文章

IOS开发-OC学习-常用功能代码片段整理

如何在 BottomNavigationView 的片段上打开搜索界面?

Java实验代码整理(多线程自定义异常界面)

VS2015 代码片段整理

java-图形用户界面(GUI)之AWT编程-整体思路与代码架构

UI自动化常见精华面试题整理