Java Swing框架可以用于开发桌面窗体程序。下面是一个例子,是图论课大作业的UI展示界面。功能是读入课表数据(课程时间、课容量),按照课间通勤人数最小的原则,给课程排教室。
1. 主类:绘制界面
用JPanel的setLayout方法绘制界面,例如:
contentPane.setLayout(new GridLayout(1,2));
表示将contentPane页面分为一行两列。
还有就是组件对象也可以一定对象数组,但是对象数组new出来之后数组的每个对象元素还要再new出来。
例如:
JRadioButton[] jr = new JRadioButton[j1Num+j2Num]; // 单选按钮数组
ActionListener[] ac_jr = new ActionSwitchTime[j1Num+j2Num];// 单选按钮事件监听器
for (i=0; i
完整代码
package gui;
import javax.swing.table.DefaultTableModel;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import baselineFromFile.CourseLoad;
public class GUI {
static final int WIDTH = 1000; // 页面宽度
static final int HEIGHT = 1200; // 页面高度
static public String ctime = "11"; // 当前显示的课表的时间段
static public final String[] head = {"课程名","教学楼","教室号"};// 表头
static public DefaultTableModel model = new DefaultTableModel(); // 表格内容
public static void main(String args[])
{
JFrame jf = new JFrame
("基于二分图染色的教室集中化排课系统 2018年4月17日"); // 顶层容器
jf.setSize(WIDTH, HEIGHT);
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel contentPane = new JPanel(); // 中间容器
contentPane.setLayout(new GridLayout(1,2)); // 总体横向布局
jf.setContentPane(contentPane); // 设置内容面板
// 页面1:左侧页面
JPanel jp1 = new JPanel(); // 左侧页面,放按钮
jp1.setLayout(new GridLayout(1,2)); // 分左右2列
// 左侧页面的子页面
JPanel jp11 = new JPanel();
JPanel jp12 = new JPanel();
jp11.setLayout(new GridLayout(11,1));
jp12.setLayout(new GridLayout(11,1));
jp1.add(jp11);
jp1.add(jp12);
// 文字
JLabel jl = new JLabel("2017-2018春季学期"); // 固定的文字标签
jl.setFont(new Font(null, Font.PLAIN, 25)); // 设置字体
jp11.add(jl);
// 按钮
JButton b_do = new JButton("排课"); // "排课"按钮
b_do.setFont(new Font(null, Font.PLAIN, 20)); // 设置按钮上文字的字体
jp12.add(b_do);
ActionListener ac_do = new ActionDo(); // "排课"按钮事件监听器
b_do.addActionListener(ac_do); // 向事件源"排课"按钮注册
// 单选按钮
int i = 0, j1Num = CourseLoad.FIRSTTABLE.length,
j2Num = CourseLoad.SECONDTABLE.length;
ButtonGroup bg = new ButtonGroup(); // 互斥单选按钮组
JRadioButton[] jr = new JRadioButton[j1Num+j2Num]; // 单选按钮数组
ActionListener[] ac_jr = new ActionSwitchTime[j1Num+j2Num];// 单选按钮事件监听器
for (i=0; i
2. 按钮的响应类:调用排课算法给出计算结果,放在excel文件里
package gui;
import java.awt.event.*;
import baselineFromFile.RunArrangeFromFile;
public class ActionDo implements ActionListener{
public void actionPerformed(ActionEvent e)
{
String dfn = "data.xls";
RunArrangeFromFile.doArrange(dfn);
}
}
3. 单选按钮的响应类:加载不同的excel文件显示每个时间段的排课结果
package gui;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.*;
import jxl.Sheet;
import jxl.Workbook;
import jxl.read.biff.BiffException;
import baselineFromFile.CourseLoad;
public class ActionSwitchTime implements ActionListener
// 根据按下的单选按钮的编号改变ctime即显示的课表的时间段
{
public int i; // 单选按钮编号
public ActionSwitchTime(int ii) // 设置单选按钮的编号
{
i = ii;
}
public void actionPerformed(ActionEvent e) // 根据按钮编号改变课表时间段字符串
{
int len1 = CourseLoad.FIRSTTABLE.length;
if (i < len1)
{
GUI.ctime = CourseLoad.FIRSTTABLE[i];// 左边一列按钮
}
else
{
GUI.ctime = CourseLoad.SECONDTABLE[i-len1]; // 右边一列按钮
}
loadResult(); // 重新加载当前时间段的排课结果
}
public void loadResult() // 根据当前ctime的值从excel文件中加载排课数据
{
String fn = GUI.ctime + ".xls"; // ctime对应的结果的文件名
int i = 0;
try {
File ff = new File(fn);
FileInputStream fis = new FileInputStream(ff);
Workbook wb = Workbook.getWorkbook(fis); // Excel Workbook类
Sheet sheet = wb.getSheet(0); // 标签页,getSheet()里是标签页号
String result[][] = new String[sheet.getRows()][3]; // 初始化result数组大小
for (i=0; i