Input/Output JFrame mit JButton und JTextfield

mk4net

Aktives Mitglied
Hallo,
Ich bin sehr unerfahren wass dass programmieren mit Java angeht, deswegen vermutlich auch eine leichte Frage. Ich bräuchte unbedingt einen Beispielcode der ein Fenster erzeugt vl so 800x600
und ich in diesem Fenster geziel 3 Objekte platzieren kann. Ein ausgabefeld(nur für Text) ess sollte die oberen 2/3 des Fensters einnehmen und ein kleines Texfeld in dem mann seinen Input schreibt und einen Knopf mit dehm mann den Input abschickt sag ich mal. Ich habe dass mit dem Fenster schon hingekriegt aber wenn ich jetzt ein Textfeld darin platzieren will geht das zwar es nimmt aber das komlette Fenster ein. ich weis nicht genau wie ich dasresizen kann oder genau platzieren, auch eine längere Interntrecherche :rtfm: hat nichts ergeben,Vermutlich weil ich nicht weis wie das heist nachdem ich suche^^. Es wäre Super wenn mir jemand von euch helfen könnte.(Dieses Programm soll nur dazu dienen dass ich mir mal ein kleines Textadventure selbst schreiben kann damit ich eine Grundlage habe die ich verändern und mit der ich üben kann)


mfg mk4net


Hier noch dass was ich bis jetzt habe:
Java:
import java.awt.Dimension;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;


public class Start extends JPanel{
	private static final long serialVersionUID = 1L;//hmm bin ma ned sicha wos des bringt
	JFrame rahmen;
	
	public static void main(String[] args){ //Den Hauptrahmen erstellen
		new Start(800,600);
	}

	public Start(int w,int h){
		this.setPreferredSize(new Dimension(w,h));
		JTextField textFeld1 = new JTextField();
		rahmen = new JFrame("EngineVersuch001");
		rahmen.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		rahmen.setLocation(100,100);
		rahmen.add(this);
		rahmen.setSize(800,600); //nur VErsuche
		rahmen.add(textFeld1);
		rahmen.setResizable(true);
		rahmen.setAlwaysOnTop(true); //sorgt dafür dass Fenster immer im Vordergrund ist
		
		//rahmen.pack(); //funktion unbekannt
		rahmen.setVisible(true); 
	}	
	
}
 
C

Camino

Gast
Deine Klasse Start ist von einem JPanel abgeleitet und darin erstellst du dann dein JFrame. Das JPanel brauchst du so ja nicht, würde ich wieder entfernen. Stattdessen in der Klasse Start den JFrame erstellen (so wie schon geschehen) und dann dort dem JFrame das JPanel hinzufügen. Und auf das Panel fügst du dann deine Komponenten hinzu.

Wenn du Komponenten in deine Anwendung hinzufügen und platzieren möchtest, solltest du dir mal die LayoutManager anschauen, mit dem du festlegen kannst, wie und wo deine Komponenten erscheinen. JFrame hat per Standard das BorderLayout, JPanel das FlowLayout.
 
C

Camino

Gast
Und wenn du beim JFrame (Standard: BorderLayout) einfach nur mit add etwas hinzufügst, landet das im CENTER-Bereich und dieser erstreckt sich über den gesamten verfügbaren Platz, streckt sich also über das ganze Fenster. Im BorderLayout kannst du immer nur 1 Komponente in 1 Bereich (NORTH, SOUTH, WEST, EAST, CENTER) hinzufügen. Wenn du noch eine in den gleichen Bereich hinzufügst, überschreibt diese die vorherige. Und du kannst auch LayoutManager schachteln, also z.B. in den CENTER-Bereich deines JFrames ein JPanel einfügen, welches selber wieder einen anderen LayoutManager hat und dort dann auch wieder Komponenten aufnehmen kann.
 

mk4net

Aktives Mitglied
Ich schaffs nich zu 100% was du vorhin gesagt hast. :oops:
Ich habe das [JAVA=5]extends JPanel[/code] zu JFrame geändert,
dann habe ich alles was nicht notwendig war entfernt.
Und jetzt habe ich das JPanel hizugefügt. dem JPanel dann in Zeile 24 das TextFeld hinzugefügt
...Aber wie zum Geier mach ich dass der Spass nich nur 1px breit ist :autsch:

Könntest du das mit dem LayoutManager hinzufügen bitte ein bisschen erläutern hab vorher noch nie was von gehört danke.


Aktueller Java Code:
Java:
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;


public class Start extends JFrame{
	private static final long serialVersionUID = 1L;//hmm bin am ned sicha wos des bringt
	JFrame rahmen;
	
	public static void main(String[] args){ //Den Hauptrahmen erstellen
		new Start(800,600);
	}

	public Start(int w,int h){
		JPanel panel = new JPanel();
		JTextField Textfeld = new JTextField();
		rahmen = new JFrame("EngineVersuch001");
		rahmen.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		rahmen.setLocation(100,100);
		rahmen.setSize(800,600); //nur VErsuche
		rahmen.setResizable(true);
		rahmen.setAlwaysOnTop(true); //sorgt dafür dass Fenster immer im Vordergrund ist#
		rahmen.add(panel);
		panel.add(Textfeld);
		
		//rahmen.pack(); //funktion unbekannt
		rahmen.setVisible(true); 
	}	
	
}


Schau mir grad den Link hier durch.(über das LayoutManager gedöhns)
 
Zuletzt bearbeitet:
C

Camino

Gast
Ich schaffs nich zu 100% was du vorhin gesagt hast. :oops:
Ich habe das [JAVA=5]extends JPanel[/code] zu JFrame geändert,

Das brauchst du nicht unbedingt, weil du ja in deiner Klasse Start schon ein JFrame erstellst. Also am besten sowohl das extends JPanel, als auch das extends JFrame weglassen. Weil wenn du bei der Klasse Start das extends JFrame hinschreibst, dann bekommt diese Klasse die Eigenschaften des JFrame, ist also quasi dein Frame.

Wegen LayoutManager schau mal hier (oder such mal im Netz):
http://www.java-forum.org/bilder-gui-damit-zusammenhaengt/109289-vorstellung-layoutmanager-standard-java-api-externer-layoutmanager.html

Du kannst Containern wie JFrame oder JPanel mit setLayout() einen bestimmten LayoutManager zuweisen. Wenn du nichts angibst, haben diese per Standard schon einen LayoutManager.
 
Zuletzt bearbeitet von einem Moderator:

mk4net

Aktives Mitglied
Dankeschön. Ich mach dass extends schnell weg und schau mir den Post durch.
Welcher Layout Manager wär denn der Beste für meinen Verwendungszweck?
 
C

Camino

Gast
Java:
		rahmen.add(panel);
		panel.add(Textfeld);

Das bedeutet: du fügst deinem JFrame (rahmen) das JPanel hinzu. Du hast dem JFrame kein LayoutManager gesetzt, also ist Standard das BorderLayout. Wenn du dort nur mit add eine Komponente hinzufügst, landet diese im CENTER-Bereich. Das dort eingefügte JPanel wird also über den ganzen Bereich gestreckt.
In das dort eingefügte JPanel hast du das Textfeld hinzugefügt. JPanel hat per Standard das FlowLayout. Setzt also alle hinzugefügten Komponenten nebeneinander. Du musst wahrscheinlich bei deinem Textfeld noch noch die Grösse mit setPreferredSize() angeben.
 
C

Camino

