Java重复(?)回答

时间:2016-05-03 18:03:05

标签: java swing

所以我必须为我们的类软件设计制作一个GUI,我们正在制作一个让孩子们练习乘法表的游戏。到目前为止,当你进行一次测试或练习时,它可以正常工作,但是当你进行第二次运行时,它会出错。通常你只需要回答10个问题,这在第一次工作正常,但第二次每次点击都计算2个答案(我知道这听起来很奇怪),第三次点击计算3个答案,依此类推。所以只有你第一次真正回答10个问题。 所以我想知道可能与面板没有被正确删除有关,所以当你制作一个新的面板时多次注册?但我不确定,因为到目前为止我已经尝试了很多方法来解决这个问题。

import java.awt.*;
import javax.swing.*;

/**
 * Aanmaken van het frame en laten switchen tussen verschillende panels afhankelijk van de keuze.
 */
public class GUI extends JFrame
{
    JPanel currentPanel;
    public static int keuze = -1;
    public static int moeilijkheidsgraad = 0;
    public static String TestOfOefenen;
    static String[] vragen = new String[121];
    static int[] antwoorden = new int[121];

     /**
     * Main method voor aanmaken frame
     */
    public static void main(String[] args)
    {
        GUI menu = new GUI();
        menu.setSize(800,600);
        menu.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        menu.setVisible(true);
        menu.setTitle("Rekenspel");

      //vullen van vragen en antwoorden
        /** 0-10: tafels van 0
         * 11-21: tafels van 1
         * 22-32: tafels van 2
         * 33-43: tafels van 3
         * 44-54: tafels van 4
         * 55-65: tafels van 5
         * 66-76: tafels van 6
         * 77-87: tafels van 7
         * 88-98: tafels van 8
         * 99-110: tafels van 9
         * 111-121: tafels van 10
         **/

        int teller=0;
        for(int i=0; i<11; i++){
            for(int j=0; j<11; j++){
                    int temp = i*10;
                    temp = temp+j;
                    //System.out.println(temp);

                    vragen[teller] = i +" x " + j + " = ...";
                    //System.out.println(vragen[teller]);

                    antwoorden[teller]=i*j;
                    //System.out.println(antwoorden[temp]);
                teller++;
            }
        }
        /*
        for(int i=0; i<121; i++){
            System.out.println(vragen[i]);
        }
        */
    }

    public GUI()
    {
        // Panels weergeven
        JPanel panel = new DetailsLogin(this);
        setLayout(new BorderLayout());
        this.currentPanel = panel;
        Container c = getContentPane();
        c.add(panel, BorderLayout.CENTER);
        KeuzeInMenu();
    }

    /**
     * Afhankelijk van de keuze een ander panel weergeven.
     */
    public void KeuzeInMenu()
    {       
        switch (keuze)
         {
        case -1:    this.remove(currentPanel);
                    setCurrentPanel(new DetailsLogin(this));
                    this.add(currentPanel);
                    this.revalidate();
                    this.repaint();
                    this.requestFocus();
         break;
         case 0:    this.remove(currentPanel);
                    setCurrentPanel(new DetailsMenu(this));
                    this.add(currentPanel);
                    this.revalidate();
                    this.repaint();
                    this.requestFocus();

         break;
         case 1:    this.remove(currentPanel);
                    setCurrentPanel(new DetailsOefenen(this));
                    this.add(currentPanel);
                    this.revalidate();
                    this.repaint();
                    this.requestFocus();
        break;
        case 2:     this.remove(currentPanel);
                    setCurrentPanel(new DetailsTest(this));
                    this.add(currentPanel);
                    this.revalidate();
                    this.repaint();
                    this.requestFocus();
        break;
        case 3:     this.remove(currentPanel);
                    setCurrentPanel(new DetailsResultaten(this));
                    this.add(currentPanel);
                    this.revalidate();
                    this.repaint();
                    this.requestFocus();
        break;
        case 4:     this.remove(currentPanel);
                    setCurrentPanel(new DetailsMoeilijkheidsgraad(this));
                    this.add(currentPanel);
                    this.revalidate();
                    this.repaint();
                    this.requestFocus();
        break;
        case 5:     this.remove(currentPanel);
                    setCurrentPanel(new DetailsOefenTestBeeld(this,  moeilijkheidsgraad, TestOfOefenen, vragen, antwoorden));
                    this.add(currentPanel);
                    this.revalidate();
                    this.repaint();
                    this.requestFocus();
        break;
        case 6:     this.remove(currentPanel);
                    setCurrentPanel(new DetailsOefenTestKlaar(this));
                    this.add(currentPanel);
                    this.revalidate();
                    this.repaint();
                    this.requestFocus();
        break;

        default:    System.out.println("Error");
        break;
        }
    }

