簡易考試系統界面搭建
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)中的方法。