Gast
Welcher Layout Manager wär denn der Beste für meinen Verwendungszweck?
Das kommt drauf an, was du (noch) alles in dort hinzufügen und wie anordnen möchtest. Je nach Umfang reicht ein LayoutManager, oder es müssen mehrere genommen und geschachtelt werden. Am besten du schaust dir mal die bei Java üblichen LayoutManager an, was mit denen möglich ist, und überlegst dir, welcher dir am besten weiterhilft.
 

mk4net

Aktives Mitglied
Dass mit FlowLayout höhrt sich ganz gut an, wenn ich es denn richtig verstanden habe :D .
mein Problem ist zurzeit dass prefered Size. Ich weis nicht genau wei ich das verwenden soll/
was ich da denn reinpacken soll, ich denke einen int in pixeln?

Ich habs jetz mal so weit gebracht:
Java:
import java.awt.Dimension;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;


public class Start {
	private static final long serialVersionUID = 1L;//hmm bin am ned sicha wos des bringt
	JFrame rahmen;
	
	public static void main(String[] args){ //Den Hauptrahmen erstellen
		new Start(800,600);
	}

	public Start(int w,int h){
		JPanel JPanel = new JPanel();//Macht ein Panel was auch immer das bringt
		JButton Check = new JButton();//erzeugt einen JButton
		JTextField Textfeld = new JTextField();//erzeugt ein JTextField
		Textfeld.setPreferredSize(100,100);
		
		rahmen = new JFrame("EngineVersuch001");//erzeugt neues Fenster
		rahmen.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//wenn mans zumacht isses weg 0.o
		rahmen.setSize(800,600); //legt Fenstergröße fest
		rahmen.setResizable(true);//man kann diese aber noch verändern
		rahmen.setAlwaysOnTop(true); //sorgt dafür dass Fenster immer im Vordergrund ist
		rahmen.setVisible(true);
		rahmen.add(JPanel);
		
		JPanel.add(Textfeld);
		JPanel.add(Check);
		 
	}	
	
}
 

Volvagia

Top Contributor
Brauchst du nicht. Du kannst den TextField im Konstruktor die Länge (in Zeichen) übergeben. Besser als wenn das TextFeld bei 12 px großer Schrift 100 Pixel groß wird. ^^

btw. Variablennamen bitte immer klein und camelCase.

btw². "JPanel JPanel" Oo
 

mk4net

Aktives Mitglied
Erstmal danke für die Hilfe. Währ aber langweilig wenn ich jetz keine Fragen mehr hätt
Also ich will jetzt noch ein Feld machen in dem der User in Textform den Output vom Programm bekommt.
Ich habe jedoch keine Ahnung was für ein JElement ich dafür verwenden soll.(Der Benutzer soll dieses Feld nicht editieren können. evtl. Scrollen muss aber nich sein wenns zu komplex wird)

Ich füg jetz nochmal meinen Quellcode an damit du mal drüberschaun kannst ob ich deine btws richtig umgesetzt hab
:D
mfg Nick

Java:
import java.awt.Dimension;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;


public class Start {
	private static final long serialVersionUID = 1L;//hmm bin am ned sicha wos des bringt
	JFrame rahmen;
	
	public static void main(String[] args){ //Den Hauptrahmen erstellen
		new Start(800,600);
	}

	public Start(int w,int h){
		JPanel panelDings = new JPanel();//Macht ein Panel was auch immer das bringt
		JButton check = new JButton();//erzeugt einen JButton
		JTextField textInput = new JTextField(50);//erzeugt ein JTextField
		
		rahmen = new JFrame("EngineVersuch001");//erzeugt neues Fenster
		rahmen.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//wenn mans zumacht isses weg 0.o
		rahmen.setSize(800,600); //legt Fenstergröße fest
		rahmen.setResizable(true);//man kann diese aber noch verändern
		rahmen.setAlwaysOnTop(true); //sorgt dafür dass Fenster immer im Vordergrund ist
		rahmen.setVisible(true);
		rahmen.add(panelDings);
		
		panelDings.add(textInput);
		panelDings.add(check);
		 
	}	
	
}

Edit: ich sollte wirklich mal alles hinschreiben befor ich poste. Dass mit dem Konstruktor hatt super funktioniert danke, aber wie kann ich jetzt die Zeilen einstellen?
 

Volvagia

Top Contributor
JLabel für einzeilige oder JTextArea für mehrzeilige Ausgaben würde ich sagen.
TextArea kannst du mit ein paar Methodenaufrufen wie ein Label aussehen lassen. (setEditable, setCursor, setFont, setFocusable etc.).

Ein paar Dinge noch:

1) serialVersionUID = 1L kannst du Entfernen. Die dient nur zur Versionskontrolle von serialisierbaren Klassen.
2) rahmen kannst du private deklarieren und umbennen (ein JFrame ist kein Rahmen, Border wäre ein Rahmen). Private ist nicht soooo wichtig, ein guter Name aber umbedingt.
3) setVisible sollte immer erst aufgerufen werden, wenn die GUI komplett gebaut ist, sonst kann es zu Darstellungsschwierigkeiten kommen.
4) Start sollte innerhalb einer Runnable erzeugt werden die EventQueue.invokeLater oder AndWait injected wird. Swing ist nicht Thread-Save und die Main wird nicht im EDT aufgerufen.

Threads and Swing


Edit: Was meinst du mit "Zeilen einstellen"? Vorgegebenen Wert setzen geht per Konstruktor.
 

mk4net

Aktives Mitglied
Danke blos noch ne frage kannst du Punkt 4. :autsch: bitte nochmal möglichst einfach ausgedrückt wiederhohlen, ich habe nichts verstanden von dem was du mir mitteilen wolltet ... auser das irgendwas mit Threads war

Den rest hab ich jz mal so umgesetzt:
Java:
import java.awt.Dimension;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;


public class Start {
	JFrame hauptFenster;
	
	public static void main(String[] args){
		new Start(800,600);
	}

	public Start(int w,int h){
		JPanel panelDings = new JPanel();//Macht ein Panel was auch immer das bringt
		JButton check = new JButton();//erzeugt einen JButton
		JTextField textInput = new JTextField(50);//erzeugt ein JTextField
		
		hauptFenster = new JFrame("EngineVersuch001");//erzeugt neues Fenster
		hauptFenster.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//wenn mans zumacht isses weg 0.o
		hauptFenster.setSize(800,600); //legt Fenstergröße fest
		hauptFenster.setResizable(true);//man kann diese aber noch verändern
		hauptFenster.setAlwaysOnTop(true); //sorgt dafür dass Fenster immer im Vordergrund ist
		hauptFenster.setVisible(true);
		hauptFenster.add(panelDings);
		
		panelDings.add(textInput);
		panelDings.add(check);
		
		
		
		hauptFenster.setVisible(true);//immer am Schluss!! 
	}	
	
}
 
Zuletzt bearbeitet:

Volvagia

Top Contributor
Java:
import java.awt.EventQueue;
import java.awt.event.ActionEvent;

import javax.swing.AbstractAction;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;

public class Start {
	private JFrame fenster;
    
	public Start(int w, int h){
		fenster = new JFrame("EngineVersuch001");
		fenster.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		fenster.setSize(w, h);
		
		JPanel inhaltPanel = new JPanel();
		fenster.add(inhaltPanel);

		
		JButton checkButton = new JButton(new AbstractAction("Drück mich") {
			public void actionPerformed(ActionEvent e) {
				JOptionPane.showMessageDialog(null, "Hey, Finger weg von meinen Button. :O");
			}
		});
		inhaltPanel.add(checkButton);
		
		JTextField textInput = new JTextField(50);
		inhaltPanel.add(textInput);
				
		fenster.setVisible(true);
	}
	