    /**
     *  Welk panel weergeven moet worden.
     */
    public void setCurrentPanel(JPanel currentPanel)
    {
        this.currentPanel = currentPanel;
    }
}

编辑:接受输入的类

import java.awt.*;
import java.awt.event.*;
import java.util.*;
import javax.swing.*;
import javax.swing.border.Border; 

/**
 * Aanmaken van het panel voor de test of oefening.
 */
public class DetailsOefenTestBeeld extends JPanel {
    static GUI g;
    Boolean stop=false;
    Random rand = new Random();
    String vraag;
    private static int[] antwoorden;
    private static String[] vragen;
    static int counter=0, minuten=0, seconden=0;
    public static int maxTijd=300;
    static String soort="", tijd=""; 
    static ArrayList<Integer> grenzen = new ArrayList<>();

    static JButton antwoord1 = new JButton("antwoord1");
    static JButton antwoord2 = new JButton("antwoord2");
    static JButton antwoord3 = new JButton("antwoord3");
    static JButton antwoord4 = new JButton("antwoord4");
    static JTextArea vraagWeergave = new JTextArea(300,100);
    static JTextArea stopwatch = new JTextArea(100,100);



    public DetailsOefenTestBeeld(GUI menu, int moeilijkheidsgraad, String TestOfOefenen, String[] vragen, int[] antwoorden)
    {
        System.out.println("test");
        g = menu;
        //Grootte instellen van het panel en een titel eraan geven afhankelijk of het een test of een oefening is.
        Dimension size = getPreferredSize();
        setPreferredSize(size);
        //Is het een Test of oefening?
        soort = TestOfOefenen;
        if (soort == "Oefenen")
        {
            setBorder(BorderFactory.createTitledBorder("Oefenen"));
        }
        else
        {
            setBorder(BorderFactory.createTitledBorder("Test"));
            Countdown countdown = new Countdown();
            countdown.start();
        }
        //aanmaken van de knoppen voor het antwoorden.
        antwoord1.setPreferredSize(new Dimension(150,60));
        antwoord2.setPreferredSize(new Dimension(150,60));
        antwoord3.setPreferredSize(new Dimension(150,60));
        antwoord4.setPreferredSize(new Dimension(150,60));

        //bepalen van de antwoorden.

        JButton knopMenu = new JButton("Menu");
        knopMenu.setPreferredSize(new Dimension(150,60));

        vraagWeergave.setMinimumSize (new Dimension(160,35));
        stopwatch.setMinimumSize (new Dimension (50,20));

        Border border = BorderFactory.createLineBorder(Color.BLACK);
        vraagWeergave.setBorder(border);
        vraagWeergave.setEditable(false);
        vraagWeergave.setFont(new Font("Verdana", Font.PLAIN, 25));
        vraagWeergave.setVisible(true);
        stopwatch.setBorder(border);
        stopwatch.setEditable(false);
        stopwatch.setFont(new Font("Verdana", Font.PLAIN, 13));
        stopwatch.setVisible(true);

        //Swing componenten toewijzen op de GridBagLayout
        setLayout(new GridBagLayout());
        GridBagConstraints gc = new GridBagConstraints();

        // 1ste Rij 
        gc.weightx = 1; // hoeveel plaats de knop inneemt
        gc.weighty = 1;
        if (soort == "Testen")
        {
            gc.gridx = 1;
            gc.gridy = 0;
            add(stopwatch, gc);
        }

        gc.gridx = 1;
        gc.gridy = 1;
        add(vraagWeergave, gc);

        gc.gridx = 0;
        gc.gridy = 2;
        add(antwoord1, gc);

        gc.gridx = 1;
        gc.gridy = 2;
        add(antwoord2, gc);

        gc.gridx = 2;
        gc.gridy = 2;
        add(antwoord3, gc);

        gc.gridx = 3;
        gc.gridy = 2;
        add(antwoord4, gc);

        gc.gridx = 0;
        gc.gridy = 3;
        add(knopMenu, gc);

        OefenTestVragen.reset();
        OefenTestVragen OefenTest = new OefenTestVragen(vragen, antwoorden);
        //System.out.println("constructor van DetailsOefenTestBeeld");
        OefenTestVragen.kiesAntwoordenEnVraag();

        // Actionlisteners op knoppen
        knopMenu.addActionListener(new ActionListener(){
            @Override
            public void actionPerformed(ActionEvent e) {
                int selectedOption = JOptionPane.showConfirmDialog(null, 
                        "Mag je de test/oefening wel afsluiten van de Juf/Meester? \n De niet ingevulde oefeningen zullen fout gerekend worden.", 
                        "Naar Menu", 
                        JOptionPane.YES_NO_OPTION); 
                        if (selectedOption == JOptionPane.YES_OPTION) {
                            OefenTestVragen.setMax();
                            OefenTestVragen.kiesAntwoordenEnVraag();
                        }
            }
        });
        antwoord1.addActionListener(new ActionListener(){
            @Override
            public void actionPerformed(ActionEvent arg0) {
                OefenTestVragen.checkAntwoord(1);
                OefenTestVragen.kiesAntwoordenEnVraag();
            }           
        });
        antwoord2.addActionListener(new ActionListener(){
            @Override
            public void actionPerformed(ActionEvent arg0) {
                OefenTestVragen.checkAntwoord(2);
                OefenTestVragen.kiesAntwoordenEnVraag();
            }           
        });
        antwoord3.addActionListener(new ActionListener(){
            @Override
            public void actionPerformed(ActionEvent arg0) {
                OefenTestVragen.checkAntwoord(3);
                OefenTestVragen.kiesAntwoordenEnVraag();
            }           
        });
        antwoord4.addActionListener(new ActionListener(){
            @Override
            public void actionPerformed(ActionEvent arg0) {
                OefenTestVragen.checkAntwoord(4);
                OefenTestVragen.kiesAntwoordenEnVraag();
            }           
        });
    }
    public static void setIndexen(ArrayList<Integer> indexenReceived){
        grenzen = indexenReceived;
    }
    public static int getCounter(){
        return counter;
    }

