简易考试系统界面搭建
1.任务介绍
本任务要搭建一个考试系统界面。考试题型主要有两类:判断题和单选题,题库是存放在两个二维数组中,要求考试题目能随机生成5到题目,并能通过左边的树形结构选择相应题型来改变右边面板的内容。
2.结果分析
3.实现思路
【窗口实现思路】
设计产生随机数作为存放二维数组的下标,设置组件JLabel存放改下标中题目,设置组件JRadioButton存放选择选择项,将组件JRadioButton存放在组件ButtonGroup将选择像设置为单选。
【阅卷取消思路】
利用ButtonGroup类中的clearSelection清空每组选择的选项
通过已知产生五组题目,即生成一个ButtonGroup[]的组件组,该组的长度为五,通过
Enumeration radioBtns = buttonGroup[i].getElements();
AbstractButton btn = radioBtns.nextElement();
获得每一个ButtonGroup[]中的选择项与答案进行比较。【利用产生题目的随机数组定位答案进行判断】
4.实现代码
Masm_test.java(View)
package exam_test;
import java.awt.EventQueue;
import java.awt.GridLayout;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.ButtonGroup;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.JScrollPane;
import javax.swing.JSplitPane;
import javax.swing.JTree;
import javax.swing.ScrollPaneConstants;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeModel;
public class Masm_test extends JFrame {
private JFrame frame;
JScrollPane scrollPane = new JScrollPane();
JButton jButton[];
JTree tree;
ButtonGroup group[];
My listener;
String[][] question_select = {
{ "Word2010插入题注时如需加入章节号,如“图1-1”,无需进行的操作是()", "将章节起始位置套用内置标题样式", "将章节起始位置应用多级符号", "将章节起始位置应用自动编号",
"自定义题注样式为“图", "将章节起始位置应用自动编号" },
{ "Word2010可自动生成参考文献书目列表,在添加参考文献的“源”主列表时,“源”不可能直接来自于()", "网络中各知名网站", "网上邻居的用户共享", "电脑中的其他文档", "自己录入",
"网上邻居的用户共享" },
{ "WORD文档的编辑限制包括:_______。", "格式设置限制", "编辑限制", "权限保护", "以上都是", "以上都是" },
{ "Word中的手动换行符是通过( )产生的", "插入分页符", "插入分节符", "键入ENTER", "按SHIFT+ENTER", "按SHIFT+ENTER" },
{ "关于Word2010的页码设置,以下表述错误的是( )", "页码可以被插入到页眉页脚区域", "页码可以被插入到左右页边距", "如果希望首页和其他页页码不同必须设置“首页不同”",
"可以自定义页码并添加到构建基块管理器中的页码库中", "页码可以被插入到左右页边距" },
{ "关于导航窗格,以下表述错误的是( )", "能够浏览文档中的标题", "能够浏览文档中的各个页面", "能够浏览文档中的关键文字和词", "能够浏览文档中的脚注、尾注、题注等",
"能够浏览文档中的各个页面" },
{ "关于样式、样式库和样式集,以下表述正确的是( )", "快速样式库中显示的是用户最为常用的样式", "用户无法自行添加样式到快速样式库", "多个样式库组成了样式集", "样式集中的样式存储在模板中",
"快速样式库中显示的是用户最为常用的样式" },
{ "如果WORD文档中有一段文字不允许别人修改,可以通过:_______。", "格式设置限制", "编辑限制", "设置文件修改密码", "以上都是", "编辑限制" },
{ "如果要将某个新建样式应用到文档中,以下哪种方法无法完成样式的应用( )", "使用快速样式库或样式任务窗格直接应用", "使用查找与替换功能替换样式", "使用格式刷复制样式",
"使用CTRL+W快捷键重复应用样式", "使用查找与替换功能替换样式" },
{ "通过设置内置标题样式,以下哪个功能无法实现( )", "自动生成题注编号", "自动生成脚注编号", "自动显示文档结构", "自动生成目录", "自动显示文档结构" } };
String[][] question_judge = { { "dotx格式为启用宏的模板格式,而dotm格式无法启用宏", "对", "错", "错" },
{ "Word2010的屏幕截图功能可以将任何最小化后收藏到任务栏的程序屏幕视图等插入到文档中。", "对", "错", "对" },
{ "Word2010在文字段落样式的基础上新增了图片样式,可自定义图片样式并列入到图片样式库中。", "对", "错", "错" },
{ "WORD中不但提供了对文档的编辑保护,还可以设置对节分隔的区域内容进行编辑限制和保护。", "对", "错", "错" },
{ "按一次TAB键就右移一个制表位,按一次DELETE键左移一个制表位。", "对", "错", "错" }, { "插入一个分栏符能够将页面分为两栏。", "对", "错", "错" },
{ "打印时,在Word2010中插入的批注将与文档内容一起被打印出来,无法隐藏。", "对", "错", "对" }, { "分页符、分节符等编辑标记只能在草稿视图中查看。", "对", "错", "错" },
{ "如果删除了某个分节符,其前面的文字将合并到后面的节中,并且采用后者的格式设置。", "对", "错", "错" },
{ "如果要在更新域时保留原格式,只要将域代码中\\*MERGEFORMAT\\删除即可。", "对", "错", "对" } };
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
Masm_test window = new Masm_test();
Police police = new Police();
window.setMy(police);
window.frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
public Masm_test() {
initialize();
setVisible(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
private void initialize() {
frame = new JFrame();
frame.setBounds(100, 100, 609, 471);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().setLayout(null);
JPanel panel = new JPanel();
panel.setBounds(0, 0, 594, 419);
frame.getContentPane().add(panel);
panel.setLayout(null);
JSplitPane splitPane = new JSplitPane();
splitPane.setBounds(0, 0, 594, 409);
panel.add(splitPane);
jButton = new JButton[2];
jButton[0] = new JButton("确定");
jButton[1] = new JButton("取消");
tree = new JTree();
tree.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
DefaultMutableTreeNode node = (DefaultMutableTreeNode) tree.getLastSelectedPathComponent();
if (node.isRoot()) {
JLabel jLabel = new JLabel();
jLabel.setText("欢迎进入考试系统");
scrollPane.setViewportView(jLabel);
}
if (node.isLeaf()) {
String s = node.getUserObject().toString().trim();
if (s.equals("选择")) {
show(1);
} else {
show(0);
}
}
}
});
tree.setModel(new DefaultTreeModel(new DefaultMutableTreeNode("JTree") {
{
add(new DefaultMutableTreeNode("选择"));
add(new DefaultMutableTreeNode("判断"));
}
}));
splitPane.setLeftComponent(tree);
scrollPane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
splitPane.setRightComponent(scrollPane);
}
void show(int n) {
JLabel lab;
JRadioButton jRadioButton[];
jRadioButton = new JRadioButton[4];
group = new ButtonGroup[5];
int[] a = new int[group.length];
JPanel panel = new JPanel(new GridLayout(group.length + 1, 1, 0, 0));
for (int i = 0; i < group.length; i++) {
a[i] = (int) (Math.random() * (10));
for (int j = 0; j < i; j++) {
if (a[j] == a[i]) {
i--;
}
}
}
listener.setIntA(a);
if (n == 0) {
for (int i = 0; i < group.length; i++) {
JPanel p = new JPanel(new GridLayout(3, 1, 0, 0));
lab = new JLabel(i + 1 + "、" + question_judge[a[i]][0]);
// lab.addActionListener(listener);
group[i] = new ButtonGroup();
p.add(lab);
for (int j = 0; j < 2; j++) {
jRadioButton[j] = new JRadioButton(question_judge[a[i]][j + 1]);
group[i].add(jRadioButton[j]);
p.add(jRadioButton[j]);
// jRadioButton[j].addActionListener(listener);
}
panel.add(p);
}
// scrollPane.setViewportView(panel);
}
if (n == 1) {
// JPanel panel = new JPanel(new GridLayout(6, 1, 0, 0));
for (int i = 0; i < group.length; i++) {
JPanel p = new JPanel(new GridLayout(5, 1, 0, 0));
lab = new JLabel(i + 1 + "、" + question_select[a[i]][0]);
group[i] = new ButtonGroup();
p.add(lab);
for (int j = 0; j < jRadioButton.length; j++) {
jRadioButton[j] = new JRadioButton(question_select[a[i]][j + 1]);
group[i].add(jRadioButton[j]);
p.add(jRadioButton[j]);
// jRadioButton[j].addActionListener(listener);
}
panel.add(p);
}
}
listener.setButtonGroup(group);
scrollPane.setViewportView(panel);
JPanel panel_south = new JPanel();
panel_south.add(jButton[0]);
panel_south.add(jButton[1]);
panel.add(panel_south);
}
void setMy(My listener) {
this.listener = listener;
for (int i = 0; i < jButton.length; i++) {
jButton[i].addActionListener(listener);
}
listener.setJButton(jButton);
listener.setTree(tree);
listener.setquestion_judge(question_judge);
listener.setquestion_select(question_select);
// listener.setJRadioButton(jRadioButton);
}
}
My.java(Model)
package exam_test;
import java.awt.event.ActionListener;
import java.awt.event.MouseListener;
import javax.swing.ButtonGroup;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JRadioButton;
import javax.swing.JTree;
public interface My extends MouseListener, ActionListener {
public void setJButton(JButton jButton[]);
public void setJLabel(JLabel JLabel);
public void setJRadioButton(JRadioButton jRadioButton[]);
public void setButtonGroup(ButtonGroup Group[]);
public void setIntA(int a[]);
public void setquestion_select(String string[][]);
public void setquestion_judge(String string[][]);
void setTree(JTree jTree);
}
Police .java(Controllerl)
package exam_test;
import java.awt.event.ActionEvent;
import java.awt.event.MouseAdapter;
import java.util.Enumeration;
import javax.swing.AbstractButton;
import javax.swing.ButtonGroup;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JRadioButton;
import javax.swing.JTree;
import javax.swing.tree.DefaultMutableTreeNode;
public class Police extends MouseAdapter implements My {
JButton jButton[];
JRadioButton jRadioButton[];
JLabel jLabel;
ButtonGroup buttonGroup[];
JTree jTree;
int a[];
String[][] question_select;
String[][] question_judge;
@Override
public void actionPerformed(ActionEvent e) {
double Mark = 0;
if (e.getActionCommand().equals("确定")) {
DefaultMutableTreeNode node = (DefaultMutableTreeNode) jTree.getLastSelectedPathComponent();
if (node.isLeaf()) {
String s = node.getUserObject().toString().trim();
if (s.equals("选择")) {
for (int i = 0; i < a.length; i++) {
try {
Enumeration<AbstractButton> radioBtns = buttonGroup[i].getElements();
AbstractButton btn = radioBtns.nextElement();
if (question_select[a[i]][5].equals(btn.getText())) {
Mark += 20;
buttonGroup[i].clearSelection();
}
} catch (Exception e2) {
// TODO: handle exception
i++;
}
}
JOptionPane.showMessageDialog(null, "成绩:" + Mark, "成绩", JOptionPane.WARNING_MESSAGE);
} else {
Mark = 0;
for (int i = 0; i < a.length; i++) {
try {
Enumeration<AbstractButton> radioBtns = buttonGroup[i].getElements();
AbstractButton btn = radioBtns.nextElement();
if (question_judge[a[i]][3].equals(btn.getText())) {
Mark += 20;
}
buttonGroup[i].clearSelection();
} catch (Exception e2) {
// TODO: handle exception
}
}
JOptionPane.showMessageDialog(null, "成绩:" + Mark, "成绩", JOptionPane.WARNING_MESSAGE);
}
}
} else {
for (int i = 0; i < buttonGroup.length; i++) {
buttonGroup[i].clearSelection();
}
}
}
@Override
public void setJButton(JButton[] jButton) {
// TODO Auto-generated method stub
this.jButton = jButton;
}
@Override
public void setJLabel(JLabel JLabel) {
// TODO Auto-generated method stub
this.jLabel = jLabel;
}
@Override
public void setJRadioButton(JRadioButton[] jRadioButton) {
// TODO Auto-generated method stub
this.jRadioButton = jRadioButton;
}
@Override
public void setButtonGroup(ButtonGroup[] buttonGroup) {
// TODO Auto-generated method stub
this.buttonGroup = buttonGroup;
}
@Override
public void setTree(JTree jTree) {
// TODO Auto-generated method stub
this.jTree = jTree;
}
@Override
public void setIntA(int[] a) {
// TODO Auto-generated method stub
this.a = a;
}
@Override
public void setquestion_select(String[][] string) {
// TODO Auto-generated method stub
question_select = string;
}
@Override
public void setquestion_judge(String[][] string) {
// TODO Auto-generated method stub
question_judge = string;
}
}
5.总结感悟
根据实验提示选项单选的情况使用ButtonGroup存放选项radioBtns实现单选;根据提示一次出道五题想到获取每组ButtonGroup选择情况与答案进行对比实现“阅卷”。
如何合理的封装程序,实现改变ButtonGroup[]的长度便改变题目的个数,以及将窗口可见的组件做成员变量,窗口不可见的做局部变量传入事件触发后的处理类(Police)中的方法。