Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
ich möchte eine TextArea aktualisieren, weiss aber nicht, wie ich eine Referenz auf diese herstelle.
Mein Programm hat folgenden Aufbau:
Ich möchte gerne die textArea1 aktualisieren, leider fehlt mir in TestSubClass die Referenz zu TestWindow.
Natürlich könnte ich die Referenz von TestWindow an den TestActionListener und dann an TestSubClass als Parameter mitgeben, aber wie macht man so was professionell? Mit Interfaces?
Für ein professionelles und funktionierendes Beispiel wäre ich sehr dankbar.
Viele Grüße
Patrick
Code:
//TestWindow.java
public class TestWindow extends Frame{
private static final long serialVersionUID = 1L;
public TestWindow(){
FlowLayout flowLayout=new FlowLayout();
TestActionListener actionListener = new TestActionListener();
setLayout(flowLayout);
Button but1=new Button("MeinButton");
but1.addActionListener(actionListener);
TextArea textarea1 = new TextArea();
add(but1);
add(textarea1);
}
public static void main (String args[]){
TestWindow windowTest = new TestWindow();
windowTest.setVisible(true);
windowTest.setSize(300, 300);
}
}
Code:
//TestActionListener.java
public class TestActionListener implements ActionListener{
@Override
public void actionPerformed(ActionEvent actionEvent) {
if(actionEvent.getActionCommand()=="MeinButton"){
TestSubClass subKlasse = new TestSubClass();
subKlasse.doSomeThing();
}
}
}
Code:
//TestSubClass.java
public class TestSubClass{
public void doSomeThing() {
System.out.println("Das ist die Ausgabe, die ins Textfeld soll");
}
}
Gewöhnlich lösen wir sowas mit dem MVC Konzept. Etwa so:
Code:
/*
* TestWindow.java
* = View
*/
import java.awt.*;
import javax.swing.*;
public class TestWindow extends JFrame {
private static final long serialVersionUID = 1L;
private TestActionListener controller;
private JToolBar toolbar;
private JTextArea textarea1;
public TestWindow() {
super("TestWindow");
}
public void createAndShowGUI() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(300, 300);
setLocationRelativeTo(null);
JButton but1 = new JButton("MeinButton");
but1.addActionListener(controller);
textarea1 = new JTextArea();
toolbar = new JToolBar();
toolbar.add(but1);
add(toolbar, BorderLayout.NORTH);
add(new JScrollPane(textarea1), BorderLayout.CENTER);
setVisible(true);
}
public void setController(TestActionListener controller) {
this.controller = controller;
}
public void updateGui(String str) {
textarea1.append(str + "\n");
}
}
Code:
/*
* TestActionListener.java
* = Controller
*/
import java.awt.event.*;
public class TestActionListener implements ActionListener {
private TestSubClass model;
private TestWindow view;
public TestActionListener(TestSubClass model, TestWindow view) {
this.model = model;
this.view = view;
}
@Override
public void actionPerformed(ActionEvent actionEvent) {
if (actionEvent.getActionCommand().equals("MeinButton")) {
model.doSomeThing();
view.updateGui(model.getText());
}
}
}
Code:
/*
* TestSubClass.java
* = Model
*/
public class TestSubClass {
private String text;
public void doSomeThing() {
text = "Das ist die Ausgabe, die ins Textfeld soll";
}
public String getText() {
return text;
}
}
Code:
import javax.swing.*;
public final class Main {
private TestSubClass model;
private TestWindow view;
private TestActionListener controller;
public Main() {
model = new TestSubClass();
view = new TestWindow();
controller = new TestActionListener(model, view);
view.setController(controller);
}
public static void main(final String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new Main().view.createAndShowGUI();
}
});
}
}
Zusammenfassung:
Wir machen eine Modelklasse für die Daten,
eine Viewklasse für die Guikomponenten,
eine Controllerklasse für die Listener und eine Klasse "Main"
um die drei zu instanzieren. Da diese auch miteinander sprechen
müssen, sorgt "Main" ebenfalls für die nötigen Bekanntschaften,
z.B.: view.setController(controller).
vielen Dank für deine sehr professionelle und ausführliche Antwort, du hast mir sehr geholfen
Was wäre denn, wenn ich das Model in einem eigenen Thread laufen lassen würde?
Wie kann ich dem Thread, welcher die Methode getOutputText() besitzt, in regelmäßigen Abständen eine Ausgabe entlocken?
Code:
if(actionEvent.getActionCommand()=="start"){
xmlProcessor.setLoadedReferenceFile(getLoadedReferenceFile());
xmlProcessor.setLoadedSourceFile(getLoadedSourceFile());
xmlProcessorThread = new Thread(xmlProcessor);
xmlProcessorThread.start();
}
Wir können eine neue Controllerfunktion einbauen
und der Thread ruft diese Funktion auf, sobald er eine Ausgabe wünscht.
In der neuen Funktion können wir das Model und die View anpassen
(ähnlich wie wir es für "MeinButton" gemacht haben).