# TextArea aus einer anderen Classe füllen.



## Morpheling (23. Februar 2008)

Hi Forum, habe eine typische Anfängerfrage.

Ich habe vor (aus Lernzwecken) einen kleinen Client zu Client Chat ohne einen Server dazwischen zu bauen und bin jezt an ein Problemm gestossen mit dem ich sein gestern Abend kämpfe, Google hat mich auch nicht weitergebracht deswegen wende ich mich jezt an euch.

Ich habe eine "ServerClasse" die Ständig auf anfragen von anderem Client / Server wartet. Das funktioniert wunderbar nur das was der Server kriegt gebe ich in der Kommandozeile aus.
Jezt möchte ich diese ausgabe in der schon vorhandenen TextArea die in einer anderen Classe ist ausgeben. Ich kann aber in der ServerClasse nicht auf die TextAtea aus der WindowsApplication Classe zugreifen.

Frage ist: Wie löse ich das Problemm ?

Danke im vorraus für die Antworten.



---Pavel


----------



## TheJadix (23. Februar 2008)

Hallo,

Moglichkeit 1 : Einfach eine Referenz auf die TextArea an deine WindowsApplication   
  übergeben, diese dort für spätere Verwendung in einem Instanzfeld zwischenspeichern.

Möglichkeit 2 : Methoden implementieren die den anzuzeigenden Text von der
  WindowsApplication bis zum append auf die TextArea durchreichen.

Wenn du sagst wie und aus welchen Klassen deine Anwendung aufgebaut ist, kann
man genauer sagen wie !

Gruß JAdix


----------



## Morpheling (23. Februar 2008)

Also ich habe 3 classen:

Classe1:

```
package desktopapplication3;

import org.jdesktop.application.Application;
import org.jdesktop.application.SingleFrameApplication;
import java.io.*;

public class DesktopApplication3 extends SingleFrameApplication {

    @Override protected void startup() {
        show(new DesktopApplication3View(this));
    }

    @Override protected void configureWindow(java.awt.Window root) {
    }

    public static DesktopApplication3 getApplication() {
        return Application.getInstance(DesktopApplication3.class);
    }
    public static void main(String[] args) throws IOException
    {
        launch(DesktopApplication3.class, args);
        Server server = new Server( 6666 );
        server.startServing();
    }
}
```

Dann die WindowApplication (Der Code wurde Maschinel durch NetBeans erzeugt):