	public static void main(String[] args){
		EventQueue.invokeLater(new Runnable() { //GUI-Änderungen im EDT, sonst kommt James Gosling und frisst dich im Schlaf.
			public void run() {
				new Start(800,600);
			}
		});
	}
}
 

mk4net

Aktives Mitglied
Ich bin dir echt dankbar für die Antwort und Mithilfe aber bitte erläutere deine Posts etwas näher ich binn ein absoluter Voll**** was java Anbelangt. Was genau bringen deine veränderungen? , Warum sollte ich die einbaun? und so weiter. Und danke für den Einabu von dem, ich glaube zumindest dass es das is, EventListener.

mfg Nick
 

Volvagia

Top Contributor
EventQueue.invokeLater reiht die Runnable in die EventQueue ein die vom Event Dispatcher ständig abgearbeitet werden. Wie gesagt, GUI-Änderungen nur darin, sonst kommt es zu Fehlern. AbstractAction implementiert eine Action die ActionListener erweitert. Der Button hohlt sich (vereinfacht gesagt, da passiert noch einiges mehr) den Namen und das Icon falls angegeben der Action und registriert sie als ActionListener, der immer aufgerufen wird, wenn der Knopf gedrückt wird.
 

mk4net

Aktives Mitglied
Nice... Neues Problem xD Also ich will jetzt wenn der Knopf gedrückt wird die JTextfiel inputText
als String speichern und mit dem dann weiter verfahren.
*Das Problem liegt in Zeile 36 Ich versteh auch den Hinweis denn mir Eclipse gibt nicht wirklich:
"Cannot refer to a non-final variable textInput inside an inner class defined in a different method"

mfg Nick

Java:
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
 
import javax.swing.AbstractAction;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.swing.JTextField;
 
public class Start {
    private JFrame fenster;
    
    public Start(int w, int h){
        Textverarbeitung Text = new Textverarbeitung();
    	
    	
    	//Nur GUI
    	fenster = new JFrame("EngineVersuch001");
        fenster.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        fenster.setSize(w, h);
        
        JPanel inhaltPanel = new JPanel();
        fenster.add(inhaltPanel);

		JTextArea textOutput = new JTextArea(20,50);
		inhaltPanel.add(textOutput);
        
        JTextField textInput = new JTextField(50);
        inhaltPanel.add(textInput);		
        
		JButton checkButton = new JButton(new AbstractAction("Bestätigen") {
            public void actionPerformed(ActionEvent e) {
            	String userInput;
            	userInput = textInput.getText();
            }
        });
        inhaltPanel.add(checkButton);
                      
        fenster.setVisible(true);
    }
    
    public static void main(String[] args){
        EventQueue.invokeLater(new Runnable() { //GUI-Änderungen im EDT, sonst kommt James Gosling und frisst dich im Schlaf.
            public void run() {
                new Start(580,430);
            }
        });
    }
}
 

Volvagia

Top Contributor
Innerhalb einer anonymen Klasse (soetwas wie die Runnable- oder AbstractAction-Instanze) kann nur auf Klassenvariablen und final Methodenvariablen der äußeren Klasse zugegriffen werden.

Java:
final JTextField textInput = new JTextField(50);
inhaltPanel.add(textInput);     

JButton checkButton = new JButton(new AbstractAction("Bestätigen") {
public void actionPerformed(ActionEvent e) {
            String userInput;
            userInput = textInput.getText();
        }
});
inhaltPanel.add(checkButton);
 

mk4net

Aktives Mitglied
Hatt super funktioniert dankeschön. Jetz folgen nur noch 1-2 Tausend Fragen. Hoffe ich nerve hier nich^^ . Mein nächstes Problem ist ähnlich, Ich schaffe es leider nicht aus meiner zweiten Java Datei(Textverarbeitung.java) eine Refernz oder wie das heist auf Start.java zu erstellen.

Start.java:

Java:
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
 
import javax.swing.AbstractAction;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.swing.JTextField;
 
public class Start {
    private JFrame fenster;
    public Start(int w, int h){
    	
    	//Nur GUI
    	fenster = new JFrame("EngineVersuch001");
        fenster.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        fenster.setSize(w, h);
        
        JPanel inhaltPanel = new JPanel();
        fenster.add(inhaltPanel);

		JTextArea textOutput = new JTextArea(20,50);
		textOutput.setEditable(false);
		inhaltPanel.add(textOutput);
        
		final JTextField textInput = new JTextField(50);
		inhaltPanel.add(textInput);     
		 
		JButton checkButton = new JButton(new AbstractAction("Bestätigen") {
		public void actionPerformed(ActionEvent e) {
					Textverarbeitung Eingabe = new Textverarbeitung();		//erstellt Verbindung zu Textverarbeitungsmethode
					String userInput;  										//erstellt String der die Benutzereingabe erfassen soll
		            userInput = textInput.getText();						//weist dem String die Benutzereingabe vom JTextfield textInput zu
		            System.out.println(userInput);							//gibt diesen an die Console aus nur zu Testzwecken
		            Eingabe.EingabeVerarbeitung(userInput);					//gibt die Benutzereingabe an Textverarbeitungsmethode weiter
		            textInput.setText(null);								//setzt danach das Eingabe Feld wieder auf Null
		        }
		});
		inhaltPanel.add(checkButton);
                      
        fenster.setVisible(true);
    }
    
    public static void main(String[] args){
        EventQueue.invokeLater(new Runnable() { //GUI-Änderungen im EDT, sonst kommt James Gosling und frisst dich im Schlaf.
            public void run() {
                new Start(580,430);
            }
        });
    }
}


Textverarbeitung.java Problem lieg tin Zeile 7
Java:
public class Textverarbeitung {
	
	public void EingabeVerarbeitung(String userInput) {
		System.out.println("User Input: " +userInput);
		
		
		Start benutzerAusgabe = new Start();
		
		
		
	}
	
}
 

Volvagia

Top Contributor
Vergleich mal die drei Ausschnitte, dann kommst du wahrscheinlich selbst drauf:

Java:
public Start(int w, int h){

Java:
EventQueue.invokeLater(new Runnable() {
	public void run() {
		new Start(580,430);
	}
});

Java:
new Start();

Davon abgesehen Variablenamen wie gehabt klein und camel. Sonst hält man das für einen statischen Methodenaufruf: Eingabe.EingabeVerarbeitung(userInput);
Musste eben selbst nochmal nachschauen.
Methodennamen genauso, und Verben. Also statt EingabeVerarbeitung verarbeiteEingabe oder eingabeVerarbeiten oder so.

Davon abgesehen ist mir der Sinn schleierhaft.
Du rufst im ActionListener nach der Eingabe eine Methode auf, die wiederrum Start erzeugt, das im Konstruktor noch ein Fenster aufbauen soll? ^^


(Gott, ich sollte mir "davon abgesehen" abgewöhnen. Keiner Ahnung, woher ich das überhaupt habe. Oo)
 

mk4net

Aktives Mitglied
hmm ja doch das war wohl ein ziemlicher Denkfehler xD tja hmm aber wie kann ich das dann von der anderen .java aus aufrufen damit ich Text in den outputText schreiben kann. Ich habs mal mit API probiert bin aber heillos überfordert. Wie sollte ich dasss am besten machen?
danke übrigends für die super Hilfe

mfg Nick
 

mk4net

Aktives Mitglied
Überforderung: wo soll ich denn das setText jetz aufrufen? ich mein in der hier:
Java:
public class Textverarbeitung {
	
	public void EingabeVerarbeitung(String userInput) {
		System.out.println("User Input: " +userInput);
		
		
		
	}
	
}

oder hier:
Java:
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
 
import javax.swing.AbstractAction;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.swing.JTextField;
 
public class Start {
    private JFrame fenster;
    public Start(int w, int h){
    	
    	//Nur GUI
    	fenster = new JFrame("EngineVersuch001");
        fenster.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        fenster.setSize(w, h);
        
        JPanel inhaltPanel = new JPanel();
        fenster.add(inhaltPanel);

		final JTextArea textOutput = new JTextArea(20,50);
		textOutput.setEditable(false);
		inhaltPanel.add(textOutput);
        
		final JTextField textInput = new JTextField(50);
		inhaltPanel.add(textInput);     
		 
		JButton checkButton = new JButton(new AbstractAction("Bestätigen") {
		public void actionPerformed(ActionEvent e) {
					Textverarbeitung Eingabe = new Textverarbeitung();		//erstellt Verbindung zu Textverarbeitungsmethode
					String userInput;  										//erstellt String der die Benutzereingabe erfassen soll
		            userInput = textInput.getText();						//weist dem String die Benutzereingabe vom JTextfield textInput zu
		            System.out.println(userInput);							//gibt diesen an die Console aus nur zu Testzwecken
		            Eingabe.EingabeVerarbeitung(userInput);					//gibt die Benutzereingabe an Textverarbeitungsmethode weiter
		            textInput.setText(null);								//setzt danach das Eingabe Feld wieder auf Null
		        }
		});
		inhaltPanel.add(checkButton);
                      
        fenster.setVisible(true);
    }
    
    public static void main(String[] args){
        EventQueue.invokeLater(new Runnable() { //GUI-Änderungen im EDT, sonst kommt James Gosling und frisst dich im Schlaf.
            public void run() {
                new Start(580,430);
            }
        });
    }
}

Weil ich hätter gerne am Ende eine class die einfach alles Berrechnet und so -->Textverarbeitung und eine die einfach alles mit GUI und den Rest regelt--> Start
 

Volvagia

Top Contributor
Was willst du berechnen? Sag am Besten mal, was das Programm am Ende genau tun soll. Weil im Moment hast du ausschließlich GUI und Controller (Listener).
 

mk4net

Aktives Mitglied
Also ich hab mir das so Textadventure mässig vorestellt. Ich habe oben das große ausgabe Feld dass ich gerne Hintergrund schwarz und Farbe weis machen will(so dos mäsig), und dort den Text die Geschichte oder was immer ausgeben möchte.
Dann das kleine Textfeld mit dem man eingaben macht und den Knopf mit dem diese Bestätigt.

mfg Nick
 

mk4net

Aktives Mitglied
Hättest du dann nen Tipp wie ich das realisieren könnte? Und vorallem wie ich den output Text sinnvol verändern kann undzwar so das es Zeilenweise ist undzwar so:die Eingabe des SUers und eine Zeile weiter die Reaktion vom Programm
 

Volvagia

Top Contributor
Wie wäre es damit? (Ich tue echt alles, um mich vor meinen selbst erlegten Aufgaben zu drücken)

Java:
package javaforum.mk4net;

import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javaforum.mk4net.CommandHandler.CommandHandlerListener;

public class Main {
	private GUI ui;
	private Player player;
	
	public Main() {
		createGui();
		initCommandHandler();
		createPlayer();
		
		ui.show();
	}
	private void createPlayer() {
		player = new Player();
	}
	private void initCommandHandler() {
		CommandHandler.addCommandHandlerListener(new CommandHandlerListener() {
			public void unknowParameter(String s) {
				ui.writeOutput("Unknow Parameter: " + s);
			}
			public void movePlayer(int i, int j) {
				player.move(i, j);
				ui.writeOutput("Moved. New location is " + player.getX() + "/" + player.getY());
			}
			public void illegalInput(String s) {
				ui.writeOutput("Illegal Input Line: " + s);
			}
			public void illegalCommand(String cmd) {
				ui.writeOutput("Illegal Command: " + cmd);
			}
		});
	}
	private void createGui() {
		ui = new GUI();
		ui.addCommandSubmitListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				String command = ui.getCommand();
				ui.resetCommand();
				CommandHandler.startHandling(command);
			}
		});
	}
	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				new Main();
			}
		});
	}
}

Java:
package javaforum.mk4net;

import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;

public class GUI {
	private JFrame fenster;
	private JButton checkButton;
	private JTextField textInput;
	private JTextArea textOutput;
	
	public GUI() {
		//Nur GUI
		fenster = new JFrame("EngineVersuch001");
        fenster.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        fenster.setSize(800, 600);
        
        JPanel inhaltPanel = new JPanel();
        fenster.add(inhaltPanel);
 
        textOutput = new JTextArea(20,50);
        textOutput.setEditable(false);
        inhaltPanel.add(new JScrollPane(textOutput, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,
        		JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED));
        
        textInput = new JTextField(50);
        inhaltPanel.add(textInput);     
         
      	checkButton = new JButton("Bestätigen");
        inhaltPanel.add(checkButton);
	}

	public void show() {
		fenster.setVisible(true);
	}

	public void addCommandSubmitListener(ActionListener actionListener) {
		checkButton.addActionListener(actionListener);
	}

	public String getCommand() {
		return(textInput.getText());
	}

	public void resetCommand() {
		textInput.setText(null);
	}

	public void writeOutput(String string) {
		String currentText = textOutput.getText();
		if(currentText != null && currentText.trim().length() != 0 && !currentText.endsWith(String.valueOf('\n'))) {
			currentText+= '\n';
		}
		textOutput.setText(currentText + string);
	}
}

Java:
package javaforum.mk4net;

import java.awt.Point;
import java.util.EventListener;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;

public abstract class CommandHandler {
	private static final Map<String, CommandHandler> HANDLERS = new HashMap<String, CommandHandler>() {
		{
			put("move", new MoveCommandHandler());
		}
	};
	
	private static List<CommandHandlerListener> listeners;
	
	static {
		listeners = new LinkedList<CommandHandlerListener>();
	}
	protected CommandHandler() {
		super();
	}
	
	public static void addCommandHandlerListener(CommandHandlerListener l) {
		listeners.add(l);
	}
	
	protected  abstract void handle(String s);
	
	public static void startHandling(String s) {
		s = s.toLowerCase();
		
		int spaceIndex = s.indexOf(' ' );
		if(spaceIndex == -1) {
			fireIllegalInputEvent(s);
			return;
		}
		
		String cmd = s.substring(0, spaceIndex);
		String parms = s.substring(spaceIndex + 1);
		
		CommandHandler handler = HANDLERS.get(cmd);
		if(handler == null) {
			fireIllegalCommandEvent(cmd);
			return;
		}
		handler.handle(parms);
	}
	
	private static void fireIllegalInputEvent(String s) {
		for(CommandHandlerListener listener:listeners) {
			listener.illegalInput(s);
		}
	}
	private static void fireIllegalCommandEvent(String cmd) {
		for(CommandHandlerListener listener:listeners) {
			listener.illegalCommand(cmd);
		}
	}
	private static void fireUnknowParameterEvent(String s) {
		for(CommandHandlerListener listener:listeners) {
			listener.unknowParameter(s);
		}
	}

