Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

15.08.2013, 18:00

Java || Einmaleins-Programm # JTextfield mit Schleife einlesen

Guten Abend,
ich bin gerade dabei einen kleines 1x1 Trainer für meine kleine Schwester zu programmieren.


Ich habe eine Variable angelegt für die Anzahl der Wiederholungen und ein JTextfield, das mir per Enter-Taste die Eingabe einliest.
Das Programm soll wenn sie eine Frage beantwortet hat und entweder ein "Richtig" oder "Falsch" bekommen hat zur nächsten Aufgabe gehen.
Ich habe ein Problem dies in eine Schleife zu packen, vielleicht könnt ihr mir da weiter helfen. Mein Code, der entsprechenden Klasse, sieht derzeit so aus:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
public class programm extends JFrame implements KeyListener{
    
     
    
    static JFrame prog = new JFrame("spiel");       
    public static void rechner(final int zahl){
         
        
        
        
        
        
        try {
            prog.setContentPane(new JLabel(new ImageIcon(ImageIO.read(new File("C:/Users/kim/Desktop/back.jpg")))));            //hintergrund
        } catch (IOException e) {
            System.out.println("da ging was schief");
 
            e.printStackTrace();
        }
          final JTextField text=new JTextField();
        prog.add(text);
        
        
        
        text.setBounds(450, 600, 40, 40);                                           //textfeld zum einlesen 
        text.setBorder(BorderFactory.createEmptyBorder ());
        text.addKeyListener(null);  
        text.setFont(new java.awt.Font("Book Antiqua", 0, 20));
        final JLabel schrift = new JLabel();
        
        schrift.setFont(new java.awt.Font("Book Antiqua", 0, 28));
        schrift.setForeground(Color.WHITE);
        schrift.setBounds(140, 100, 200, 20);
        
        
        
    
        text.addActionListener(new ActionListener(){            public void actionPerformed(ActionEvent e){
                
                int y =  (int) ((Math.random()*10)+1);
                
                
                String ergebnis;
                int erg=0;
                int counter = einstellungen.getAnzahl();
                
                ergebnis=text.getText();
                
            erg=Integer.parseInt(ergebnis);
            if(counter > 0){
                schrift.setText("was ist " + zahl +" * " + y);
                
                if(erg== zahl*y){
                    counter--;
                    schrift.setText("super");
                    
                }
                else{
                    schrift.setText("falsch");
                }
                    
                }
            
        
                
            }
                    
            } );
        
    
            
        
        
    
    
        
        
        prog.add(text);     
        prog.pack();
        
        prog.setVisible(true);
        prog.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        prog.setFocusable(true);
        prog.setLayout(null); 
        
        
        prog.setVisible(true);
    
        schrift.setOpaque(false); 
        prog.add(schrift);
        
    }   
}




Mit freundlichen Grüßen,
blume :)

Wirago

Alter Hase

Beiträge: 1 193

Wohnort: Stockerau

Beruf: CRM Application Manager

  • Private Nachricht senden

2

15.08.2013, 19:32

Naja, die einfachste Variante ist wohl sich einen Zähler zu schnappen den du nach jeder Antwort um 1 erhöhst. Und je nach dem wie hoch der Zähler ist, fragst du eine andere Frage.
Allerdings frage ich mich, wo hier das Problem ist?

3

15.08.2013, 20:11

Dein Code ist eher verwirrend. Eine Schleife ist wohl der falsche Ansatz.

Meine Empfehlung an dich:
Beschäftige dich weiter mit den Grundlagen und beschränke dich vorerst auf Konsolenanwendungen. Um mit Swing zu arbeiten sollte man solide OOP-Kenntnise mitbringen. Ansonsten verschwendest du meiner Meinung nach viel Energie in die falschen Inhalte.

Vieleicht hilft dir ja folgendes als Orientierung und du erkennst selbst einen Weg wie du die Durchläufe zählen könntest:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;

import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JTextField;

public class MyWindow extends JFrame {

    private JLabel taskLabel = new JLabel();
    private JLabel answerLabel = new JLabel();
    private JTextField resultField = new JTextField();

    private int number1;
    private int number2;
    
    private int counter = 0;

    public MyWindow() {

        setTitle("1*1");
        
        resultField.addKeyListener(new KeyAdapter() {
            public void keyPressed(KeyEvent e) {
                if (e.getKeyCode() == KeyEvent.VK_ENTER) {
                    checkAnswer();
                }
            }
        });

        generateNewNumbers();

        Box box = new Box(BoxLayout.Y_AXIS);
        box.add(taskLabel);
        box.add(answerLabel);
        box.add(resultField);
        add(box);

    }

    private void generateNewNumbers() {
        number1 = (int) ((Math.random() * 10) + 1);
        number2 = (int) ((Math.random() * 10) + 1);

        taskLabel.setText("Aufgabe: " + number1 + "*" + number2);
        resultField.setText("");
    }

    private void checkAnswer() {
        try {
            Integer answer = Integer.valueOf(resultField.getText());
            if (answer == number1 * number2) {
                answerLabel.setText("Richtig");
                counter++;
            } else {
                answerLabel.setText("Falsch");
            }
            generateNewNumbers();

            if(counter == 10){
                JOptionPane.showMessageDialog(null, "Yeah ;) 10 richtige Antworten");
            }

        } catch (Exception ex) {
            answerLabel.setText("Ungültige Eingabe");
        }
    }

}