```
package desktopapplication3;

import java.io.*;
import org.jdesktop.application.Action;
import org.jdesktop.application.ResourceMap;
import org.jdesktop.application.SingleFrameApplication;
import org.jdesktop.application.FrameView;
import org.jdesktop.application.TaskMonitor;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.Timer;
import javax.swing.Icon;
import javax.swing.JDialog;
import java.net.*;

class DesktopApplication3View extends FrameView {
    public String KeyBefore = "";
    //public java.awt.TextArea Ausgabe;
 
    public DesktopApplication3View(SingleFrameApplication app) {
        super(app);
        
        initComponents();

        // status bar initialization - message timeout, idle icon and busy animation, etc
        ResourceMap resourceMap = getResourceMap();
        int messageTimeout = resourceMap.getInteger("StatusBar.messageTimeout");
        messageTimer = new Timer(messageTimeout, new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                statusMessageLabel.setText("");
            }
        });
        messageTimer.setRepeats(false);
        int busyAnimationRate = resourceMap.getInteger("StatusBar.busyAnimationRate");
        for (int i = 0; i < busyIcons.length; i++) {
            busyIcons[i] = resourceMap.getIcon("StatusBar.busyIcons[" + i + "]");
        }
        busyIconTimer = new Timer(busyAnimationRate, new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                busyIconIndex = (busyIconIndex + 1) % busyIcons.length;
                statusAnimationLabel.setIcon(busyIcons[busyIconIndex]);
            }
        });
        idleIcon = resourceMap.getIcon("StatusBar.idleIcon");
        statusAnimationLabel.setIcon(idleIcon);
        progressBar.setVisible(false);

        // connecting action tasks to status bar via TaskMonitor
        TaskMonitor taskMonitor = new TaskMonitor(getApplication().getContext());
        taskMonitor.addPropertyChangeListener(new java.beans.PropertyChangeListener() {
            public void propertyChange(java.beans.PropertyChangeEvent evt) {
                String propertyName = evt.getPropertyName();
                if ("started".equals(propertyName)) {
                    if (!busyIconTimer.isRunning()) {
                        statusAnimationLabel.setIcon(busyIcons[0]);
                        busyIconIndex = 0;
                        busyIconTimer.start();
                    }
                    progressBar.setVisible(true);
                    progressBar.setIndeterminate(true);
                } else if ("done".equals(propertyName)) {
                    busyIconTimer.stop();
                    statusAnimationLabel.setIcon(idleIcon);
                    progressBar.setVisible(false);
                    progressBar.setValue(0);
                } else if ("message".equals(propertyName)) {
                    String text = (String)(evt.getNewValue());
                    statusMessageLabel.setText((text == null) ? "" : text);
                    messageTimer.restart();
                } else if ("progress".equals(propertyName)) {
                    int value = (Integer)(evt.getNewValue());
                    progressBar.setVisible(true);
                    progressBar.setIndeterminate(false);
                    progressBar.setValue(value);
                }
            }
        });
    }

public void initComponents() {

        mainPanel = new javax.swing.JPanel();
        Eingabe = new java.awt.TextArea();
        Ausgabe = new java.awt.TextArea();
        menuBar = new javax.swing.JMenuBar();
        statusPanel = new javax.swing.JPanel();
        javax.swing.JSeparator statusPanelSeparator = new javax.swing.JSeparator();
        statusMessageLabel = new javax.swing.JLabel();
        statusAnimationLabel = new javax.swing.JLabel();
        progressBar = new javax.swing.JProgressBar();

        mainPanel.setName("mainPanel"); // NOI18N

        Eingabe.setName("Eingabe"); // NOI18N
        Eingabe.addKeyListener(new java.awt.event.KeyAdapter() {
            public void keyPressed(java.awt.event.KeyEvent evt) {
                Eingabe_KeyPress(evt);
            }
        });

        org.jdesktop.application.ResourceMap resourceMap = org.jdesktop.application.Application.getInstance(desktopapplication3.DesktopApplication3.class).getContext().getResourceMap(DesktopApplication3View.class);
        Ausgabe.setBackground(resourceMap.getColor("Ausgabe.background")); // NOI18N
        Ausgabe.setEditable(false);
        Ausgabe.setName("Ausgabe"); // NOI18N
        Ausgabe.setText(resourceMap.getString("Ausgabe.text")); // NOI18N
        Ausgabe.addTextListener(new java.awt.event.TextListener() {
            public void textValueChanged(java.awt.event.TextEvent evt) {
                Ausgabe_TextChanged(evt);
            }
        });

        javax.swing.GroupLayout mainPanelLayout = new javax.swing.GroupLayout(mainPanel);
        mainPanel.setLayout(mainPanelLayout);
        mainPanelLayout.setHorizontalGroup(
            mainPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(Eingabe, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, 525, Short.MAX_VALUE)
            .addComponent(Ausgabe, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, 525, Short.MAX_VALUE)
        );
        mainPanelLayout.setVerticalGroup(
            mainPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, mainPanelLayout.createSequentialGroup()
                .addComponent(Ausgabe, javax.swing.GroupLayout.DEFAULT_SIZE, 199, Short.MAX_VALUE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(Eingabe, javax.swing.GroupLayout.PREFERRED_SIZE, 51, javax.swing.GroupLayout.PREFERRED_SIZE))
        );

        menuBar.setName("menuBar"); // NOI18N

        statusPanel.setName("statusPanel"); // NOI18N

        statusPanelSeparator.setName("statusPanelSeparator"); // NOI18N

        statusMessageLabel.setName("statusMessageLabel"); // NOI18N

        statusAnimationLabel.setHorizontalAlignment(javax.swing.SwingConstants.LEFT);
        statusAnimationLabel.setName("statusAnimationLabel"); // NOI18N

        progressBar.setName("progressBar"); // NOI18N

        javax.swing.GroupLayout statusPanelLayout = new javax.swing.GroupLayout(statusPanel);
        statusPanel.setLayout(statusPanelLayout);
        statusPanelLayout.setHorizontalGroup(
            statusPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(statusPanelSeparator, javax.swing.GroupLayout.DEFAULT_SIZE, 525, Short.MAX_VALUE)
            .addGroup(statusPanelLayout.createSequentialGroup()
                .addContainerGap()
                .addComponent(statusMessageLabel)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 355, Short.MAX_VALUE)
                .addComponent(progressBar, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(statusAnimationLabel)
                .addContainerGap())
        );
        statusPanelLayout.setVerticalGroup(
            statusPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(statusPanelLayout.createSequentialGroup()
                .addComponent(statusPanelSeparator, javax.swing.GroupLayout.PREFERRED_SIZE, 2, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .addGroup(statusPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(statusMessageLabel)
                    .addComponent(statusAnimationLabel)
                    .addComponent(progressBar, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addGap(3, 3, 3))
        );

        setComponent(mainPanel);
        setMenuBar(menuBar);
        setStatusBar(statusPanel);
    }

    // Variables declaration - do not modify                     
    public java.awt.TextArea Ausgabe;
    public java.awt.TextArea Eingabe;
    public javax.swing.JPanel mainPanel;
    public javax.swing.JMenuBar menuBar;
    public javax.swing.JProgressBar progressBar;
    public javax.swing.JLabel statusAnimationLabel;
    public javax.swing.JLabel statusMessageLabel;
    public javax.swing.JPanel statusPanel;
    // End of variables declaration                   

    public final Timer messageTimer;
    public final Timer busyIconTimer;
    public final Icon idleIcon;
    public final Icon[] busyIcons = new Icon[15];
    public int busyIconIndex = 0;

    public JDialog aboutBox;
}
```