	private static class MoveCommandHandler extends CommandHandler {
		protected void handle(String s) {
			Point locationChange = null;
			
			if(s.equals("up")) {
				locationChange = new Point(0, -1);
			}  else if(s.equals("right")) {
				locationChange = new Point(1, 0);
			} else if(s.equals("down")) {
				locationChange = new Point(0, 1);
			} else if(s.equals("left")) {
				locationChange = new Point(-1, 0);
			} else {
				fireUnknowParameterEvent(s);
				return;
			}
			
			for(CommandHandlerListener listener:listeners) {
				listener.movePlayer(locationChange.x, locationChange.y);
			}
		}
	}

	//Eigendlich sollten Listener nur EventObjects übergeben, aber das ist mir im Moment egal.
	public interface CommandHandlerListener extends EventListener {

		void movePlayer(int i, int j);

		void illegalInput(String s);

		void illegalCommand(String cmd);

		void unknowParameter(String s);

	}
}

Java:
package javaforum.mk4net;

import java.awt.Point;

public class Player {
	private Point location;
	
	public Player() {
		location = new Point(50, 50);
	}
	public void move(int i, int j) {
		location.x = location.x + i;
		location.y = location.y + j;
	}
	public int getX() {
		return(location.x);
	}
	public int getY() {
		return(location.y);
	}
}
 

mk4net

Aktives Mitglied
*umarm* Also. es is viel verändert kannst du das ganze aber trotzdem nochn biischn erklärn?
Ich versteh zwarn großteil ne kleine Erläuterung wär aber echt top.

Edit: hmm da isn Fehler in der CommandHandler.class
Zeile10:
The public type CommandHandler must be defined in its own file
 
Zuletzt bearbeitet:

Volvagia

Top Contributor
Zuerst wird die Main erzeugt. Diese erzeugt die GUI, eine Player-Instanze um mal testweiße etwas zum Speichern zu haben und installiert beim Handler einen Listener. Wenn auf den Button geklickt wird wird in der GUI der ActionListener dessen Inhalt in der Main steht aufgerufen. Dieser hohlt sich den Text des TextFields, ruft die statische Methode des Handlers auf sagt der GUI sie soll das Textfeld wieder leeren. Der Handler wandelt den String in Kleinbuchstaben um und teilt ihm in 2 String mit dem Text vor und nach dem Leerzeichen auf. Danach hohlt er sich aus der HashMap den Handler der den Befehl bearbeiten soll und übergibt ihm die Parameter. Je nach dem was passieren soll ruft der Handler eine andere Listener-Methode auf auf die die Main dann reagiert.

Edit: Die 4 Klassen in den Java-Tags sollten in unterschiedliche Dateien.
 

mk4net

Aktives Mitglied
Danke... dass is jetzt fasst nicht das in ner halben Stunde wofür ich die nächste WOche gebraucht hätte^^ Aber was ist mit dem Fehler?
Edit: ja dass istt mir klar ich hab ja auch 4 verschiedene class Files:
Main, GUI,CommandHandler,Player

Edit die 2te: war mein Fehler hab bei der Class ein m vergessen deswegen der Fehler
 
Zuletzt bearbeitet:

Volvagia

Top Contributor
Du hast versucht, die 4 Java-Tags in einer Datei zu kopieren, oder? Jede davon muss in eine eigene Datei die natürlich wie die Klasse heißen muss. Also GUI gehört in die GUI.java/GUI.class.
Danach musst du natürlich noch die package-Angabe in der ersten Zeile ändern und in der Main Strg + Shift + O drücken, falls du Eclipse benutzt. Das sollte die Import-Anweißung vom Handler-Listener korrigieren.
 

mk4net

Aktives Mitglied
Tut mir echt leid das hast du wohl ein bisschen zu gut gemeint ich blick leider gar nicht mehr durch keine Chance. Ich werd bei meinem eigenen Code weitermachen müssen... :autsch:
hmm naja.. würdet du mir trotzdem nochn bisschen weiterhelfen dann?
 

Volvagia

Top Contributor
Wenn ich da bin und dir helfen kann werd ichs versuchen. Du kannst natürlich auch versuchen von meinen Code schrittweiße auf deinen zu übertragen und ggf. den Debugger anwerfen und Zeilenweiße durchgehen damit du den genauen Ablauf verstehst.
 

mk4net

Aktives Mitglied
Sry aber ich hab noch nie mit nemn Debugger gearbeitet.
Also ich bin wieder bei meinem Problem wie kann ich sinnvoll den outputText bearbeiten?
 

Volvagia

Top Contributor
Ich hatte bevor ich das Erste mal mit einen Debugger gearbeitet hatte auch noch nie mit nen Debugger gearbeitet. ^^ Bis ich es dann irgendwann mal gemacht hatte. (Warum weiß ich nicht mehr.)

Das kommt drauf an, wie der Befehl aussehen soll. In meinen Code ist es immer ein Befehl (nur "move" implementiert) gefolgt von einen Space und den Parameter ("left", "up", "right", "down"). Aber wenn deine vollkommen anders aussehen sollen musst du auch einen vollkommen anderen Behandlungscode schreiben.
 

mk4net

Aktives Mitglied
J aich hätt das ähnlich gemacht.. also eig gleich blos weis ich nciht wie ich überhaupt aus Textverarbeitung auf meinen outputScreen Zugreifen kann
 

Volvagia

Top Contributor
Grundsätzlich sollten nur benachtbarte Klassen aufeinander zugreifen. Das heißt Start bekommt eine Methode die mit dem String der rein soll aufgerufen wird. In meinen Fall heißt die writeOutput(String string). Diese überträgt dann den Text auf das Outputfield. So kann die Verarbeitung des Textes verändert werden, ohne den Rest anzupassen. Ich könnte z. B. die Ausgabe später in eine Tabelle legen. Schaut schöner aus als es sich anhört und ermöglicht leicht Dinge wie z. B. Textfarben. Außerdem finde ich persönlich Fassadenmethoden viel schöner als direkten Zugriff.

Grundsätzlich gibt es 3 Möglichkeiten für dem Aufruf:

Textverarbeitung bekommt die Instanz von Start mittels eingabe.verarbeiteEingabe(text, Start.this) (Der Klassenname ist wichtig, da this sonst auf die AbstractAction verweißen würde). Halte ich aber für sehr schlecht. Einerseits kannst du die GUI nicht mehr Austauschen ohne den Rest anzupassen, andererseits kennst du dich bei einen großen Programmen kaum noch aus, wenn alles irgendwie seine Referenz durch die Gegend ballert.

Die Methode liefert den Text als Rückgabewert per return. Nicht schlecht, aber die Methode kann sonst nicht zurückliefern, was sich verändern soll.

Du registrierst einen Listener. Halte ich für das geschickteste, hab ich ja selbst auch gemacht. So kann jeweils eine andere Methode je nach dem was passieren soll aufgerufen werden.
 

mk4net

Aktives Mitglied
Hmm gibts ne möglichkeit dass du mal sonen Listener bei mir eibaust? Was Ich auch nicht wirklich zum laufenbring ist diese if Schleifen mit dem Loggischen Operator.

Main:
Java:
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
 
import javax.swing.AbstractAction;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.swing.JTextField;
 