Zum starten:

Quellcode

1
2
3
4
5
6
    public static void main(String[] args)
    {
        MyWindow meinFrame = new MyWindow();     
        meinFrame.setSize(200,200);
        meinFrame.setVisible(true);
    }


Bleib auf jedenfall dran ;)

4

17.08.2013, 16:40

Guten Tag,
vielen Dank für die Antwort. Hat mir in jedem Fall schon mal geholfen :)
Ich hätte allerdings gern, dass von der gelösten Aufgabe erst nur das "richtig" kommt, dann verschwindet und die nächste Aufgabe kommt. Ich bekomm es nur nicht hin, hab schon einiges rumprobiert aber es klappt nicht. Würde das überhaupt so gehen? :S

5

17.08.2013, 20:44

Du musst dir das ganze in einzelnen Schritten vorstellen und diese einzelne Schritte in Methoden zu kapseln. Wurde eine Aufgabe richtig gelöst stellst du den Text des Aufgabenlabels auf "Richtig". Danach wird die nächste Aufgabe generiert und diese überschreibt den Text des Labels mit der nächsten Aufgabe (z.B. durch erneutes Enter drücken oder durch eine Verzögerung ausgelöst).

Wenn du eine Verzögerung haben willst, kannst du sleep() verwenden:

Quellcode

1
2
3
4
5
6
SwingUtilities.invokeLater(new Runnable() {
    public void run() {
      Thread.sleep(3000);
      generateNewNumbers();
    }
 });


Du kannst auch nur sagen Thread.sleep(3000). Das SwingUtilities.invokeLater() sorgt dafür, dass das "Warten" die Anwendung nicht blockiert. Du musst natürlich in der Zeit wo die Anwendung "wartet" verhinden, dass der User versucht die Aufgabe wiederholt zu lösen ( if(!taskLabel.getText().equals("Richtig")) ) .

6

18.08.2013, 10:30

Ich danke dir vielmals , schön das ich hier so nette und kompetente Hilfe bekomme:)
Ich habe noch eine weitere frage ist es möglich es mit nur einem Label zu lösen , also das erst die Aufgabe kommt Dan im den Label steht richtig oder falsch und dann die nächste Aufgabe kommt. Ich habe diverse Sachen versucht also settext geht leider nicht ;)
Ich danke dir vielmals

7

18.08.2013, 12:02

Ja klar geht es nur mit einem Label. setText("...") sollte da schon klappen.

8

18.08.2013, 13:16

Hm komsich bei mir kommt dann garkeine antwort :D



Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;

import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JTextField;

public class MyWindow extends JFrame {

    private JLabel taskLabel = new JLabel();
    private JLabel answerLabel = new JLabel();
    private JTextField resultField = new JTextField();

    private int number1;
    private int number2;
    
    private int counter = 0;

    public MyWindow() {

        setTitle("1*1");
        
        resultField.addKeyListener(new KeyAdapter() {
            public void keyPressed(KeyEvent e) {
                if (e.getKeyCode() == KeyEvent.VK_ENTER) {
                    checkAnswer();
                }
            }
        });

        generateNewNumbers();

        Box box = new Box(BoxLayout.Y_AXIS);
        box.add(taskLabel);
        box.add(answerLabel);
        box.add(resultField);
        add(box);

    }

    private void generateNewNumbers() {
        number1 = (int) ((Math.random() * 10) + 1);
        number2 = (int) ((Math.random() * 10) + 1);

        taskLabel.setText("Aufgabe: " + number1 + "*" + number2);
        resultField.setText("");
    }

    private void checkAnswer() {
        try {
            Integer answer = Integer.valueOf(resultField.getText());
            if (answer == number1 * number2) {
                taskLabel.setText("Richtig");
                counter++;
            } else {
            taskLabel.setText("Falsch");
            }
    
            generateNewNumbers();

            if(counter == 10){
                JOptionPane.showMessageDialog(null, "Yeah ;) 10 richtige Antworten");
            }

        } catch (Exception ex) {
            answerLabel.setText("Ungültige Eingabe");
        }
    }
    public static void main(String[] args)
    {
        MyWindow meinFrame = new MyWindow();    
        meinFrame.setSize(200,200);
        meinFrame.setVisible(true);
    }

}

9

18.08.2013, 14:10

Ja klar, weil das Label sofort wieder mit einer neuen Aufgabe überschrieben wird. Wie gesagt, musst du irgendwie kontrolliern wann der nächste Schritt passieren soll. Entweder durch erneutes drücken der Enter Taste oder durch eine automatische Verzögerung.

Du kannst z.B. den Keylistener mit folgendem ersetzen:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
    resultField.addKeyListener(new KeyAdapter() {
            public void keyPressed(KeyEvent e) {
                if (e.getKeyCode() == KeyEvent.VK_ENTER) {
                    System.out.println("Test");
                    if (!taskLabel.getText().equals("Richtig") && !taskLabel.getText().equals("Falsch")) {
                        checkAnswer();
                    } else {
                        generateNewNumbers();   
                    }
                }
            }
        });


und in der checkAnswers() Methode "generateNewNumbers();" rausnehmen. Dann geht es immer mit Enter zum nächsten Schritt.

Werbeanzeige