Strings an Textarea anderer Klasse append(en)

Status
Nicht offen für weitere Antworten.
A

Azu

Gast
Hallöle!

Ich bin noch relativ neu auf dem Gebiet Java und habe nun seit 2 Tagen das Problem dass ich nicht weiß, wie ich gewisse Strings in eine Textarea anderer Klasse append(en) kann.

Generell läuft das ganze etwa so ab:
------------------------------------------

Klasse "Main" macht Klasse "Aktion" sichtbar und startet damit einen Thread.

in "Main":
Code:
Aktion akti = new Aktion();
akti.thr.start();

in "Aktion":
Code:
Thread thr = null;
	
public Aktion() {
     this.thr = new Thread(this);
}

In diesem Thread werden nun nach bestimmten Kriterien Strings erzeugt.

Code:
private String results = null;

wird somit (während eine while-Schleife läuft) mit diversen Strings überschrieben.

z.B.
Code:
results = "Dieses ist Durchgang 1";

Soweit so gut. Die Ausgabe in der Konsole läuft einwandfrei.

Nun übergebe ich die generierten Strings an die Klasse "Main":

Ich gebe der Klasse "Aktion" eine Instanz der Klasse "Main" um sie miteinander bekannt zu machen und lege die String-Variable vor.

Code:
private String result = null;
private Main haupt = new Main();

und gebe der "Main"-Klasse eine String-Variable, getter- und setter-Methoden für die Resultate und eine Textarea als Ausgabeziel.

Code:
private String results = null;
private JTextArea jtaAusgabe = new JTextArea("Resultate: \n\n",5,20);

public String getResults() {
     return this.results;
}

public void setResults(String res) {
     this.results = res;
     this.jtaAusgabe.append(this.results);
}

Schlussendlich rufe ich die setter in der actionPerformed der "Aktion" auf um mit jedem Durchgang Strings an Klasse "Main" zu senden

Code:
haupt.setResults(result);

Ich bekomme keine Ausgabe. Alles was die Textarea anzeigt ist der vorgegebene Text. Und der einzige Ort der mir meine Resultate ausgibt, ist die Konsole. Langsam werd ich blind für eigene, weitere Ideen :autsch: und vermute, dass ich dem Wald den ich suche nur mit den Rücken zukehre...

Hoffentlich werdet ihr aus meinem Text hier klar. Wenn nicht, bitte sagen ^^

Freu mich auf eure Ideen/Antworten.


Ich hau mich nu hin.

LG, Azu
 
S

SlaterB

Gast
wahrscheinlich ist
private Main haupt = new Main();
ein anders Main-Objekt, als das welches du visuell wahrnimmst,

suche deinen gesamten Quellcode nach noch einer Codestelle "new Main()" ab,
wenn du zwei hast, dann ist das eine zuviel,
dann musst du wahrscheinlich dem Aktions-Thread das Main-Objekt als Parameter mit übergeben
 

André Uhres

Top Contributor
Als Alternative hier mal eine mögliche Implementation nach dem MVC Prinzip:
Wir können einen Controller bauen, der alles überwacht (das Datenmodell, die GUI und den Thread):
Code:
public class Controller {
    private Aktion frame;
    private Model model;
    public Controller(final Model model, final Aktion frame) {
        this.frame = frame;
        this.model = model;
        new MeinThread(this).start();
    }
    public void setResults(final String str) {
        model.setText(str);
        frame.setResults(model.getText());
    }
}
Den Thread können wir so implementieren:
Code:
public class MeinThread extends Thread {
    private Controller controller;
    public MeinThread(final Controller controller) {
        this.controller = controller;
    }
    @Override
    public void run() {
        for (int i = 0; i < 10; i++) {
            try {
                Thread.sleep(300);
            } catch (InterruptedException ex) {
                ex.printStackTrace();
            }
            controller.setResults("Test " + i);

        }
    }
}
Das Datenmodell:
Code:
public class Model {
    private String text;
    public String getText() {
        return text;
    }
    public void setText(final String text) {
        this.text = text;
    }
}
Die GUI:
Code:
import java.awt.*;
import javax.swing.*;
public class Aktion extends JFrame {
    private JTextArea jTextArea1;
    public Aktion() {
        super("Aktion");
    }
    private void initComponents() {
        jTextArea1 = new JTextArea();
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        getContentPane().add(new JScrollPane(jTextArea1), BorderLayout.CENTER);
        setSize(400, 300);
        setLocationRelativeTo(null);
    }
    void createAndShowGui() {
        Runnable gui = new Runnable() {
            public void run() {
                initComponents();
                setVisible(true);
            }
        };
        //GUI must start on EventDispatchThread:
        SwingUtilities.invokeLater(gui);
    }
    public void setResults(final String str) {
        jTextArea1.append(str + "\n");
    }
}
Und schliesslich die Main-Klasse:
Code:
public class Main {
    private Aktion frame;
    private Model model;
    private Controller controller;
    public Main() {
        model = new Model();
        frame = new Aktion();
        controller = new Controller(model, frame);
    }
    public static void main(final String[] args) {
        new Main().frame.createAndShowGui();
    }
}
 