public class Main {
    private JFrame fenster;
    public Main(int w, int h){
    	
    	//Nur GUI
    	fenster = new JFrame("EngineVersuch001");
        fenster.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        fenster.setSize(w, h);
        
        JPanel inhaltPanel = new JPanel();
        fenster.add(inhaltPanel);

		final JTextArea textOutput = new JTextArea(20,50);
		textOutput.setEditable(false);
		inhaltPanel.add(textOutput);
        
		final JTextField textInput = new JTextField(50);
		inhaltPanel.add(textInput);     
		 
		JButton checkButton = new JButton(new AbstractAction("Bestätigen") {
		public void actionPerformed(ActionEvent e) {
					Textverarbeitung Eingabe = new Textverarbeitung();		//erstellt Verbindung zu Textverarbeitungsmethode
					String userInput;  										//erstellt String der die Benutzereingabe erfassen soll
		            userInput = textInput.getText();						//weist dem String die Benutzereingabe vom JTextfield textInput zu
		            Eingabe.EingabeVerarbeitung(userInput);					//gibt die Benutzereingabe an Textverarbeitungsmethode weiter
		            textInput.setText(null);								//setzt danach das Eingabe Feld wieder auf Null
		        }
		});
		inhaltPanel.add(checkButton);
                      
        fenster.setVisible(true);
    }
    
    public static void main(String[] args){
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                new Main(580,430);
            }
        });
    }
}


Java:
Textverarbeitung:

public class Textverarbeitung {
	
	public void EingabeVerarbeitung(String userInput) {
		userInput = userInput.toLowerCase();
		if (((userInput == "north") || (userInput == "east")) || ((userInput =="south") || (userInput =="west"))){
		System.out.println(userInput);	
		} else {
			System.out.println("!Falsche Eingabe!");
		}
		
		
	}
	
}
 

Volvagia

Top Contributor
Java:
package javaforum.mk4net;

import java.awt.EventQueue;
import java.awt.event.ActionEvent;

import javaforum.mk4net.Textverarbeitung.TextverarbeitungListener;

import javax.swing.AbstractAction;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.swing.JTextField;
 
public class Main {
	private JFrame fenster;
	private JTextField textInput;
	private JTextArea textOutput;
	
	public Main(int w, int h){
		//Nur GUI
		fenster = new JFrame("EngineVersuch001");
		fenster.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		fenster.setSize(w, h);
        
		JPanel inhaltPanel = new JPanel();
		fenster.add(inhaltPanel);
 
		textOutput = new JTextArea(20,50);
		textOutput.setEditable(false);
		inhaltPanel.add(textOutput);
        
		textInput = new JTextField(50);
		inhaltPanel.add(textInput);     
         
		JButton checkButton = new JButton(new AbstractAction("Bestätigen") {
			public void actionPerformed(ActionEvent e) {
				checkButtonActionPerformed();
			}
        });
		inhaltPanel.add(checkButton);
                      
		fenster.setVisible(true);
    }
	private void checkButtonActionPerformed() {
		Textverarbeitung eingabe = new Textverarbeitung();      //erstellt Verbindung zu Textverarbeitungsmethode
        eingabe.setListener(new TextverarbeitungListener() {
			public void schreibtMalBitteDenStringInDieAusgabe(String s) {
				writeToTextOutput(s);
			}
        });
		String userInput = textInput.getText();                        //weist dem String die Benutzereingabe vom JTextfield textInput zu
        eingabe.verarbeiteEingabe(userInput);                 //gibt die Benutzereingabe an Textverarbeitungsmethode weiter
        textInput.setText(null);    
	}
	private void writeToTextOutput(String text) {
		textOutput.append(text + "\n");
	}
    
    public static void main(String[] args){
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                new Main(580,430);
            }
        });
    }
}

Java:
package javaforum.mk4net;

public class Textverarbeitung {
	private TextverarbeitungListener listener;
	
	public void verarbeiteEingabe(String userInput) {
		userInput = userInput.toLowerCase();
		if(userInput.equals("north") || userInput.equals("east") || userInput.equals("south") || userInput.equals("west")) {
			if(listener != null) {
				listener.schreibtMalBitteDenStringInDieAusgabe(userInput);
			}
		} else {
			System.out.println("!Falsche Eingabe!");
		}
	}

	public static interface TextverarbeitungListener {
		public void schreibtMalBitteDenStringInDieAusgabe(String s);
	}

	public void setListener(TextverarbeitungListener l) {
		listener = l;
	}
}
 

mk4net

Aktives Mitglied
hmm schonmal danke, aber wie kann cih das so importieren dass er bei mir den Listener von Textverarbeitung erkennt? ich hab einfach javaforum.mk4net. weggelöscht aber dann sagt er dass das ein unbekanntes format ist... IIch habs im default package bei eclipse falls das was hilft
 

Volvagia

Top Contributor
Du solltest es in ein package verschieben. Das default package ist veraltet (sagt Eclipse beim anlegen einer neuen Klasse) und darin kann man meiner Erfahrung nach nichts importieren.

Edit: Ne, er sagt discouraged und nicht deprecated. Was das bedeutet hab ich keine Ahnung.
 
Zuletzt bearbeitet:

mk4net

Aktives Mitglied
Hmm oke mach ich aber vorher knack ich erstmal aus. Gute Nacht. Und danek für die Hilfe.
Morgen nerv ich dann in neuer frisch eweiter^^
 

mk4net

Aktives Mitglied
Super groses Dankeschön funktioniert wunderbar war genau dass was ich gesucht hab. Ich hab jetzt mal alles ein bischn kommentiert und auch schon wieder ein neues Problem xD (sonst wärs ja langweilig)

und zwar habe ich jetzt die Befehle in einen Array gepackt(damit ich sie später leichter neue
hinzufügen kann. Deswegen die If Schleife in eine For SChleife gepackt die alle Befehle aus dem
Array durchgeht. Jetzt habe ich aber das Problem dass wenn ich eine korrekte Eingabe mache z.B
South dann schreibt er:

!Falsche EIngabe!
!Falsche Eingabe!
User: South
!Falsche EIngabe!

Ich weis warum er dass macht das ist mir klar, aber ich weis nicht wie ich das umgehen könnte.
Und ich sehe auch keine sinnvolle möglichkeit es anders als mit dem Array zu machen da ich sonst
irgendwann mal ne If Schleifen Bedingung ghab an der man zum Mond klettern kann.

In der Main hat sich nichts verändert ich hab blos einen Verweis von dir umbenant.(jetzt stringOutput)


Java:
package Befehlsarray;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;


import javax.swing.AbstractAction;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.swing.JTextField;

import Befehlsarray.Textverarbeitung.TextverarbeitungListener;
 
public class Main {
    private JFrame fenster;
    private JTextField textInput;
    private JTextArea textOutput;
    
    public Main(int w, int h){
        //Nur GUI
        fenster = new JFrame("EngineVersuch001");
        fenster.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        fenster.setSize(w, h);
        
        JPanel inhaltPanel = new JPanel();
        fenster.add(inhaltPanel);
 
        textOutput = new JTextArea(20,50);
        textOutput.setEditable(false);
        inhaltPanel.add(textOutput);
        
        textInput = new JTextField(50);
        inhaltPanel.add(textInput);     
         
        JButton checkButton = new JButton(new AbstractAction("Bestätigen") {
            public void actionPerformed(ActionEvent e) {
                checkButtonActionPerformed();
            }
        });
        inhaltPanel.add(checkButton);
                      
        fenster.setVisible(true);
    }
    private void checkButtonActionPerformed() {
        Textverarbeitung eingabe = new Textverarbeitung();      //erstellt Verbindung zu Textverarbeitungsmethode "Eingabe"
        eingabe.setListener(new TextverarbeitungListener() {	//erstellt Listener für "Eingabe"
            public void stringOutput(String s) {	//gibt die Variable s aus die von Textverarbeitung.verarbeiteEingabe kommt
                writeToTextOutput("Player: " + s);
            }
        });
        String userInput = textInput.getText();                        //weist dem String die Benutzereingabe vom JTextfield textInput zu
        eingabe.verarbeiteEingabe(userInput);                 //gibt die Benutzereingabe an Textverarbeitungsmethode weiter
        textInput.setText(null);    
    }
    private void writeToTextOutput(String text) {
        textOutput.append(text + "\n");
    }
    
    public static void main(String[] args){
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                new Main(580,430);
            }
        });
    }
}


