BufferedReader in GUI Benutzen

Status
Nicht offen für weitere Antworten.

torfkop

Mitglied
Moin,

ich habe hier ein Problem. Bisher habe ich mit dem BufferedReader angegeben, welcher Teil aufgerufen werden soll.
Java:
public static void main(String[] args) throws Exception {

		BufferedReader userIn = new BufferedReader(new InputStreamReader(
				System.in));

		System.out
				.println("Möchten sie ein Spiel 1.speichern 2.laden oder 3.neu beginnen?");
		String inputData = userIn.readLine();
		int choose = Integer.parseInt(inputData);

		if (choose == 1) {
			Field field = new Field();
			System.out
					.println("Bitte den Dateinamen mit in folgender Form angeben *.txt");
			String savedatei = userIn.readLine();
			File file = new File(savedatei);
			field.save(file);

		}
		if (choose == 2) {
			Field field = new Field();
			System.out
					.println("Bitte den Dateinamen mit in folgender Form angeben *.txt");
			String savedatei = userIn.readLine();
			File file = new File(savedatei);
			field.load(file);
			field.put();

		}
		if (choose == 3) {
			Field field = new Field();
			field.put();

		}
		if (choose == 4) {
			Field field = new Field();
			field.setField2(0, 4, 'x');
			System.out.print(field.toString());
		}
		if (choose >= 5 || choose < 1) {
			try {
				throw new OwnException("Bitte nur Werte von 1 - 3 benutzen");
			} catch (OwnException e) {
				System.out.println(e.getMessage());
				main(args);

			}
		}

	}

Das ganze befindet sich in meiner Start Klasse. Jetzt habe ich angefangen eine GUI zu basteln. Dieses habe ich in einer anderen Klasse gemacht.

Dort sieht das bisher wie folgt aus:
Das ganze befindet sich in meiner Start Klasse. Jetzt habe ich angefangen eine GUI zu basteln. Dieses habe ich in einer anderen Klasse gemacht.

Dort sieht das bisher wie folgt aus:
Java:
package Game;

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


public class GUI {
	JButton start = new JButton ("Start");
	JButton save = new JButton ("Save");
	JButton load = new JButton ("Load");
	
	public GUI() {
		// Die ActionEvents werden eingesetzt
		start.addActionListener((ActionListener) this);
		save.addActionListener((ActionListener) this);
		load.addActionListener((ActionListener) this);
		
		// Das Panel für die Buttons wird erzeugt
		JPanel chooseButtons = new JPanel(new FlowLayout());
		chooseButtons.add(start);
		chooseButtons.add(save);
		chooseButtons.add(load);
		
		// Das Hauptfenster wird erzeugt
		JFrame window = new JFrame();
		window.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
		window.pack();
		window.setVisible(true);
		window.setContentPane(chooseButtons);
}

Jetzt möchte ich für die Buttons start, save und load die entsprechenden Daten aus dem BufferedReader benutzen.

Kann mir jemand sagen, wie das funktioniert?
 

DerEisteeTrinker

Bekanntes Mitglied
also wenn ich das nicht völlig falsch lese, dann willst du deine GUI mit Eingaben aus der Konsole füllen. WARUM? Lass es doch einfach in der GUI eingeben :bahnhof:
 

torfkop

Mitglied
Ahh ich weiß wie du meinst. Ich soll also einfach die einzelnen Methoden für die jeweiligen Buttons verwenden oder hab ich dich jetzt falsch verstanden?
 

torfkop

Mitglied
Ich hab das ganze jetzt mal geändert. Jetzt hab ich mal eine ganz doofe Frage. Irgendwie hab ich Probleme meine GUI Klasse aufzurufen. Diese sieht nun wie folgt aus:

Java:
package Game;

import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
import java.io.IOException;


public class GUI {
	JButton start = new JButton ("Start");
	JButton save = new JButton ("Save");
	JButton load = new JButton ("Load");
	
