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

第二个程序的界面

时间: 2024-11-03 10:46:34

Java做界面思路整理的相关文章

java多线程面试题整理及答案(2018年)

java多线程面试题整理及答案(2018年) 什么是线程? 线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位.程序员可以通过它进行多处理器编程,你可以使用多线程对 运算密集型任务提速.比如,如果一个线程完成一个任务要100毫秒,那么用十个线程完成改任务只需10毫秒.Java在语言层面对多线程提供了卓越的支 持,它也是一个很好的卖点. 线程和进程有什么区别? 线程是进程的子集,一个进程可以有很多线程,每条线程并行执行不同的任务.不同的进程使用不同的内存空间,而所

java日志的简单整理

最近开始学习java的日志系统管理,发现有好多的日志系统的jar包,感觉很乱,不知道这些jar包的基本功能.上网搜索了几篇文章后,做了一下整理,方便以后查看. 目前的日志系统主要有:commons-loging .log4j .slf4j .LogBack. commons-loging:apache最早提供的日志的门面接口.避免和具体的日志方案直接耦合.类似于JDBC 的api 接口,具体的的JDBC driver 实现由各数据库提供商实现.通过统一接口解耦,不过其内部也实现了一些简单日志方案

Java笔试面试题整理第四波

1.HashMap.HashTable.ConcurrentHashMap的区别 [参考:http://www.cnblogs.com/carbs/archive/2012/07/04/2576995.html] (关于HashMap的分析,在第三篇总结<Java笔试面试题整理第三波>中的hashCode有分析,同样在这篇中有关于Java容器的介绍.HashMap和HashTable都属于Map类集合.) HashMap和HashTable都实现了Map接口,里面存放的元素不保证有序,并且不存

Java Swing界面编程(5)---JLabel中设置图片

package com.beyole.util; import java.awt.Color; import java.io.File; import javax.swing.Icon; import javax.swing.ImageIcon; import javax.swing.JFrame; import javax.swing.JLabel; public class test4 { public static void main(String[] args) { JFrame fra

快速排序思路整理

引言: 快速排序和归并排序是面试当中常常被问到的两种排序算法,在研究过数据结构所有的排序算法后,个人认为最复杂的当属快速排序.从代码量上来看,快速排序并不多,我之所以认为快排难以掌握是因为快排是一种递归算法,同时终止条件较多.如果你刚刚把快排的思路整理过一遍可能觉得不难,然而一个月之后呢? 面试要求的是临场发挥,如果不是烂熟于心,基本就卡壳了.在面试官眼里,你和那些完全不懂快速排序算法的菜逼是一样的,也许实际上你可能私底下已经理解很多遍了,然而并没卵.所以当下问题就是,如何将快排烂熟于心?我觉得

h5的rem代替px做界面的自适应就是這么简单又强大,以及我的一些经历和认识

这两天要把公司以前的触屏设备的客户端应用做成h5的web应用,而且有针对不同设备和同一设备下的不同状态(有windows竖屏和横屏和android的平板),而且都有设计师为其针对的不同设计标准包括字体大小和不同ui组件的大小,虽然当时经过讨论,公司老员工建议就按照這个标准去做,不用考虑自适应,因为设备就这几种,但是我是一直不甘心,总想把它做成能适配不同设备分辨率,所以来研究這个问题. 因为在之前的公司做过的项目中的某些模块参照过别的产品,发现过有用rem和em的,然后就来网上研究学习了解了下这几

【资源】Java学习资料 - 逆天整理 - 精华无密版【最新】【精华】

入门看视频,提高看书籍,飘升做项目.老练研开源,高手读外文,大牛讲低调~  01.Java基础 01.Java 黑马程序员 http://pan.baidu.com/s/1ntkRhBN 链接: http://pan.baidu.com/s/1eQ5yfUM 密码: 9vad 02.传智播客java基础班 http://pan.baidu.com/s/1pJqmFCB 链接: http://pan.baidu.com/s/1mg7THgc 密码: sved 03.传智播客2014上海java培训

GuideActivity.java引导界面:

这是谷歌官方给我们提供的一个兼容低版本安卓设备的软件包,里面包囊了只有在安卓3.0以上可以使用的api. 而viewpager就是其中之一利用它,我们可以做很多事情,从最简单的导航,到页面菜单等等.那如何使用它呢,与LisstView类似,我们也需要一个适配器,他就是PagerAdapter.看一下api的图片, ViewPager的功能就是可以使视图滑动,就像Lanucher左右滑动那样.分三个步骤来使用它: 1.在住布局文件里加入 <android.support.v4.view.ViewP

java面试基础题整理学习

最近投了一些java岗位,面试和笔试的问题更关注基础的掌握,因为基础知识是安身立命以及决定自己上限的东西.结合了网上一些优秀文章,做了如下整理: 1. JDK 和 JRE 有什么区别? JDK:Java Development Kit 的简称,java 开发工具包,提供了 java 的开发环境和运行环境. JRE:Java Runtime Environment 的简称,java 运行环境,为 java 的运行提供了所需环境. 具体来说 JDK 其实包含了 JRE,同时还包含了编译 java 源