Task 1 [30 marks]
SumItUp is a simple application for children where they can practise their counting and adding
skills (see Figure 1).
实现截图
代码:
Main.java
import javax.swing.*;
public class Main {
public static int MaxNumber = 10;
public static void main(String[] args) {
if(args.length == 0) {
System.out.println("No command line argument is given!");
return;
}else{
MaxNumber = Integer.parseInt(args[0]);
if(MaxNumber < 1 || MaxNumber > 20){
System.out.println("A number outside the valid range is given!");
}
}
JFrame frame = new JFrame("Welcome to SumItUp!");
frame.setSize(800, 600);
frame.setLocationRelativeTo(null);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
MyPanel myPanel = new MyPanel();
frame.add(myPanel);
frame.setVisible(true);
}
}
CheckListener.java
import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class CheckListener implements ActionListener {
private MyPanel myPanel;
@Override
public void actionPerformed(ActionEvent e) {
AdditionQuiz additionQuiz = myPanel.getAdditionQuiz();
int number1 = (int) myPanel.getNumberSpinner1().getValue();
int number2 = (int) myPanel.getNumberSpinner2().getValue();
int number3 = (int) myPanel.getNumberSpinner3().getValue();
// right answer
if(number1 == additionQuiz.getNumber1() && number2 == additionQuiz.getNumber2() && number3 == additionQuiz.getAnswer()){
myPanel.getLabel().setText("Correct! Have another go?");
additionQuiz.generateQuiz();
myPanel.removeAll();
myPanel.getLeftPanel().removeAll();
myPanel.paintLeftPanel();
myPanel.getRightPanel().removeAll();
myPanel.paintRightPanel();
myPanel.getNumberSpinner1().setValue(1);
myPanel.getNumberSpinner2().setValue(1);
myPanel.getNumberSpinner3().setValue(1);
}else{
myPanel.getLabel().setText("Wrong! Try again!");
}
}
public void setMyPanel(MyPanel myPanel) {
this.myPanel = myPanel;
}
}
MyPanel.java
import javax.swing.*;
import java.awt.*;
public class MyPanel extends JPanel{
private final JLabel label;
private final AdditionQuiz additionQuiz;
private JSpinner NumberSpinner1, NumberSpinner2, NumberSpinner3;
private JPanel leftPanel, rightPanel;
FlowLayout flowLayout;
ImageIcon rabbitIcon;
public MyPanel(){
String beginText = "Enter two operands, results and click on 'Check!'";
label = new JLabel(beginText);
BorderLayout borderLayout = new BorderLayout();
setLayout(borderLayout);
label.setHorizontalAlignment(JLabel.CENTER);
add(label, BorderLayout.NORTH);
JPanel quizPanel = new JPanel();
JButton checkButton = new JButton("Check!");
CheckListener checkListener = new CheckListener();
checkButton.addActionListener(checkListener);
checkListener.setMyPanel(this);
SpinnerNumberModel model1 = new SpinnerNumberModel(1, 1, Main.MaxNumber, 1);
SpinnerNumberModel model2 = new SpinnerNumberModel(1, 1, Main.MaxNumber, 1);
SpinnerNumberModel model3 = new SpinnerNumberModel(1, 1, Main.MaxNumber * 2, 1);
NumberSpinner1 = new JSpinner(model1);
JFormattedTextField firstNumberField1 = ((JSpinner.DefaultEditor) NumberSpinner1.getEditor()).getTextField();
firstNumberField1.setEditable(false);
NumberSpinner2 = new JSpinner(model2);
JFormattedTextField firstNumberField2 = ((JSpinner.DefaultEditor) NumberSpinner2.getEditor()).getTextField();
firstNumberField2.setEditable(false);
NumberSpinner3 = new JSpinner(model3);
JFormattedTextField firstNumberField3 = ((JSpinner.DefaultEditor) NumberSpinner3.getEditor()).getTextField();
firstNumberField3.setEditable(false);
quizPanel.add(NumberSpinner1);
quizPanel.add(new JLabel(" + "));
quizPanel.add(NumberSpinner2);
quizPanel.add(new JLabel(" = "));
quizPanel.add(NumberSpinner3);
quizPanel.add(new JLabel(" "));
quizPanel.add(checkButton);
add(quizPanel, BorderLayout.SOUTH);
ImageIcon plusIcon = new ImageIcon("plus.png");
JLabel plusLabel = new JLabel(plusIcon);
add(plusLabel, BorderLayout.CENTER);
// generate quiz
additionQuiz = new AdditionQuiz(Main.MaxNumber);
additionQuiz.generateQuiz();
flowLayout = new FlowLayout(FlowLayout.LEFT);
rabbitIcon = new ImageIcon("rabbit.jpg");
// paint rabbit
paintLeftPanel();
paintRightPanel();
}
public void paintRightPanel() {
rightPanel = new JPanel();
rightPanel.setLayout(flowLayout);
rightPanel.setPreferredSize(new Dimension(250, 0));
for(int i = 0; i < additionQuiz.getNumber2(); i++){
rightPanel.add(new JLabel(rabbitIcon));
}
add(rightPanel, BorderLayout.EAST);
}
public void paintLeftPanel() {
leftPanel = new JPanel();
leftPanel.setLayout(flowLayout);
leftPanel.setPreferredSize(new Dimension(250, 0));
for(int i = 0; i < additionQuiz.getNumber1(); i++){
leftPanel.add(new JLabel(rabbitIcon));
}
add(leftPanel, BorderLayout.WEST);
}
public JPanel getLeftPanel() {
return leftPanel;
}
public JPanel getRightPanel() {
return rightPanel;
}
public JLabel getLabel() {
return label;
}
public AdditionQuiz getAdditionQuiz() {
return additionQuiz;
}
public JSpinner getNumberSpinner1() {
return NumberSpinner1;
}
public JSpinner getNumberSpinner2() {
return NumberSpinner2;
}
public JSpinner getNumberSpinner3() {
return NumberSpinner3;
}
}