	public GUI() {
		// Die ActionEvents werden eingesetzt
		
		start.addActionListener((ActionListener) this);
		save.addActionListener((ActionListener) this);
		load.addActionListener((ActionListener) this);
		
		
		// Das Panel für die Buttons wird erzeugt
		JPanel chooseButtons = new JPanel(new FlowLayout());
		chooseButtons.add(start);
		chooseButtons.add(save);
		chooseButtons.add(load);
		
		// Das Hauptfenster wird erzeugt
		JFrame window = new JFrame();
		window.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
		window.pack();
		window.setVisible(true);
		window.setContentPane(chooseButtons);
		
		
		
	}
	
	
	public void actionPerformed(ActionEvent e) throws IOException {
		
			if (e.getSource() == start){
				Field field = new Field();
				field.put();
					
			}
		
		
	}

	

}

Jetzt möchte ich einfach aus meiner main-Klasse diese aufrufen. Hab versucht die Methode actionPerformed so aufzurufen:

Java:
GUI.actionPerformed();

Bin ein wenig verwundert, warum das nicht funktioniert.
 

eRaaaa

Top Contributor
new GUI();

aufrufen aus deiner main-klasse heraus?!

/edit:

Java:
 start.addActionListener((ActionListener) this);
        save.addActionListener((ActionListener) this);
        load.addActionListener((ActionListener) this);
sollte so auch nicht funktionieren. implementiere ActionListener und schreibe dann
Java:
 start.addActionListener(this);
        save.addActionListener( this);
        load.addActionListener( this);
das sollte dann auch gehen
 
Zuletzt bearbeitet:

jason

Mitglied
1. Wieso willst du denn
Code:
actionPerformed()
aufrufen?
Die Methode wird aufgerufen, wenn ein Button gedrückt wird.
2. Es gibt nur die Methode
Code:
actionPerformed(ActionEvent)
und nicht die Methode
Code:
actionPerformed()

Um das Fenster anzuzeigen musst du einfach nur, wie eRaaaa schon gesagt hat, eine neue Instanz der Klasse
Code:
GUI
erzeugen.

MfG jason
 

torfkop

Mitglied
Ok habe das ganze nun in meiner main-Klasse mit

new GUI();

angegeben. Meine startet allerdings trotzdem nicht.

Wenn ich den actionlistener wie folgt angeben:

Java:
start.addActionListener(this);
        save.addActionListener( this);
        load.addActionListener( this);
bekomme ich dabei ne Fehlermeldung vom Compiler.

Den actionlistener habe ich bisher Teilimplementiert mit:
Java:
public void actionPerformed(ActionEvent e) throws IOException {
        
            if (e.getSource() == start){
                Field field = new Field();
                field.put();
                    
            }

bin mir nur nicht sicher, ob das so richtig ist.
 

eRaaaa

Top Contributor
ich meinte das eher so:

Java:
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

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

public class GUI implements ActionListener {
	JButton start = new JButton("Start");
	JButton save = new JButton("Save");
	JButton load = new JButton("Load");

	public GUI() {
		// Die ActionEvents werden eingesetzt

		start.addActionListener(this);

		save.addActionListener(this);

		load.addActionListener(this);


		// Das Panel für die Buttons wird erzeugt
		JPanel chooseButtons = new JPanel(new FlowLayout());
		chooseButtons.add(start);
		chooseButtons.add(save);
		chooseButtons.add(load);

		// Das Hauptfenster wird erzeugt
		JFrame window = new JFrame();
		window.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
		window.add(chooseButtons);
		window.pack();
		window.setLocationRelativeTo(null);
		window.setVisible(true);

	}

	public void actionPerformed(ActionEvent e) {
		// ...
	}

}
 
Zuletzt bearbeitet:

torfkop

Mitglied
genau das habe ich getan. Nur startet meine GUI beim Programmstart irgendwie immer noch nicht. Haste noch nen Tipp?
 

eRaaaa

Top Contributor
also das muss funktionieren (hast du auch implements ActionListener hinter public class GUI geschrieben? )

desweiteren solltest du vllt window.setContentPane(chooseButtons); vor window.pack(); aufrufen.
aber sonst sollte das imo laufen !
 

hdi

Top Contributor
Es fehlt ein

Java:
window.addActionListener(this);

Außerdem solltest du nicht das ContentPane austauschen, sondern dein Panel drauflegen:

Java:
// window.setContentPane(chooseButtons); <- nein
window.getContentPane().add(chooseButtons); // oder einfach window.add(chooseButtons)
 

eRaaaa

Top Contributor
Es fehlt ein

Java:
window.addActionListener(this);
wieso das?
Außerdem solltest du nicht das ContentPane austauschen, sondern dein Panel drauflegen:

Java:
// window.setContentPane(chooseButtons); <- nein
window.getContentPane().add(chooseButtons); // oder einfach window.add(chooseButtons)
stimmt schon, laufen sollte es dennoch
 

torfkop

Mitglied
Hab das implement noch hinzugefügt. Dadurch wollte er die Exception nicht mehr im ActionListener haben. Diese habe ich entfernt und durch try erweitert. Ich habe hier nochmal meine Start Klasse:

Java:
public class Start {
	/**
	 * Die Mainmethode beinhaltet die Startmöglichkeiten des Spiels.
	 * 
	 * @param args
	 * @throws Exception
	 *             OwnException
	 */
	public static void main(String[] args) throws Exception {

		new GUI();

		BufferedReader userIn = new BufferedReader(new InputStreamReader(
				System.in));

		System.out
				.println("Möchten sie ein Spiel 1.speichern 2.laden oder 3.neu beginnen?");
		String inputData = userIn.readLine();
		int choose = Integer.parseInt(inputData);

		if (choose == 1) {
			Field field = new Field();
			System.out
					.println("Bitte den Dateinamen mit in folgender Form angeben *.txt");
			String savedatei = userIn.readLine();
			File file = new File(savedatei);
			field.save(file);

		}
		if (choose == 2) {
			Field field = new Field();
			System.out
					.println("Bitte den Dateinamen mit in folgender Form angeben *.txt");
			String savedatei = userIn.readLine();
			File file = new File(savedatei);
			field.load(file);
			field.put();

		}
		if (choose == 3) {
			Field field = new Field();
			field.put();

		}
		if (choose == 4) {
			Field field = new Field();
			field.setField2(0, 4, 'x');
			System.out.print(field.toString());
		}
		if (choose >= 5 || choose < 1) {
			try {
				throw new OwnException("Bitte nur Werte von 1 - 3 benutzen");
			} catch (OwnException e) {
				System.out.println(e.getMessage());
				main(args);

			}
		}

	}
	
		
		

	
}

Und dann hier meine GUI Klasse:

Java:
package Game;

import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
import java.io.IOException;


public class GUI implements ActionListener{
	JButton start = new JButton ("Start");
	JButton save = new JButton ("Save");
	JButton load = new JButton ("Load");
	
	public void gui() {
//		public void newmethod() {
		// Die ActionEvents werden eingesetzt
		
		start.addActionListener((ActionListener) this);
		save.addActionListener((ActionListener) this);
		load.addActionListener((ActionListener) this);
		
		
		// Das Panel für die Buttons wird erzeugt
		JPanel chooseButtons = new JPanel(new FlowLayout());
		chooseButtons.add(start);
		chooseButtons.add(save);
		chooseButtons.add(load);
		
		// Das Hauptfenster wird erzeugt
		JFrame window = new JFrame();
		window.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
		window.setContentPane(chooseButtons);
		window.pack();
		window.setVisible(true);
		
		
		
		
	}
	
	
	public void actionPerformed(ActionEvent e) {
		
			if (e.getSource() == start){
				Field field = new Field();
				try {
					field.put();
				} catch (IOException e1) {
					// TODO Auto-generated catch block
					e1.printStackTrace();
				}
					
			}
		
		
	}

	

}

Finde das alles irgendwie ein wenig merkwürdig
 

eRaaaa

Top Contributor
vergleiche mal deine zeile

load.addActionListener((ActionListener) this);

mit meiner oben !!

/edit: was genau soll eig. in deinem listener passieren? ???:L
 

eRaaaa

Top Contributor
a) bitte poste doch mal komplettze fehlermeldungen anstatt immer nur zu schreiben: geht nicht
b) beantworte bitte die frage: was soll im listener geschehen?
c)
Java:
if (e.getSource() == start){
                Field field = new Field();
                try {
                    field.put();
                } catch (IOException e1) {
                    // TODO Auto-generated catch block
                    e1.printStackTrace();
                }
                    
            }