Das eigentlich interesante die Textverarbeitung:
In Zeile 9 beginnts.
Java:
package Befehlsarray;
public class Textverarbeitung {
    private TextverarbeitungListener listener;
    
    public void verarbeiteEingabe(String userInput) {
        userInput = userInput.toLowerCase();
        String[] Befehle ={"north","east","south","west"};
        
        for (int x =0;x<Befehle.length;x++){// for-SChleife die Alle Befehle im Befehlsarray durchgeht und konntrolliert
        	
        	if(userInput.equals(Befehle[x])){	//If (die UserEingabe == dem Befehl[mit der aktuellen Nummer des Durchlaufs]) dann gib etwas aus
        		if(listener != null) {
        			listener.stringOutput(userInput);
        		}
        	} else {
    			listener.stringOutput("Falsche Eingabe");
        	}
        	
        }//Ende for-Schleife
    }
 
    public static interface TextverarbeitungListener {
        public void stringOutput(String s);
    }
 
    public void setListener(TextverarbeitungListener textverarbeitungListener) {
        listener = textverarbeitungListener;
    }
}
 

Volvagia

Top Contributor
Ich glaube ich habe 3x gesagt, dass Variablen klein benannt werden.
Wie wäre es, wenn die falsche Ausgabe erst kommt wenn er in der Schleife durchläuft und nichts findet und nicht bei jeden Durchgang wenn der Inhalt des Felds des Arrays nicht zutrifft?
 

mk4net

Aktives Mitglied
@volvagia sry, Ich versuchs ja aber ich kommm immer durcheinander also Variablen klein, Methoden groß oder? Und dass mit dem Durchlauf probier ich gleich mal aus
Edit: auf welch Variable beziehst du dich ich hab jz nix gefunden!? :L
Edit2: jz hab ichs sry

@Java-Starter
Zur Zeit verwende ich kein Buch, Ich kann aber das Java von Kopf bis Fuß empfehlen
dass ist sehr gut und witzig geschrieben es sind Jva Rätsel drinnen und gannz nette Beispiele.
Der einzige negative Punkt ist leider dass es erst sehr spät mit Eingaben arbeitet. Dadurch kann man selbst nur sehr wenig probieren was Schade ist. Aber das wissen kann man sich aus dem Internet hohlen.

Was auch sehr gut ist sind die Java Tutorials von theNewBoston bei Youtube gute Englisch kentnisse sind aber erforderlich er redet manchmal echt undeutlich^^ Das is ne 80 Teilige Videoserie die ungefähr nen Umfang von nem kleinen Beginner Buch hat.

mf Nick

Edit3: habs jetzt so gelöst, funktioniert aber auch ncoh nicht richtig :autsch:
Java:
package Befehlsarray;
public class Textverarbeitung {
    private TextverarbeitungListener listener;
    
    public void verarbeiteEingabe(String userInput) {
        userInput = userInput.toLowerCase();
        String[] befehle ={"north","east","south","west"};
        
        for (int x =0;x<befehle.length;x++){// for-SChleife die Alle Befehle im Befehlsarray durchgeht und konntrolliert
        	
        	if(userInput.equals(befehle[x])){	//If (die UserEingabe == dem Befehl[mit der aktuellen Nummer des Durchlaufs]) dann gib etwas aus
        		if(listener != null) {
        			listener.stringOutput(userInput);
        		}
        	}
        	
        }//Ende for-Schleife
        listener.stringOutput("Falsche Eingabe");
    }
 
    public static interface TextverarbeitungListener {
        public void stringOutput(String s);
    }
 
    public void setListener(TextverarbeitungListener textverarbeitungListener) {
        listener = textverarbeitungListener;
    }
}
 
Zuletzt bearbeitet:

Volvagia

Top Contributor
Ich glaube, er hat nicht nach einer Empfehlung gefragt sondern um dich einzuschätzen. ^^
Variablen und Methoden klein, Klassen groß. Ist im deutschen eigendlich ganz einfach. Klassennamen sind Nomen, Methoden sind Verben und Variablen sind Adjektive oder Nomen (wenn eine Klasse der Bestandteil einer anderen Klasse ist, z. B. Auto hat Motor).

Ich denke am einfachsten wäre eine boolean wenn du den Befehl findest zu setzen. Und wenn die Boolean nach dem Durchlauf false ist gibst du eben den Fehler zurück. Oder du verlässt die Methode wenn er was gefunden hat mit return und gibst immer den Fehler am Ende aus.
 

mk4net

Aktives Mitglied
Ich versuch jetz mal so wied du gesagt hast und edits dann wenn ich was hab. Danke.

wegen Jkava Starter hmm ach so.. Einschätzung: ich bin schlecht^^

Edit: Dankeschön funktioniert jetzt endlich wie gewollt.

Was jetzt noch lustig wäre, wenn ich eine Art Karte hätte, ich hätte da an Arrays in Arrays gedacht
falls das sinvoll ist und ich mich dann in diesem Raster bewegen kann.
Und es an jedem RasterPunkt irgendetwas gibt das etwas auslöst...
Wie wäre soetwas gut umzusetzen?
 
Zuletzt bearbeitet:
Ähnliche Java Themen
  Titel Forum Antworten Datum
