Ein Actionlistener für ein Textfeld, anstatt viele Actionlistener für ein Textfeld

Bitte aktiviere JavaScript!
Ich möchte gerne ein kleines Text Adventure, in dem man nur vorerst ja und nein in einem Textfeld eingeben kann, erstellen. Momentan füge ich für jede neue Abfrage einen neuen Actionlistener für ein und dasselbe Textfeld ein. Gibt es da eine elegantere Variante nur einen Actionlistener zu verwenden?
Meine Klasse Oberflaeche:
Java:
package textadventure;

import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.JTextPane;
import javax.swing.JTextField;

public class Oberflaeche extends JFrame {
    private String antwortString;
    private JPanel contentPane;
    private JTextField antwort;
    private JTextPane adventureText;

    /**
     * Create the frame.
     */
    public Oberflaeche() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(100, 100, 800, 500);
        contentPane = new JPanel();
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        setContentPane(contentPane);
        contentPane.setLayout(null);

        adventureText = new JTextPane();
        adventureText.setEditable(false);
        adventureText.setBounds(12, 13, 758, 255);
        contentPane.add(adventureText);

        antwort = new JTextField();
        antwort.setBounds(12, 281, 758, 22);
        contentPane.add(antwort);
        antwort.setColumns(10);

        adventureText.setText(
                "Hallo Abenteurer. Erlebe nun ein kleines Abenteuer,du verwendest dabei nur die Buchstaben: 'y' und 'n'.Wenn du aufgefordert wirst entscheide dich zwichen zwei Auswahlmöglichkeiten. Tippe nun y oder n in das untere Textfeld.");
        antwort.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                antwortString = antwort.getText();
                if (antwortString.equals("y") || antwortString.equals("n")) {
                    antwort.setText(null);
                    beginn();
                }

            }

        });

    }

    public void beginn() {
        adventureText.setText("Möchtest du das Abenteuer beginnen?\ny oder n ?");
        antwort.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent f) {
                antwortString = antwort.getText();
                if (antwortString.equals("y")) {
                    antwort.setText(null);
                    beginningGood();
                } else if (antwortString.equals("n")) {
                    antwort.setText(null);
                    keinAbenteurer();

                }
            }

        });
    }

    public void beginningGood() {
        adventureText.setText("Dann lasst das Abenteuer beginnen!");
    }

    public void keinAbenteurer() {
        adventureQ();
        antwort.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent f) {
                antwortString = antwort.getText();
                if (antwortString.equals("y")) {
                    antwort.setText(null);
                    beginningGood();
                } else if (antwortString.equals("n")) {
                    antwort.setText(null);
                    adventureQ();
                    antwort.addActionListener(new ActionListener() {
                        public void actionPerformed(ActionEvent g) {
                            antwortString = antwort.getText();
                            if (antwortString.equals("y")) {
                                antwort.setText(null);
                                beginningGood();
                            } else if (antwortString.equals("n")) {
                                antwort.setText(null);
                                adventureQ();
                                antwort.addActionListener(new ActionListener() {
                                    public void actionPerformed(ActionEvent h) {
                                        antwortString = antwort.getText();
                                        if (antwortString.equals("y")) {
                                            antwort.setText(null);
                                            beginningGood();
                                        } else if (antwortString.equals("n")) {
                                            antwort.setText(null);
                                            adventureText.setText("Du bist hartnäckig... Ich aber auch! Möchtest du beginnen?\ny oder n");
                                            antwort.addActionListener(new ActionListener() {
                                                public void actionPerformed(ActionEvent i) {
                                                    antwortString = antwort.getText();
                                                    if (antwortString.equals("y")) {
                                                        antwort.setText(null);
                                                        beginningGood();// anderes ende mit verspätung. ist schon abend.
                                                    } else if (antwortString.equals("n")) {
                                                        antwort.setText(null);
                                                        adventureText.setText("... ... ... du bist kein Abenteurer oder? ");
                                                    }
                                                }
                                            });
                                        }
                                    }
                                });

                            }
                        }
                    });

                }
            }
        });

    }

    public void adventureQ() {
        adventureText.setText("Möchtest du das Abenteuer beginnen?\ny oder n ?");
    }
}
LG LordSpiegel
 
A

Anzeige


Vielleicht hilft dir dieser Kurs hier weiter: (hier klicken)
Java:
package simpletextadventuredemo;