scheint deine fehlerquelle zu sein
 

torfkop

Mitglied
ich habe bisher in per consolen Eingabe gesteurt wie das Spiel beginnen soll. Also ob das Spiel gestartet, geladen oder das aktuelle (leere Spielfeld) gespeichert werden soll. Das sah dann im Code so aus:

Java:
 BufferedReader userIn = new BufferedReader(new InputStreamReader(
                System.in));
 
        System.out
                .println("Möchten sie ein Spiel 1.speichern 2.laden oder 3.neu beginnen?");
        String inputData = userIn.readLine();
        int choose = Integer.parseInt(inputData);
 
        if (choose == 1) {
            Field field = new Field();
            System.out
                    .println("Bitte den Dateinamen mit in folgender Form angeben *.txt");
            String savedatei = userIn.readLine();
            File file = new File(savedatei);
            field.save(file);
 
        }
        if (choose == 2) {
            Field field = new Field();
            System.out
                    .println("Bitte den Dateinamen mit in folgender Form angeben *.txt");
            String savedatei = userIn.readLine();
            File file = new File(savedatei);
            field.load(file);
            field.put();
 
        }
        if (choose == 3) {
            Field field = new Field();
            field.put();
 
        }

Das möchte ich nun in eine GUI umwandeln.
Das Problem ist im Moment, dass mir keine Fehlermeldung angezeigt wird. Laut Compiler scheint alles zu stimmen. Aus irgendwelchen Gründen startet meine GUI aber nicht. Also es wird nichtmal ein Window eröffnet.
 