G

Guest

Gast
Hallo,

erstmal vielen Dank für die prompten Antworten. Bin begeistert! =)

@ André

In deinem Vorschlag ist die Klasse Aktion für die GUI zuständig und die Main für die Abarbeitung, bzw. den Aufruf von GUI, Abarbeitung und Kontrolle - richtig? In meiner bisherigen Struktur ist allerdings die Main für die GUI allein zuständig und die Aktion eben für die Aktionen.

Ich werde aber mal versuchen dein Beispiel zu integrieren, bzw. mein Projekt entsprechend umzuschreiben.

@ SlaterB

Nein, es existiert keine 2. new Main();

Vielen Dank erstmal an dieser Stelle an euch beide! :D


LG Azu
 

Azu

Mitglied
Ich versuche doch mal den Quelltext zu posten - oder zumindest die wichtigen Snippets.

Ich habe 2 Methoden die hier wichtig sind (momentan):

1. Spiel (für die komplette GUI, hier vorher Main genannt)
2. Battle (für die Aktionen, hier vorher Aktion genannt)

Die Klasse Spiel:

Code:
import ...;

@SuppressWarnings("serial")
public class Spiel extends JFrame {

        ...

	// Kampfergebnisse
	private String results = null;
	private JTextArea jtaBattle = new JTextArea("Kampfresultate: \n\n",5,20);

        ...

	// Kampfergebnisse
	public String getResults()
	{
		return this.results;
	}	
	// Kampfergebnisse in Textarea einfügen
	public void setResults(String res)
	{
		this.results = res;
		this.jtaBattle.append(this.results);
	}	

	public Spiel() {
		super("Titel");
		this.setDefaultCloseOperation(EXIT_ON_CLOSE);
		// Größe und Position festlegen
		Dimension screen = Toolkit.getDefaultToolkit().getScreenSize();
		setBounds(screen.width / 2 - 400, screen.height / 2 - 300, 800, 600);
		setContentPane(new GameBG("layout/game.png"));
		Container con = getContentPane();
		con.setLayout(null);

		// Fensterrahmen weg, Resize verbieten
		this.setUndecorated(true);
		this.setResizable(false);

		// Label für Kampfergebnisse
		jtaBattle.setForeground(Color.BLACK);
		jtaBattle.setBackground(new Color(245, 233, 192));
		jtaBattle.setBorder(BorderFactory.createLineBorder(Color.BLACK));
		jtaBattle.setFont(new Font("Tahoma", Font.PLAIN, 12));
		jtaBattle.setBounds(200, 100, 400, 400);
		jtaBattle.setVisible(false);
		con.add(jtaBattle);
		
                ...
	}

	// Klasse für JFrame-Hintergrund
	class GameBG extends JPanel {
		Image bgimg = null;