Meine Server Classe Kann zur zeit nur Integer empfangen und versenden:

```
package desktopapplication3;

import java.net.*;
import java.io.*;

public class Server
{
  public final ServerSocket server;
  public Server( int port ) throws IOException
  {
    server = new ServerSocket( port );
  }
  public void startServing()
  {
    while ( true )
    {
      Socket client = null;
      try
      {
        client = server.accept();
        handleConnection ( client );
      }
      catch ( IOException e ) {
        e.printStackTrace();
      }
      finally {
        if ( client != null )
          try { client.close(); } catch ( IOException e ) { e.printStackTrace(); }
      }
    }
  }
  public void handleConnection( Socket client ) throws IOException
  {
    InputStream  in  = client.getInputStream();
    OutputStream out = client.getOutputStream();
    int factor1 = in.read();
    int factor2 = in.read();
    out.write( factor1 * factor2 );
    System.out.println( factor1 +" * "+ factor2 );
  }
}
```
So, und nun müsste ich das was in der Server Classe "System.out.println( factor1 +" * "+ factor2 );" so ausgegeben wird in die TextArea so reinschreiben : Ausgabe.setText(Ausgabe.getText() + "\r\n" + factor1 +" * "+ factor2 );
Aber wie gesagt so kann ich das in der Server.Classe nicht verwenden.

Viedermal Danke im Vorraus.


---Pavel


----------



## TheJadix (23. Februar 2008)

Hallo,

hättest du Möglichkeit in Klasse 1 an die instanz der DesktopApplication3View zu kommen ?

Wenn ja ist Ausgabe als public deklariert und du könntest deinen Server-Konstruktor um einen Parameter "TextArea"
erweitern um die Referenz zur späteren Verwendung zwischenzuspeichern !

Wenn du die startup-Methode mit einbeziehen könntest in etwa so :

```
protected void startup() {

        DesktopApplication3View dapview = new DesktopApplication3View(this);
        show(dapview);

        ausgabe = dapview.Ausgabe;  // ausgabe zuvor als Instanzfeld anlegen !
    }

 . . . .

  public static void main(String[] args) throws IOException    {

        launch(DesktopApplication3.class, args);
        Server server = new Server( 6666, ausgabe );
        server.startServing();
    }
```

könnte das evtl. klappen.

Gruß JAdix


----------

