所以我必须为我们的类软件设计制作一个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;
}
}
答案 0 :(得分:4)
正如我在评论中提到的,如果这是我的代码,我将摆脱大多数静态修饰符,实际上是使用静态导致你的问题。因为你的JButton是静态的,每次你创建一个新的DetailsOefenTestBeeld
实例(也可能是其他实例)时,你都会向现有的JButton添加一个 new ActionListener ,所以不要有一个听众,他们然后有2,然后3,然后......
解决方案:
==
或!=
来比较字符串。请改用equals(...)
或equalsIgnoreCase(...)
方法。理解==
检查两个对象引用是否相同而不是您感兴趣的内容。另一方面,这些方法检查两个字符串是否具有相同的字符。同样的顺序,这就是重要的事情。