import java.awt.Container;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class SimpleTextAdventureDemo implements ActionListener
{

    private final static String FIRST_COMMAND = "Willst du das?";
    private final static String SECOND_COMMAND = "Willst du dies?";
    private final static String THIRD_COMMAND = "Oder doch das?";
    private static JFrame frame;
    private static JLabel text;

    public static void main(String[] args)
    {
        SwingUtilities.invokeLater(new Runnable()
        {
            @Override
            public void run()
            {
                createAndShowGUI();
            }

        });
    }

    private static void createAndShowGUI()
    {
        frame = new JFrame();
        frame.setLocationRelativeTo(null);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        SimpleTextAdventureDemo demo = new SimpleTextAdventureDemo();
        demo.createAndAddComponents(frame.getContentPane());
        
        frame.pack();
        frame.setVisible(true);
    }

    @Override
    public void actionPerformed(ActionEvent e) //Augenmerk
    {
        switch (e.getActionCommand())
        {
            case FIRST_COMMAND:
                text.setText(FIRST_COMMAND);
                break;
            case SECOND_COMMAND:
                text.setText(SECOND_COMMAND);
                break;
            case THIRD_COMMAND:
                text.setText(THIRD_COMMAND);
                break;
        }
    }

    private void createAndAddComponents(Container container)
    {
        JPanel panel = new JPanel(new GridLayout(4, 1));
        JButton firstText = createButton(FIRST_COMMAND);
        JButton secondText = createButton(SECOND_COMMAND);
        JButton thirdText = createButton(THIRD_COMMAND);
        panel.add(firstText);
        panel.add(secondText);
        panel.add(thirdText);
        text = new JLabel();
        panel.add(text);
        container.add(panel);

    }

    private JButton createButton(String buttonText)
    {
        JButton button = new JButton(buttonText);
        button.addActionListener(this);
        return button;
    }

}
 
beginningGood, keinAbenteurer, adventureQ etc sind letztlich nur Zustände. Ich würde an deiner Stelle einen Zustandsautomaten entwickeln, welcher auf die Ereignisse 'Ja' und 'Nein' reagieren kann und einen Folgezustand zurückgibt. Du kannst dann iterativ mit diesen Zuständen arbeiten.
 
Java:
package textadventure;

import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;

import adventureSample.Sample1.ChoiceHandler;

import javax.swing.JTextPane;
import javax.swing.JTextField;
import javax.swing.JButton;

public class Oberflaeche extends JFrame {
    private String antwortString;
    private JPanel contentPane;
    private JTextField antwort;
    private JTextPane adventureText;
    private JButton option1;
    private JButton option2;
    private JButton choice1;
    private JButton choice2;
    ChoiceHandler choiceHandler = new ChoiceHandler();
    String position;
    int zaehler;
    /**
     * Create the frame.
     */
    public Oberflaeche() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(100, 100, 800, 500);
        contentPane = new JPanel();
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        setContentPane(contentPane);
        contentPane.setLayout(null);

        adventureText = new JTextPane();
        adventureText.setEditable(false);
        adventureText.setBounds(12, 13, 758, 255);
        contentPane.add(adventureText);

        antwort = new JTextField();
        antwort.setEditable(false);
        antwort.setEnabled(false);
        antwort.setBounds(12, 281, 758, 22);
        contentPane.add(antwort);
        antwort.setColumns(10);
        
        JButton choice1 = new JButton("JA");
        choice1.setBounds(12, 316, 97, 25);
        contentPane.add(choice1);
        choice1.addActionListener(choiceHandler);
        choice1.setActionCommand("JA");
        
        JButton choice2 = new JButton("NEIN");
        choice2.setBounds(121, 316, 97, 25);
        contentPane.add(choice2);
        choice2.addActionListener(choiceHandler);
        choice2.setActionCommand("NEIN");
        
        JButton option1 = new JButton("option1");
        option1.setBounds(12, 354, 97, 25);
        contentPane.add(option1);
        option1.addActionListener(choiceHandler);
        option1.setActionCommand("option1");
        