		public GameBG(String imgpath) {
			if (imgpath != null) {
				MediaTracker mt = new MediaTracker(this);
				bgimg = Toolkit.getDefaultToolkit().getImage(imgpath);
				mt.addImage(bgimg, 0);
				try {
					mt.waitForAll();
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
		}

		protected void paintComponent(Graphics gr) {
			super.paintComponent(gr);
			gr.drawImage(bgimg, 0, 0, this.getWidth(), this.getHeight(), this);
		}
	}

	// Klasse für Auswahl-Buttons
	public class ImgBtns extends JButton implements ActionListener {

		public ImgBtns(String path, int x, int y, int width, int height,
				Border border) {
                       ...
		}

		@Override
		public void actionPerformed(ActionEvent e) {

			// Instanz der run Methode Battle
			Battle btl = new Battle(getPlayer(),getOpponent());

			if (...) {
                                ...
			} else if (...) {
                                ...
			} else if (e.getSource().equals(btnAccept)) {
                                ...
					// Kampf einleiten!
					btl.t.start();
                                        // Textarea für Resultate sichtbar machen
					jtaBattle.setVisible(true);
					jtaBattle.setEditable(false);
				} else {
					JOptionPane.showMessageDialog(null,"keine Auswahl");
				}
			}
		}
	}

	public static void main(String[] args) {
		new Spiel().setVisible(true);
	}
}
 

Azu

Mitglied
Die Klasse Battle:

Code:
import ...;

public class Battle implements Runnable {

	Spiel game = new Spiel();
	String result = null;

        ...

	Thread t = null;
	
	public Battle() {
		this.t = new Thread(this);
	}

	public Battle(String player1, String player2) {
		this.player1 = player1;
		this.player2 = player2;
		this.t = new Thread(this);
	}

        ...

	public void run() {

               ...

		while (this.bedingung1 > 0 && this.bedingung2 > 0 && !this.t.isInterrupted()) {

                        ...

			if (...) {
                                ...

			} else {
                                ...

			}
                                // Ausgabe an Klasse Spiel übergeben
				game.setResults(result);

                        // Andere Ausgabe hier (Ergebnisse am Ende)
			if (...) {

                                ...

				// Ausgabe an Klasse Spiel senden
				game.setResults(result);
				// Thread hier beenden!
				this.t.interrupt();
			} else if (...) {

                                ...

				// Ausgabe an Klasse Spiel senden
				game.setResults(result);
				// Thread hier beenden!
				this.t.interrupt();
			}
		}
	}
}
 

André Uhres

Top Contributor
Anonymous hat gesagt.:
In deinem Vorschlag ist die Klasse Aktion für die GUI zuständig
Das war wohl ein Missverständis, weil du davon gesprochen hast, daß die Klasse Aktion "sichtbar" gemacht wird.
Aber egal, ich wollte ja auch nur das MVC Prinzip verdeutlichen, da tun die Klassennamen nix zur Sache.
Was ich eigentlich zeigen wollte:
wir machen eine Modelklasse für die Daten,
eine Viewklasse für die Guikomponenten,
eine Controllerklasse für die Listener/Kontrollfunktionen und eine Initialisierungsklasse
um die drei zu instanzieren. Da diese auch miteinander sprechen
müssen, sorgt die Initialisierungsklasse ebenfalls für die nötigen Bekanntschaften,
z.B. bekommt der Controller eine Referenz zu Model und View..

Aber das, was SlaterB sagte, sollten wir wirklich ernst nehmen. Es ist nämlich ein häufiger Fehler,
daß man die gleiche Klasse ungewollt zweimal instanziert und sich dann wundert,
daß die erste Instanz nicht richtig reagiert.
 

Azu

Mitglied
Kein Problem.

Danke nochmal für die Hilfestellung. Ich werd dann mal versuchen, deinen Vorschlag für mein Projekt umzusetzen.

P.S.: Ich sehe nichts was darauf hinweist, dass ich die Klasse Spiel zweimal instanziiere... Vielleicht bin ich aber auch nur blind. =/ Auf jeden Fall weiß ich jeden Hinweis und Rat wirklich zu schätzen ;)

--------

@ SlaterB: Vielen Dank für den Tipp!
@ André: Vielen Dank für das Beharren darauf, SlaterB's Hinweis ernst zu nehmen ^^