    //Updaten van de tijd
    public static void updateTijd()
    {
        String tijdSeconden=String.format("%02d", DetailsOefenTestBeeld.maxTijd%60);
        String tijdMinuten=String.format("%02d", DetailsOefenTestBeeld.maxTijd/60);
        tijd = tijdMinuten+":"+tijdSeconden;
        stopwatch.setText(tijd);
        if (maxTijd==0)
        {
            OefenTestVragen.setMax();
            OefenTestVragen.kiesAntwoordenEnVraag();
        }
    }
    public static void changeButton(int a, int b, int c, int d, String vraag){
        antwoord1.setText(Integer.toString(a));
        antwoord2.setText(Integer.toString(b));
        antwoord3.setText(Integer.toString(c));
        antwoord4.setText(Integer.toString(d));
        vraagWeergave.setText(vraag);
    }
    public static String[] getVragen(){
        System.out.println(vragen);
        return vragen;
    }

    public static int[] getAntwoorden(){
        return antwoorden;
    }

    public static void einde(){
        GUI.keuze = 6;
        g.KeuzeInMenu();
    }

    public static String getSoort(){
        return soort;
    }
}

1 个答案:

答案 0 :(得分:4)

正如我在评论中提到的,如果这是我的代码,我将摆脱大多数静态修饰符,实际上是使用静态导致你的问题。因为你的JButton是静态的,每次你创建一个新的DetailsOefenTestBeeld实例(也可能是其他实例)时,你都会向现有的JButton添加一个 new ActionListener ,所以不要有一个听众,他们然后有2,然后3,然后......

解决方案:

  • 摆脱程序中的大多数静态。
  • 侧面推荐:与CardLayout交换,而不是你正在做什么。
  • 侧面建议2:不要使用==!=来比较字符串。请改用equals(...)equalsIgnoreCase(...)方法。理解==检查两个对象引用是否相同而不是您感兴趣的内容。另一方面,这些方法检查两个字符串是否具有相同的字符。同样的顺序,这就是重要的事情。