torfkop

Mitglied
Bevor ich dich weiter mit meinen nervigen Fragen quälen muss, kann ich dir berichten, dass ich nun doch selber drauf gekommen bin. Meine Instanzierung war falsch. Hab dabei irgendwie nicht nachgedacht.

Hatte nur da stehen:

Java:
new GUI();

Hab einfach vergessen das so hinzuschreiben.
Java:
GUI gui = new GUI();
gui.gui();

Aber erstmal VIELEN DANK!
 

hdi

Top Contributor
Und jetzt noch ein Tipp: Generell benutzt du gar nicht das Konzept von OOP, das solltest du ändern.

1. Deine GUI-Klasse sollte ein Fenster sein, also extends JFrame. Alles, was du bisher mit deinem "window" getan hast, machst du dann einfach mit "this".

2. Die Inhalte der gui()-Methode in den Konstruktor schieben, und die Methode entfernen. Genau für solche Initialisierungs- bzw. "Aufbau"-Dinge ist der Konstruktor nämlich gedacht

3. Ein ActionListener, der nicht an der Klasseninstanz selber hängt, sondern an irgendwelchen anderen Objekten (wie bei dir die Buttons), sollte dann auch nicht von der Klasse implementiert sein, imho. Intuitiv denkt man dann nämlich, dass er auch auf die Instanz der Klasse angewandt wird. (Das hab ich vorher gedacht als ich nicht gesehen habe dass du den für Buttons brauchst).
D.h. mach dir eine eigene (meinetwegen innere oder gar anonyme) Klasse für den ActionListener, aber implementier das Interface nicht in der GUI-Klasse selber - die nutzt es ja auch nicht. Das ist einfach irreführend.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
H Swing BufferedReader.close() hängt im SwingWorker AWT, Swing, JavaFX & SWT 1
A BufferedReader AWT, Swing, JavaFX & SWT 6
R 2D-Grafik Massive Frame Drops beim Benutzen von AffineTransformOp AWT, Swing, JavaFX & SWT 2
L JavaFX Eigene Font benutzen AWT, Swing, JavaFX & SWT 6
1 Swing Progressbar benutzen um Fortschritt einer Methode anzuzeigen AWT, Swing, JavaFX & SWT 4
D SQL Statements mit Java Swing benutzen AWT, Swing, JavaFX & SWT 4
B JavaFX Spritesheet benutzen AWT, Swing, JavaFX & SWT 0
K Swing Textfeld verstecken aber benutzen AWT, Swing, JavaFX & SWT 15
Tom299 JavaFX Text oder Label benutzen AWT, Swing, JavaFX & SWT 4
W Swing JLabel jede Sekunde aktualisieren, ohne Timer zu benutzen AWT, Swing, JavaFX & SWT 4
J ComboBox als Filter benutzen AWT, Swing, JavaFX & SWT 1
TheSorm Swing JScroolBar richtig benutzen AWT, Swing, JavaFX & SWT 0
S Swing, Button benutzen zum Hintergrund wechseln AWT, Swing, JavaFX & SWT 3
B Play Button auch als Stop Button benutzen, MP3 Player AWT, Swing, JavaFX & SWT 7
K AWT Welche color benutzen? AWT, Swing, JavaFX & SWT 4
P non-static variablen benutzen AWT, Swing, JavaFX & SWT 7
B Java auf dem Desktop benutzen AWT, Swing, JavaFX & SWT 7
S JOptionPane sinnvoll benutzen AWT, Swing, JavaFX & SWT 7
M SWT /Jface Wann einen ColumnLabelProvider benutzen? AWT, Swing, JavaFX & SWT 2
C JTree LastSelectedPathComponent benutzen? AWT, Swing, JavaFX & SWT 3
Burny91 Swing Swatches vom JColorChooser als Icon für JButton benutzen AWT, Swing, JavaFX & SWT 4
Developer_X Java - Grafikkarte benutzen AWT, Swing, JavaFX & SWT 8
T bei einem jtextfield Farben benutzen AWT, Swing, JavaFX & SWT 7
U 2 JDialogs benutzen ein windowClosed()? AWT, Swing, JavaFX & SWT 21
M AbstractAction, wann benutzen? AWT, Swing, JavaFX & SWT 2
G welches Layout sollte ich benutzen? AWT, Swing, JavaFX & SWT 2
H welche Klasse benutzen? AWT, Swing, JavaFX & SWT 4
M Gesamte Größe benutzen AWT, Swing, JavaFX & SWT 3
R Eclipse RCP: Extension point benutzen? AWT, Swing, JavaFX & SWT 3
S Benutzen einer GUI AWT, Swing, JavaFX & SWT 7
R Im JFrame ein JApplet zum öffnen einer Url benutzen AWT, Swing, JavaFX & SWT 22
B JTextArea als StatusWindow benutzen AWT, Swing, JavaFX & SWT 3
G JFace benutzen, aber wie! AWT, Swing, JavaFX & SWT 2
G JButton benutzen um ein neues JFrame zu erstellen AWT, Swing, JavaFX & SWT 3
S gleiche elemente öffters benutzen AWT, Swing, JavaFX & SWT 10
I JLabel als Button benutzen AWT, Swing, JavaFX & SWT 16
D AppletCode als JAR aus JSP benutzen und als Grafik speichern AWT, Swing, JavaFX & SWT 2
Z FileChooer auch mit SWT benutzen? AWT, Swing, JavaFX & SWT 2

Ähnliche Java Themen

Neue Themen


Oben