S Interface JButton etc. wird in JFrame mit paint() nicht angezeigt Java Basics - Anfänger-Themen 6
C Per JButton ein JFrame schliessen Java Basics - Anfänger-Themen 10
fragenÜber(fragen); Turtle Grafik mit GUI (JFrame) Java Basics - Anfänger-Themen 3
E JFrame + Buffer-strategy Java Basics - Anfänger-Themen 8
I JFrame / Screen auf zweitem (definiertem) Monitor öffnen Java Basics - Anfänger-Themen 3
luggas89 Mit Jframe live zeichnen Java Basics - Anfänger-Themen 4
C mehrere JPanel in ein JFrame bringen Java Basics - Anfänger-Themen 9
B HSQL mit JFrame steuern Java Basics - Anfänger-Themen 4
D Wie Objekte im JFrame frei bewegen lassen? Java Basics - Anfänger-Themen 3
D Erste Schritte png in JFrame anzeigen? Java Basics - Anfänger-Themen 3
Thomathy Interface Wie schließt man ein anderes JFrame Fenster? Java Basics - Anfänger-Themen 6
D Probleme mit JFrame und der Größe Java Basics - Anfänger-Themen 8
P JFrame, Linien zeichnen, MouseListener Java Basics - Anfänger-Themen 2
S Kontrollieren ob jframe disposed ist Java Basics - Anfänger-Themen 3
Elyt JFrame in den Hintergrund verschieben Java Basics - Anfänger-Themen 3
OSchriever JFrame-Anwendungsfenster verschieben Java Basics - Anfänger-Themen 17
M Bild in JFrame Java Basics - Anfänger-Themen 1
S Klassenaufruf über JFrame Button Java Basics - Anfänger-Themen 3
W 2 JPanel in einem JFrame Java Basics - Anfänger-Themen 4
CptK Interface Klasse Frame (extends JFrame) aus anderer Klasse schließen Java Basics - Anfänger-Themen 7
S JFrame mit Hintergrundbild und Button Java Basics - Anfänger-Themen 4
S JFrame Java Basics - Anfänger-Themen 15
I JFrame proportional verkleinerbar machen Java Basics - Anfänger-Themen 3
B Java JFrame zeichnen Java Basics - Anfänger-Themen 4
ReinerCoder Vererbung von JFrame in einer Klasse entfernen Java Basics - Anfänger-Themen 5
T Auslagern von Methoden bei einem JFrame Java Basics - Anfänger-Themen 6
N Erste Schritte JFrame Caesar-Verschlüsselung Java Basics - Anfänger-Themen 23
B Erste Schritte Objekte von JFrame der Fenstergröße anpassen Java Basics - Anfänger-Themen 3
J JFrame Fenster öffnet sich nicht Java Basics - Anfänger-Themen 7
3 JFrame immer im Hintergrund Java Basics - Anfänger-Themen 1
F Interface JFrame mit if-Abfrage automatisch schließen lassen? Java Basics - Anfänger-Themen 3
R JFrame nicht verschiebbar Java Basics - Anfänger-Themen 2
T Wenn JFrame Textfelder Hintergrund Grün dann... (if) Java Basics - Anfänger-Themen 3
K Java JFrame mit Hintergrundbild erstellen Java Basics - Anfänger-Themen 1
Aruetiise Variablen JFrame und Variablen Java Basics - Anfänger-Themen 3
H Eclipse JFrame Java Basics - Anfänger-Themen 3
C Variablen von einem JFrame in einen anderen übertragen Java Basics - Anfänger-Themen 3
M Bild wird von JFrame nicht geladen Java Basics - Anfänger-Themen 12
I JFrame minimieren wenn anderes Programm minimiert wird Java Basics - Anfänger-Themen 1
K Methoden Methode starten wenn JFrame geöffnet wird Java Basics - Anfänger-Themen 2
D Erste Schritte JFrame Inhalte werden nicht angezeigt Java Basics - Anfänger-Themen 8
A Variablen In anderer Klasse auf Objekte von JFrame zugreifen Java Basics - Anfänger-Themen 1
B Ist MyFrame oder JFrame besser? Java Basics - Anfänger-Themen 3
Y JFrame sichtbarkeit Java Basics - Anfänger-Themen 4
KeVoZ_ Label auf JFrame willkürlich Positionieren Java Basics - Anfänger-Themen 2
Dechasa Interface JFrame mit mehreren Übereinander liegenden JPanel Java Basics - Anfänger-Themen 5
P JFrame nur einmal öffnen Java Basics - Anfänger-Themen 4
D JFrame - 10 Sekunden bis zum schließen warten. Java Basics - Anfänger-Themen 2
V Tastatur initialisieren JFrame Probleme Java Basics - Anfänger-Themen 6
J JPG in JFrame anzeigen lassen Java Basics - Anfänger-Themen 3
J JFrame ausgabe von Werten Java Basics - Anfänger-Themen 9
F GUI als Klasse oder extend JFrame? Java Basics - Anfänger-Themen 6
F JFrame resize verschiebt JPanel Java Basics - Anfänger-Themen 3
S Wieso wird mein JFrame transparent dargestellt? Java Basics - Anfänger-Themen 5
L [JFrame] Exception - woher? Java Basics - Anfänger-Themen 8
thomasbomme Grafikfehler JFrame- Cleartype Java Basics - Anfänger-Themen 1
GreyFox Arbeit mit JFrame Java Basics - Anfänger-Themen 8
T Erste Schritte 2 Codes zusammen fügen / Label in JFrame Java Basics - Anfänger-Themen 1
Z Zwei Images auf einem JFrame - Aber nur eins wird angezeigt! Java Basics - Anfänger-Themen 5
N Input/Output Wenn kein Input, dann Fehler anzeigen lassen im JFrame Java Basics - Anfänger-Themen 6
W 2 JPanels in 2Klasse in einem JFrame zusammenfügen Java Basics - Anfänger-Themen 12
dat_vin JFrame öffnet sich mehrmals Java Basics - Anfänger-Themen 6
M JFrame Bild einfügen Java Basics - Anfänger-Themen 3
M Rahmen für undekorierten JFrame Java Basics - Anfänger-Themen 6
S JPanel wird versetzt auf JFrame gelegt Java Basics - Anfänger-Themen 2
B Erste Schritte JFrame in Klasse auslagern Java Basics - Anfänger-Themen 4
H JFrame komplett schließen Java Basics - Anfänger-Themen 3
S Brauche hilfe bei Pong (JFrame) Java Basics - Anfänger-Themen 2
M hintergrund in jframe festlegen Java Basics - Anfänger-Themen 4
J JFrame Render Fehler - Warum? Java Basics - Anfänger-Themen 2
I komponenten werden in JFrame nicht richtig angezeigt Java Basics - Anfänger-Themen 1
E 2. JFrame erkennt 1. Frame Java Basics - Anfänger-Themen 6
D Best Practice JFrame im JFrame Java Basics - Anfänger-Themen 2
P Bild in JFrame Titelleiste Java Basics - Anfänger-Themen 7
S Erste Schritte Von JFrame in nächstes JFRame wechseln Java Basics - Anfänger-Themen 0
V JFrame aktualisieren Java Basics - Anfänger-Themen 6
S JFrame ist nicht schwarz Java Basics - Anfänger-Themen 5
B JPanel/JFrame in ein Applet umwandeln (Webfähig) Java Basics - Anfänger-Themen 7
S JFrame wird nicht "bemalt" Java Basics - Anfänger-Themen 2
M Unsichtbare Objekte in JFrame Java Basics - Anfänger-Themen 2
S Textdatei einlesen und JFrame füllen Java Basics - Anfänger-Themen 14
Sogomn JLabel in anderer Klasse zum JFrame hinzufügen Java Basics - Anfänger-Themen 2
B Drawline wird auf JFrame nicht angezeigt Java Basics - Anfänger-Themen 3
N Fokus setzen nachdem JFrame in Vordergrund geholt wurde Java Basics - Anfänger-Themen 7
K Methoden Objekt auf JFrame zeichnen Java Basics - Anfänger-Themen 16
S JFrame leeren Java Basics - Anfänger-Themen 6
X JFrame Fenster einzeln schließen Java Basics - Anfänger-Themen 2
J Klick auf Button -> JFrame öffnet sich erneut. & Datei lässt sich nicht löschen Java Basics - Anfänger-Themen 7
K Erste Schritte Jframe Im Jpanel Java Basics - Anfänger-Themen 4
D Kein Zugriff auf JFrame Java Basics - Anfänger-Themen 2
P JFrame Component automatische Größe verhindern Java Basics - Anfänger-Themen 2
D JFrame, Komponenten verschmiert. Java Basics - Anfänger-Themen 15
M Schriftfarbe in JFrame Java Basics - Anfänger-Themen 24
A JFrame läuft ewig? Java Basics - Anfänger-Themen 2
U JFrame durch ActionListener erweitern Java Basics - Anfänger-Themen 4
B Wie kann man auf das JFrame einer anderen Klasse zugreifen, etwas hinzufügen und entfernen?? Java Basics - Anfänger-Themen 3
N JFrame-Objekt in neuer Methode nicht verfügbar? Java Basics - Anfänger-Themen 3
A Frage zu: JFrame setLocationRelativeTo Java Basics - Anfänger-Themen 3
N Erste Schritte Prozessor Kernanzahl in JFrame Java Basics - Anfänger-Themen 3
DStrohma Transparenter JFrame Java Basics - Anfänger-Themen 3

Ähnliche Java Themen

Neue Themen


Oben