Es läuft nun einwandfrei. Nachdem ich dem "Aufruf der Methode "Aktion" die Klasse "Main" als Parameter mitgegeben habe". Vielen vielen Dank!!! =D
 
S

SlaterB

Gast
wie kann denn hier noch eine Diskussion sein, ob Spiel/ Main einmal oder zweimal erzeugt wurde,
ist doch deutlich zu sehen:

> public static void main(String[] args) {
> new Spiel().setVisible(true);
> }


+

> public class Battle implements Runnable {
>
> Spiel game = new Spiel();
> String result = null;


ich hole meinen Taschenrechner raus, 1 + 1, hmm ja, ne, doch, gleich 2!

> Nachdem ich dem "Aufruf der Methode "Aktion" die Klasse "Main" als Parameter mitgegeben habe".

genau, viel besser,
ob nun nach MVC oder einfach ist ja erstmal egal, nur nicht zwei unterschiedliche Spiel/ Main
 

Azu

Mitglied
Diskussion? Lies doch mal meinen letzen Beitrag ... :gaen:

Ist doch nun alles geklärt - dank dir und André.
 

André Uhres

Top Contributor
Sorry, ich hatte die Klassen Spiel und Battle gar nicht angeschaut.
Jetzt seh ich's auch, sogar ohne Brille.
Es musste ja auch so sein, darum hab ich den Hinweis bekräftigt.
Der Fehler kann einem selbstverständlich mit oder ohne MVC unterlaufen.
Ich dachte nur, MVC wäre eine bessere Struktur für diese Anwendung.
 

Azu

Mitglied
Sagen wirs mal so:

Ihr habt mir beide sehr geholfen und die MVC-Struktur interessiert mich =)
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
W Vergleich zweier Strings und schreiben in Textarea AWT, Swing, JavaFX & SWT 12
Justin09 Strings prüfen AWT, Swing, JavaFX & SWT 4
H setToolTipText ignoriert HTML-Formatierung des anzuzeigenden Strings AWT, Swing, JavaFX & SWT 4
G Button Strings Effektiver setzen AWT, Swing, JavaFX & SWT 3
P GUI Ausgabe des Strings AWT, Swing, JavaFX & SWT 3
D JComboBox Strings aus JTextFields zuordnen AWT, Swing, JavaFX & SWT 2
B ArrayList, Strings anzeigen AWT, Swing, JavaFX & SWT 1
Fiedlerdan Vergleich vieler Strings ohne ellenlange Argumentierten AWT, Swing, JavaFX & SWT 7
M Strings im JTextPane vergleichen und mit StyledDocument formatieren AWT, Swing, JavaFX & SWT 3
J Swing Strings werden nicht in Textfeld geschrieben AWT, Swing, JavaFX & SWT 8
MrSnake Tabelle nach 2 Strings Filtern AWT, Swing, JavaFX & SWT 3
MiMa Umlaute in JavaFX GUI Strings AWT, Swing, JavaFX & SWT 5
J Swing Vertikales Zeichnen eines Strings mit Java2D AWT, Swing, JavaFX & SWT 1
B jTextfield Übergabe des Strings AWT, Swing, JavaFX & SWT 16
G Mehrere Strings um Kreis zeichnen und positionieren AWT, Swing, JavaFX & SWT 0
vodkaz JTextField && Strings AWT, Swing, JavaFX & SWT 2
R FontMetrics - Ausmaße eines Strings AWT, Swing, JavaFX & SWT 4
A Swing Anpassen der Spaltenbreite durch die länge eines Strings AWT, Swing, JavaFX & SWT 3
M breite eines "drawString()-Strings" AWT, Swing, JavaFX & SWT 2
J Swing JList... mehrere Strings in Zeile AWT, Swing, JavaFX & SWT 8
M SWT Jface Action und localised Strings AWT, Swing, JavaFX & SWT 6
F Pixelhöhe eines Strings AWT, Swing, JavaFX & SWT 2
R Pixelmaße eines zu zeichnenden Strings AWT, Swing, JavaFX & SWT 3
ElViZ End-Position eines gezeichneten Strings ermitteln. AWT, Swing, JavaFX & SWT 2
Pithecanthropus [gelöst] JTree, aber nicht mit Strings, sondern mit Objects? AWT, Swing, JavaFX & SWT 2
K Strings aus jTextArea in Liste oder Tabelle übertragen- wie? AWT, Swing, JavaFX & SWT 4
D Einzelnen Worte eines Strings farbig machen AWT, Swing, JavaFX & SWT 11
M Farbe eines strings in JTextArea AWT, Swing, JavaFX & SWT 2
A Strings in JTable fett ausgeben - ohne! HTML AWT, Swing, JavaFX & SWT 10
N Pixelbreite eines Strings AWT, Swing, JavaFX & SWT 11
B Länge eines Strings in Pixel AWT, Swing, JavaFX & SWT 2
K Problem mit TextField Strings AWT, Swing, JavaFX & SWT 2
G Verzeichnis Strings im JTree AWT, Swing, JavaFX & SWT 9
R Strings aus einer .txt laden AWT, Swing, JavaFX & SWT 8
M Höhe von eines Strings in Pixeln (nicht Höhe einer Zeile) AWT, Swing, JavaFX & SWT 12
W Strings diagonal zeichnen AWT, Swing, JavaFX & SWT 2
TRunKX Kommentarfeld schneidet die Strings ab AWT, Swing, JavaFX & SWT 13
N Laenge eines Strings in Pixel AWT, Swing, JavaFX & SWT 2
R Steuerzeichen eines Strings (z.B. ENTER) zurückwandeln AWT, Swing, JavaFX & SWT 3
S Anzahl ActionEvents (Strings in eine ArrayList einfügen) AWT, Swing, JavaFX & SWT 4
N Checkbox mit mehreren Strings belegen? AWT, Swing, JavaFX & SWT 6
L TextArea Zeichenabstand gleich machen AWT, Swing, JavaFX & SWT 8
ProggersWorld JavaFX TextArea BackgroundImage wird nicht angezeigt AWT, Swing, JavaFX & SWT 3
K Textarea aktuallisiert sich nicht, nach Auswahl (Itemlistener) AWT, Swing, JavaFX & SWT 3
D JavaFX TextArea Probleme bei langen Zeilen AWT, Swing, JavaFX & SWT 1
D Hohe Prozessorauslastung bei Ausgabe auf TextArea AWT, Swing, JavaFX & SWT 2
N Einer TextArea ein ScrollPane hinzufügen AWT, Swing, JavaFX & SWT 8
N Textdatei GUI, Text in Textarea anzeigen mehrere Zeilen AWT, Swing, JavaFX & SWT 1
Hatsi09 TextArea formattieren AWT, Swing, JavaFX & SWT 4
ralfb1105 JavaFX MVC: Thread in Model Class mit Ausgabe in TextArea AWT, Swing, JavaFX & SWT 10
E Eingabe von Zahlen in TextArea AWT, Swing, JavaFX & SWT 2
K JavaFX: TextArea updated nicht AWT, Swing, JavaFX & SWT 7
M JavaFX TextArea disabled - ScrollBar enabled AWT, Swing, JavaFX & SWT 3
G Probleme mit TextArea AWT, Swing, JavaFX & SWT 5
R Java FX - Fxml - relative Größenangaben für Breite und Höhe einer TextArea AWT, Swing, JavaFX & SWT 8
R Swing Durch JComboBox-Item eine TextArea aktualisieren AWT, Swing, JavaFX & SWT 2
MrSnake JavaFX TextArea updated nicht AWT, Swing, JavaFX & SWT 22
N JavaFX TextArea Updaten bevor Prozess gestartet wird AWT, Swing, JavaFX & SWT 7
B Java FX FXML Textarea SceneBuilder als XML Editor AWT, Swing, JavaFX & SWT 1
T JavaFX System.out.println in TextArea AWT, Swing, JavaFX & SWT 15
F JavaFX JavaFX HTMLEditor-Eingabe in Textarea als HTML anzeigen AWT, Swing, JavaFX & SWT 2
E To get a color text on the TextArea AWT, Swing, JavaFX & SWT 4
E To get color text on the TextArea AWT, Swing, JavaFX & SWT 5
S passende PaintComponent ? Zeichnen in TextArea mit Scrollpane ? AWT, Swing, JavaFX & SWT 2
E Swing Error icon in der TextArea AWT, Swing, JavaFX & SWT 1
thobren JavaFX textarea nach setPrefRowCount Ansicht aktualisieren AWT, Swing, JavaFX & SWT 1
thobren JavaFX Inhalte aus dynamischen vbox mit TextArea auslesen AWT, Swing, JavaFX & SWT 9
thobren Swing Im JPanel wird nur TextArea gelöscht AWT, Swing, JavaFX & SWT 13
J JavaFX TextArea dynamisch Icon im Background anzeigen AWT, Swing, JavaFX & SWT 2
M JavaFX TextArea einzelne Buchstaben färben AWT, Swing, JavaFX & SWT 3
M JavaFX TextArea richtig formatieren AWT, Swing, JavaFX & SWT 4
S ScrollPane in Textarea und auf Panel AWT, Swing, JavaFX & SWT 4
S Die Rücktaste und Entfernen in einer Textarea blockieren AWT, Swing, JavaFX & SWT 3
S TextArea get Selected row(Text) AWT, Swing, JavaFX & SWT 6
F textarea lässt panel verschwinden AWT, Swing, JavaFX & SWT 4
V Swing Update Textarea AWT, Swing, JavaFX & SWT 2
E TextArea - Maximale Zeichenanzahl AWT, Swing, JavaFX & SWT 2
N Swing teilstring in textarea fett machen AWT, Swing, JavaFX & SWT 13
J Swing TextArea mit nicht-editierbarem Text AWT, Swing, JavaFX & SWT 7
R AWT TextArea schreibunfähig machen AWT, Swing, JavaFX & SWT 5
J Werkzeugleiste für TextArea? AWT, Swing, JavaFX & SWT 10
M TextArea über mehrere Zeilen - wie Zeileanzahl abfragen? AWT, Swing, JavaFX & SWT 5
S Textarea und Enter AWT, Swing, JavaFX & SWT 5
El_Lobo Swing Swing TextArea und JTextField werden nicht aktualisiert AWT, Swing, JavaFX & SWT 2
R Textarea zeigt Text nicht an AWT, Swing, JavaFX & SWT 5
H TextArea zeigt kein Text an AWT, Swing, JavaFX & SWT 6
S Frage zu TextArea AWT, Swing, JavaFX & SWT 2
C TextArea Ausgabe immer ganz oben AWT, Swing, JavaFX & SWT 3
C Konsolenausgabe in TextArea ausgeben AWT, Swing, JavaFX & SWT 8
P Swing Methodenaufruf beeinflusst TextArea nicht. AWT, Swing, JavaFX & SWT 6
S TextArea ausgabe ohne JFrame zu implementieren AWT, Swing, JavaFX & SWT 2
M Swing Eine andere Klasse über Button starten und in TextArea ausgeben AWT, Swing, JavaFX & SWT 13
M Inhalt aus TextArea verarbeiten AWT, Swing, JavaFX & SWT 4
A Swing Text von System.out.printIn in eine TextArea übergen AWT, Swing, JavaFX & SWT 12
S Sobald ich TextArea mit Text fülle alles weg? AWT, Swing, JavaFX & SWT 5
P TextArea Größenänderung AWT, Swing, JavaFX & SWT 4
M problem mit keylistener/textarea AWT, Swing, JavaFX & SWT 6
H anderes font in textarea AWT, Swing, JavaFX & SWT 2
E Datei in TextArea anzeigen AWT, Swing, JavaFX & SWT 12
Luy Per TAB-Taste aus TextArea wieder raus? AWT, Swing, JavaFX & SWT 5

Ähnliche Java Themen

Neue Themen


Oben