四则运算GUI版本
要求:用户界面新增支持 Windows GUI,同时保留原有命令行下所有功能。提示: 先测试驱动开发,然后重构代码,以GUI为目标修改"核心"函数,把与GUI/Console相关的部分提取出来
在原来实现四则运算的基础上通过java中的Swing组件实现了GUI版本
GUI的实现代码如下
public class CalMachineSwingBuild extends JFrame { private JPanel contentPane; private JComboBox comboBox; private JLabel lblNewLabel; private JTextField textField; private JLabel lblNewLabel_1; private ArrayList<String> questionList=new ArrayList<String>(); private ArrayList<JTextField> answersByUser = new ArrayList<JTextField>(); //存放用户填写的答案的文本域 private ArrayList<String> RealAnswerList=new ArrayList<String>(); //存放真正的答案 private String strAnswerAndResult[]=new String[2]; private JLabel label_1; private JLabel lblNewLabel_3; private JButton submitButton; private JPanel panelNorth; private JPanel panelCenter; private JPanel panelSouth; private static int numOfQuestion; //问题的数量 private String itemValue; //难度级别 private String recordWrong=" "; private String userName; private int countWrong=0; /** * Launch the application. */ public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { public void run() { try { CalMachineSwingBuild frame = new CalMachineSwingBuild(); frame.setVisible(true); } catch (Exception e) { e.printStackTrace(); } } }); } /** * Create the frame. */ public CalMachineSwingBuild() { setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setBounds(100, 100, 800, 600); contentPane = new JPanel(); contentPane.setBorder(new EmptyBorder(5, 5, 5, 5)); setContentPane(contentPane); contentPane.setLayout(new BorderLayout(0, 0)); panelNorth=new JPanel(); JLabel label = new JLabel("难度值"); label.setBounds(10, 10, 42, 15); panelNorth.add(label); //contentPane.add(label); comboBox = new JComboBox(); comboBox.addItem("简单"); comboBox.addItem("普通"); comboBox.addItem("复杂"); comboBox.setBounds(62, 7, 50, 100); comboBox.setEditable(false); comboBox.setSize(60, 20); panelNorth.add(comboBox); // contentPane.add(comboBox); lblNewLabel = new JLabel("题目数量"); lblNewLabel.setBounds(144, 10, 62, 15); panelNorth.add(lblNewLabel); // contentPane.add(lblNewLabel); textField = new JTextField(); textField.setBounds(216, 7, 46, 21); // contentPane.add(textField); textField.setColumns(10); panelNorth.add(textField); JButton btnNewButton = new JButton("开始出题"); btnNewButton.setBounds(272, 6, 93, 23); /* labelForSpec=new JLabel(); panelNorth.add(labelForSpec);*/ panelNorth.add(btnNewButton); contentPane.add(panelNorth,BorderLayout.NORTH); panelSouth=new JPanel(); lblNewLabel_1 = new JLabel(); //用作提示 submitButton = new JButton("提交答案");//提交按钮 panelSouth.add(lblNewLabel_1); panelSouth.add(submitButton); contentPane.add(panelSouth,BorderLayout.SOUTH); panelCenter=new JPanel(); contentPane.add(panelCenter,BorderLayout.CENTER); panelCenter.setLayout(new MigLayout("", "[][grow]", "[][]")); btnNewButton.addMouseListener(new MouseAdapter() { @Override public void mouseClicked(MouseEvent event) { repaint(); //重新展示界面 panelCenter.removeAll(); questionList.clear(); answersByUser.clear(); Pattern pattern = Pattern.compile("^+?[1-9][0-9]*$"); Matcher isNum = pattern.matcher(textField.getText()); if(!isNum.matches()){ lblNewLabel_1.setText("输入的题目数必须为整数!"); }else{ lblNewLabel_1.setText(""); itemValue=(String) comboBox.getSelectedItem(); numOfQuestion=Integer.parseInt(textField.getText()); CalMachine cm=new CalMachine(); CalculateMachine04 cm04=new CalculateMachine04(); switch(itemValue){ case "简单": questionList=(ArrayList<String>) cm.addBracketTest(numOfQuestion); for(int i=0;i<questionList.size();i++){ JLabel questionBar = new JLabel(); panelCenter.add(questionBar, "cell 0 " + i + ",alignx trailing"); JTextField answerBar = new JTextField("", 10); panelCenter.add(answerBar, "cell 1 " + i + " ,alignx trailing"); strAnswerAndResult=questionList.get(i).split("="); //前者为问题,后者为答案 questionBar.setText("question"+(i+1)+": "+strAnswerAndResult[0]); RealAnswerList.add(strAnswerAndResult[1]); //存放真正的答案 answersByUser.add(answerBar); } break; case "普通": questionList=(ArrayList<String>) cm.generateSimpleQuestion(numOfQuestion); for(int i=0;i<questionList.size();i++){ JLabel questionBar = new JLabel(); panelCenter.add(questionBar, "cell 0 " + i + ",alignx trailing"); JTextField answerBar = new JTextField("", 10); panelCenter.add(answerBar, "cell 1 " + i + " ,alignx trailing"); strAnswerAndResult=questionList.get(i).split("="); //前者为问题,后者为答案 questionBar.setText("question"+(i+1)+": "+strAnswerAndResult[0]); RealAnswerList.add(strAnswerAndResult[1]); //存放真正的答案 answersByUser.add(answerBar); } break; case "复杂": questionList=(ArrayList<String>) cm04.generateComplexQuestion(numOfQuestion); for(int i=0;i<questionList.size();i++){ JLabel questionBar = new JLabel(); panelCenter.add(questionBar, "cell 0 " + i + ",alignx trailing"); JTextField answerBar = new JTextField("", 10); panelCenter.add(answerBar, "cell 1 " + i + " ,alignx trailing"); strAnswerAndResult=questionList.get(i).split("="); //前者为问题,后者为答案 questionBar.setText("question"+(i+1)+": "+strAnswerAndResult[0]); RealAnswerList.add(strAnswerAndResult[1]); //存放真正的答案 answersByUser.add(answerBar); } break; } System.out.println(); } } }); //提交判断 submitButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { for(int i=0;i<numOfQuestion;i++){ if(!answersByUser.get(i).getText().trim().equals(RealAnswerList.get(i))){ //用户答错了 recordWrong+=(i+1)+","; countWrong++; } } if(recordWrong.length()>1){ lblNewLabel_1.setText("第"+recordWrong+"题答错了!"); }else if(textField.getText().length()==0){ lblNewLabel_1.setText("请输入题数!"); } else{ lblNewLabel_1.setText("恭喜你,全都搭对了!"); } /* if(e.getSource()==submitButton){ System.out.println("点击了"+itemValue); new CalMachineSwingBuildResult(userName,itemValue,numOfQuestion ,countWrong,numOfQuestion-countWrong).show();; }*/ recordWrong=""; } }); } }
运行界面如下:
ssh:git@git.coding.net:muziliquan/GUIVersion.git
git:git://git.coding.net/muziliquan/GUIVersion.git