        JButton option2 = new JButton("option2");
        option2.setBounds(121, 354, 97, 25);
        contentPane.add(option2);
        option2.addActionListener(choiceHandler);
        option2.setActionCommand("option2");
        option2.setVisible(false);
        option1.setVisible(false);
        zaehler=0;
        start();
        }
    
        public void start() {
            position="start";
        adventureText.setText(
                "Hallo Abenteurer. Erlebe nun ein kleines Abenteuer,du verwendest dabei nur die Buchstaben: 'y' und 'n'.Wenn du aufgefordert wirst entscheide dich zwichen zwei Auswahlmöglichkeiten. Tippe nun y oder n in das untere Textfeld.");
        }
    

    public void beginn() {
        position="beginn";
        adventureText.setText("Möchtest du das Abenteuer beginnen?\ny oder n ?");
    }

    public void beginningGood() {
        adventureText.setText("Dann lasst das Abenteuer beginnen!");
    }

    public void keinAbenteurer() {
        position="keinAbenteurer";
        adventureQ();
    }
                                    

    public void adventureQ() {
        adventureText.setText("Möchtest du das Abenteuer beginnen?\ny oder n ?");
    }
    
    public void keinAbenteurerzwei(){
        position="kAzwei";
        adventureText.setText("... ... ... du bist kein Abenteurer oder? Warum hast du dieses Spiel überhaubt gestartet... ... ... du hällst mich auf, ich habe heute noch eine Verabredung. Ich gebe dir noch eine Chance! möchtest du nun das Abenteuer beginnen?\ny oder n?");
        option2.setVisible(true);
        option1.setVisible(true);
        option1.setText("Verabredung");
        option2.setText("Langeweile");
    }
    public void beginningLate(){
        adventureText.setText("");
        
    }
    public void authorDate(){
    adventureText.setText("");
    
    }
    public void boring(){
        adventureText.setText("");
    
    }
    public void hartnaeckig() {
        position="hartnaeckig";
        adventureText.setText("Du bist hartnäckig... Ich aber auch! Möchtest du beginnen?\ny oder n");
        
    }

    public class ChoiceHandler implements ActionListener{

        public void actionPerformed(ActionEvent event){

            String yourChoice = event.getActionCommand();

            switch(position){
            case "start":
                switch(yourChoice) {
                case"JA":beginn();break;
                case"NEIN":beginn();break;
                }
                break;
            case "beginn":
                switch(yourChoice) {
                case"JA":beginningGood();break;
                case"NEIN":keinAbenteurer();break;
                }
                break;
            case "keinAbenteurer":
                switch(yourChoice) {
                case"JA":beginningGood();break;
                case"NEIN":
                    zaehler++;
                    if(zaehler<=3) {
                        beginn();
                        break;
                    }else{
                        hartnaeckig();
                        break;
                    }
                    
                }
                break;
            case "hartnaeckig":
                switch(yourChoice) {
                    case"JA":beginningLate();break;
                    case"NEIN":keinAbenteurerzwei();break;
                    }
                break;
            case "kAzwei":
                switch(yourChoice) {
                case"JA":beginningLate();break;
                case"option1":authorDate();break;
                case"option2":boring();break;
                }
                break;
            }

        }
    }
}
Ich habe das ganze jetzt versucht und mit einem SwitchCase in einem Handler "gelöst", und bin auf Buttons umgestiegen
Das funktioniert bis zu einem gewissen Punkt auch sehr gut, jedoch bekomme ich einen Fehler ausgeworfen nach mehreren Antworten und zwar dann wenn ich lediglich die Antwort Nein tätige und danach neue Buttons erscheinen lassen möchte, für mehr Auswahlmöglichkeiten.
Error
Code:
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
    at textadventure.Oberflaeche.keinAbenteurerzwei(Oberflaeche.java:113)
    at textadventure.Oberflaeche$ChoiceHandler.actionPerformed(Oberflaeche.java:173)
    at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
    at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
    at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
    at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
    at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
    at java.awt.Component.processMouseEvent(Unknown Source)
    at javax.swing.JComponent.processMouseEvent(Unknown Source)
    at java.awt.Component.processEvent(Unknown Source)
    at java.awt.Container.processEvent(Unknown Source)
    at java.awt.Component.dispatchEventImpl(Unknown Source)
    at java.awt.Container.dispatchEventImpl(Unknown Source)
    at java.awt.Component.dispatchEvent(Unknown Source)
    at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
    at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
    at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
    at java.awt.Container.dispatchEventImpl(Unknown Source)
    at java.awt.Window.dispatchEventImpl(Unknown Source)
    at java.awt.Component.dispatchEvent(Unknown Source)
    at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
    at java.awt.EventQueue.access$500(Unknown Source)
    at java.awt.EventQueue$3.run(Unknown Source)
    at java.awt.EventQueue$3.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
    at java.awt.EventQueue$4.run(Unknown Source)
    at java.awt.EventQueue$4.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
    at java.awt.EventQueue.dispatchEvent(Unknown Source)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.run(Unknown Source)
 
Passende Stellenanzeigen aus deiner Region:

Neue Themen

Oben