Objektcasting

Status
Nicht offen für weitere Antworten.

Aphex

Mitglied
Hallo Leute,


Ich habe eine Anwendung (ChatClient), aus der heraus ein modales Fenster geöffnet werden kann.
Die ChatClientForm hat ein Textfeld. (TextArea). Ich möchte jetzt einfach zu Testzwecken in diesem Textfeld was ausgeben. wenn ich im modalen Fenster auf Schliessen klicke. Alles was ich versucht habe, klappt nicht.
Ich weiß, dass ich ein Objektcasting durchführen muss. Und da liegt der Hund begraben.
Was muss ich da genau tun?
Hier mal die wichtigen Code-Schnipsel:

Code:
java.awt.Frame parent;


public Config(java.awt.Frame parent)
    {
        super(parent,true);
		this.parent=parent;
		setTitle("Applikation \""+parent.getClass().getName()+"\"");

	}

 private void cb_1_schliessen_actionPerformed( java.awt.event.ActionEvent event )
    {


		int portNeu;
		java.lang.String hostNameNeu;
		ChatClient cc=new ChatClient();
		//hostNameNeu=textf_1_rH.getText();
		//portNeu=Integer.parseInt(textf_1_rP.getText());

//Hier soll die Ausgabe  im ChatClient erfolgen. Was muss hier passieren?
		parent.texta_1_meldungen.append("Test");
		setVisible(false);
		destroy();

    }

..........

Ich hoffe, ihr könnt mir helfen.

Gruß
Aphex
 
S

SlaterB

Gast
> Ich weiß, dass ich ein Objektcasting durchführen muss.

kannst du das näher erläutern? klingt nicht so ganz richtig,

eher: du brauchst eine Referenz auf die Textarea, wer erzeugt die wann wo?
am besten wäre es, wenn du eine SubKlasse von Frame hast,
darin die TextArea als Exemplarvariable gespeichert
und der Aufruf dann

parent.writeInYourTextArea(String);
und um den Rest muss sich Parent = deine Frame-Klasse kümmern
 

Aphex

Mitglied
Hallo SlaterB,

danke für die Antwort.

Das mit dem ObjektCasting hat der Fernlehrer angedeutet.
Die Textarea wird von der ClientForm erzeugt, aus der heraus das Dialogfenster geöffnet wird.


Code:
class ChatClient extends java.awt.Frame implements java.awt.event.WindowListener, powersoft.powerj.event.SocketConnectListener, powersoft.powerj.event.SocketDataArrivalListener, powersoft.powerj.event.SocketErrorListener, java.awt.event.ActionListener
{
    public java.awt.Rectangle DURectangle( int x, int y, int w, int h )
    {
        String        alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
        java.awt.FontMetrics   fm = getFontMetrics( getFont() );
        double        fw = ( fm != null ) ? ( fm.stringWidth( alphabet ) / alphabet.length() ) : 0;
        double        fh = ( fm != null ) ? ( fm.getHeight() / 2.0 ) : 0.0;

        return new java.awt.Rectangle( (int) Math.round( ( (double)fw * (double)x ) / 4.0 ),
                              (int) Math.round( ( (double)fh * (double)y ) / 4.0 ),
                              (int) Math.round( ( (double)fw * (double)w ) / 4.0 ),
                              (int) Math.round( ( (double)fh * (double)h ) / 4.0 ) );
    }

    public void DUPositionComponent( java.awt.Component comp, int x, int y, int w, int h, java.awt.Insets formInsets )
    {
        java.awt.Rectangle     rect = DURectangle( x, y, w, h );
        if( (comp != this) && (formInsets != null) ) {
            rect.x += formInsets.left;
            rect.y += formInsets.top;
        }
        if( (comp == this) && (formInsets != null) && (formInsets.bottom > 0) ) {
            rect.height += formInsets.bottom;
        }
        comp.setBounds( rect );
    }

    public void setMainForm( boolean isMainForm )
    {
        __mainForm = isMainForm;
    }
    public boolean isMainForm()
    {
        return __mainForm;
    }
    private boolean createTheForm() throws java.lang.Exception
    {
        setTitle("Client");
        java.awt.Container contentPane = getContentPane();
        java.awt.Font defaultFont = new java.awt.Font( "Dialog", java.awt.Font.PLAIN, 12 );
        setFont( defaultFont );

        boolean retval = true;
        addNotify();

        menu_1_optio.setLabel("Optionen");
        menu_1.add( menu_1_optio );
        menu_1_config.setLabel("Konfigurieren");
        menu_1_optio.add( menu_1_config );
        menu_1_optio.addSeparator();
        menu_1_close.setLabel("Schließen");
        menu_1_optio.add( menu_1_close );
        setMenuBar( menu_1 );
        java.awt.Insets formInsets = (java.awt.Insets)(contentPane.getInsets().clone());
        contentPane.setBackground( java.awt.Color.lightGray );
        contentPane.setForeground( java.awt.Color.black );
        powersoft.powerj.ui.ResizePercentLayout layout = new powersoft.powerj.ui.ResizePercentLayout();
        contentPane.setLayout( layout );
        contentPane.add( (java.awt.Component)cb_1_verbinden );
        contentPane.add( (java.awt.Component)texta_1_meldungen );
        contentPane.add( (java.awt.Component)cb_1_schliessen );
        contentPane.add( (java.awt.Component)label_1_meldungen );
        contentPane.add( (java.awt.Component)textf_1_eingaben );
        contentPane.add( (java.awt.Component)cb_1_senden );
        DUPositionComponent( (java.awt.Component) this, 207, 239, 415, 270, formInsets );
        addWindowListener((java.awt.event.WindowListener)this);

        try {
            socket_1.addSocketConnectListener((powersoft.powerj.event.SocketConnectListener)this);
            socket_1.addSocketDataArrivalListener((powersoft.powerj.event.SocketDataArrivalListener)this);
            socket_1.addSocketErrorListener((powersoft.powerj.event.SocketErrorListener)this);
            socket_1.create( powersoft.powerj.net.Socket.SockSTREAM );
            socket_1.setAsynchronous( false );
        }
        catch( java.lang.Exception e_socket_1 ) {
            e_socket_1.printStackTrace();
        }

        try {
            menu_1_config.addActionListener((java.awt.event.ActionListener)this);
            menu_1_close.addActionListener((java.awt.event.ActionListener)this);

        }
        catch( java.lang.Exception e_menu_1 ) {
            e_menu_1.printStackTrace();
        }

        try {
            cb_1_verbinden.addActionListener((java.awt.event.ActionListener)this);
            DUPositionComponent( (java.awt.Component)cb_1_verbinden, 16, 202, 85, 19, formInsets );
            cb_1_verbinden.setLabel( "Verbinden" );
            cb_1_verbinden.setFont( new java.awt.Font( "Dialog", java.awt.Font.BOLD, 12 ) );
            cb_1_verbinden.setBackground( java.awt.Color.lightGray );
            cb_1_verbinden.setForeground( java.awt.Color.black );
            cb_1_verbinden.setEnabled(true);
            cb_1_verbinden.setVisible(true);

        }
        catch( java.lang.Exception e_cb_1_verbinden ) {
            e_cb_1_verbinden.printStackTrace();
        }
        try {
            DUPositionComponent( (java.awt.Component)texta_1_meldungen, 16, 19, 341, 139, formInsets );
            texta_1_meldungen.setFont( defaultFont );
            texta_1_meldungen.setBackground( java.awt.Color.white );
            texta_1_meldungen.setForeground( java.awt.Color.black );
            texta_1_meldungen.setEnabled(true);
            texta_1_meldungen.setVisible(true);

        }
        catch( java.lang.Exception e_texta_1_meldungen ) {
            e_texta_1_meldungen.printStackTrace();
        }


        try {
            cb_1_schliessen.addActionListener((java.awt.event.ActionListener)this);
            DUPositionComponent( (java.awt.Component)cb_1_schliessen, 283, 202, 74, 19, formInsets );
            cb_1_schliessen.setLabel( "Schließen" );
            cb_1_schliessen.setFont( new java.awt.Font( "Dialog", java.awt.Font.BOLD, 12 ) );
            cb_1_schliessen.setBackground( java.awt.Color.lightGray );
            cb_1_schliessen.setForeground( java.awt.Color.black );
            cb_1_schliessen.setEnabled(true);
            cb_1_schliessen.setVisible(true);

        }
        catch( java.lang.Exception e_cb_1_schliessen ) {
            e_cb_1_schliessen.printStackTrace();
        }

        try {
            DUPositionComponent( (java.awt.Component)label_1_meldungen, 16, 5, 123, 10, formInsets );
            label_1_meldungen.setText( "Client-und Server-Meldungen:" );
            label_1_meldungen.setAlignment(java.awt.Label.LEFT);
            label_1_meldungen.setFont( new java.awt.Font( "Dialog", java.awt.Font.BOLD, 12 ) );
            label_1_meldungen.setBackground( java.awt.Color.lightGray );
            label_1_meldungen.setForeground( java.awt.Color.black );
            label_1_meldungen.setEnabled(true);
            label_1_meldungen.setVisible(true);

        }
        catch( java.lang.Exception e_label_1_meldungen ) {
            e_label_1_meldungen.printStackTrace();
        }

        try {
            DUPositionComponent( (java.awt.Component)textf_1_eingaben, 16, 168, 341, 14, formInsets );
            textf_1_eingaben.setFont( defaultFont );
            textf_1_eingaben.setBackground( java.awt.Color.white );
            textf_1_eingaben.setForeground( java.awt.Color.black );
            textf_1_eingaben.setEnabled(true);
            textf_1_eingaben.setVisible(true);

        }
        catch( java.lang.Exception e_textf_1_eingaben ) {
            e_textf_1_eingaben.printStackTrace();
        }

        try {
            cb_1_senden.addActionListener((java.awt.event.ActionListener)this);
            DUPositionComponent( (java.awt.Component)cb_1_senden, 117, 202, 85, 19, formInsets );
            cb_1_senden.setLabel( "Senden" );
            cb_1_senden.setFont( new java.awt.Font( "Dialog", java.awt.Font.BOLD, 12 ) );
            cb_1_senden.setBackground( new java.awt.Color( 137, 31, 31 ) );
            cb_1_senden.setForeground( java.awt.Color.black );
            cb_1_senden.setEnabled(true);
            cb_1_senden.setVisible(true);

        }
        catch( java.lang.Exception e_cb_1_senden ) {
            e_cb_1_senden.printStackTrace();
        }

        layout.setResizePercent(cb_1_verbinden,new java.awt.Rectangle(0,0,0,0));
        layout.setResizePercent(texta_1_meldungen,new java.awt.Rectangle(0,0,0,0));
        layout.setResizePercent(cb_1_schliessen,new java.awt.Rectangle(0,0,0,0));
        layout.setResizePercent(label_1_meldungen,new java.awt.Rectangle(0,0,0,0));
        layout.setResizePercent(textf_1_eingaben,new java.awt.Rectangle(0,0,0,0));
        layout.setResizePercent(cb_1_senden,new java.awt.Rectangle(0,0,0,0));
        socket_1.setRemoteHostName( "localhost" );
        socket_1.setRemotePort( 1777 );

        setResizable(true);

        return retval;
    }

    public boolean create() throws java.lang.Exception
    {
        boolean retval = true;
        retval = retval && createTheForm();
        ChatClient_objectCreated( new powersoft.powerj.event.EventData( this ) );
        setVisible(true);
        return retval;
    }

    public synchronized boolean destroy()
    {
        if( (java.awt.Container)this instanceof java.awt.Window ) {
            ((java.awt.Window)(java.awt.Container)this).dispose();
        } else {
            removeNotify();
        }
        if( isMainForm() ) {
            System.gc();
            System.runFinalization();
            System.exit(0);
        }
        return true;
    }


    private boolean defaultHandleEvent(java.awt.Event event)
    {
        defaultProcessEvent( new powersoft.powerj.event.AWTEvent( event ) );
        return false;
    }
    private void defaultProcessEvent(java.awt.AWTEvent event)
    {
        super.processEvent(event);
    }

    public void windowClosed( java.awt.event.WindowEvent event )
    {
    }
    public void windowOpened( java.awt.event.WindowEvent event )
    {
    }
    public void windowClosing( java.awt.event.WindowEvent event )
    {
        java.lang.Object eventTarget = event.getSource();
        if( eventTarget == this ) {
            ChatClient_windowClosing( event );
        } else {
            unhandledEvent( "java.awt.event.WindowListener", "windowClosing", event );
        }
    }
    public void windowIconified( java.awt.event.WindowEvent event )
    {
    }
    public void windowActivated( java.awt.event.WindowEvent event )
    {
    }
    public void windowDeiconified( java.awt.event.WindowEvent event )
    {
    }
    public void windowDeactivated( java.awt.event.WindowEvent event )
    {
    }

    public void socketConnect( powersoft.powerj.event.SocketConnectEvent event )
    {
        java.lang.Object eventTarget = event.getSource();
        if( eventTarget == socket_1 ) {
            socket_1_socketConnect( event );
        } else {
            unhandledEvent( "powersoft.powerj.event.SocketConnectListener", "socketConnect", event );
        }
    }

    public void socketDataArrival( powersoft.powerj.event.SocketDataArrivalEvent event )
    {
        java.lang.Object eventTarget = event.getSource();
        if( eventTarget == socket_1 ) {
            socket_1_socketDataArrival( event );
        } else {
            unhandledEvent( "powersoft.powerj.event.SocketDataArrivalListener", "socketDataArrival", event );
        }
    }

    public void socketError( powersoft.powerj.event.SocketErrorEvent event )
    {
        java.lang.Object eventTarget = event.getSource();
        if( eventTarget == socket_1 ) {
            socket_1_socketError( event );
        } else {
            unhandledEvent( "powersoft.powerj.event.SocketErrorListener", "socketError", event );
        }
    }

    public void actionPerformed( java.awt.event.ActionEvent event )
    {
        java.lang.Object eventTarget = event.getSource();
        if( eventTarget == menu_1_config ) {
            menu_1_config_actionPerformed( event );
        } else if( eventTarget == menu_1_close ) {
            menu_1_close_actionPerformed( event );
        } else if( eventTarget == cb_1_verbinden ) {
            cb_1_verbinden_actionPerformed( event );
        } else if( eventTarget == cb_1_schliessen ) {
            cb_1_schliessen_actionPerformed( event );
        } else if( eventTarget == cb_1_senden ) {
            cb_1_senden_actionPerformed( event );
        } else {
            unhandledEvent( "java.awt.event.ActionListener", "actionPerformed", event );
        }
    }

    public ChatClient()
	{

		super();

    }

	public ChatClient(java.lang.String remoteHostName, int remotePort)
	{

		super();

    }

    

    

    public void processEvent(java.awt.AWTEvent event)
    {

        defaultProcessEvent(event);
    }

    private void unhandledEvent( String listenerName, String methodName, java.lang.Object event )
    {

    }

    public java.awt.Container getContentPane()
    {
        //  Use the following if you inherit from a JFC container such as javax.swing.JFrame
        //  return super.getContentPane();
        return this;
    }

    /**
     * method1 Method
     */

    private boolean ChatClient_objectCreated(powersoft.powerj.event.EventData event)
    {
		int                             remotePort;
		java.lang.String                remoteHostName;
        remoteHostName = socket_1.getRemoteHostName();
		remotePort = socket_1.getRemotePort();
		texta_1_meldungen.append( "Client-Einstellungen: Host \""+remoteHostName+ "\" an Port \""
		+remotePort+"\"\n");
		socket_1.setAsynchronous( true );
		return false;

		}

    private boolean ChatClient_windowClosing(java.awt.event.WindowEvent event)
    {

        setVisible(false);
        destroy();
        return false;
    }

    private void socket_1_socketConnect( powersoft.powerj.event.SocketConnectEvent event )
    {
    	 texta_1_meldungen.append( "Socket beim Server angemeldet\n" );

    }

    private void socket_1_socketDataArrival( powersoft.powerj.event.SocketDataArrivalEvent event )
    {
    	String line;
		int result;
		int bytesReceived;
		texta_1_meldungen.append("Daten angekommen\n");
		bytesReceived=event.getBytesReceived();
		byte [] buffer=new byte[bytesReceived];
		result=socket_1.receive(buffer);
		if (result>0) {
			line = new String(buffer);
			texta_1_meldungen.append(line);
		}

    }

    private void socket_1_socketError( powersoft.powerj.event.SocketErrorEvent event )
    {

        java.lang.Object errorEvent;
		texta_1_meldungen.append("Fehler am Socket aufgetreten:\n");
		errorEvent=event.getSource();
		texta_1_meldungen.append(" "+errorEvent.toString()+"\n");
    }

    private void menu_1_config_actionPerformed( java.awt.event.ActionEvent event )
    {
    	modalConfig=new Config(this);
		modalConfig.textf_1_rH.setText(socket_1.getRemoteHostName());
		modalConfig.textf_1_rP.setText(Integer.toString(socket_1.getRemotePort()));
		try {
			modalConfig.create();
			}catch (Exception e) {}
	}

    private void menu_1_close_actionPerformed( java.awt.event.ActionEvent event )
    {

		System.exit(0);    

    }

    private void cb_1_verbinden_actionPerformed( java.awt.event.ActionEvent event )
    {
    	socket_1.connect();    

    }

    private void cb_1_schliessen_actionPerformed( java.awt.event.ActionEvent event )
    {
    	System.out.println(socket_1.getRemoteHostName());
		System.exit(1); 


    }

    private void cb_1_senden_actionPerformed( java.awt.event.ActionEvent event )
    {
    	java.lang.String text;
        java.lang.String result;
        byte[] buffer;

        //Text aus Eingabefeld auslesen und senden
        text = textf_1_eingaben.getText();
        buffer = text.getBytes();
        if(buffer.length >0){
        result = new String(buffer);
        socket_1.send( buffer);     
        texta_1_meldungen.append("Nachricht gesendet: " + result +"\n");
        textf_1_eingaben.setText("");
        textf_1_eingaben.requestFocus();
        }
        else{
            texta_1_meldungen.append("Sie haben keinen Wert zum versenden eingegeben.\n");
            textf_1_eingaben.requestFocus();
        }     

    }
    /****************************************
     * data members
     ****************************************/

    protected boolean __mainForm = false;




    protected powersoft.powerj.net.Socket  socket_1 = new powersoft.powerj.net.Socket();
    protected java.awt.MenuBar  menu_1 = new java.awt.MenuBar();
    protected java.awt.Menu  menu_1_optio = new java.awt.Menu("");
    protected java.awt.MenuItem menu_1_config = new java.awt.MenuItem("");
    protected java.awt.MenuItem menu_1_close = new java.awt.MenuItem("");
    protected java.awt.Button  cb_1_verbinden = new java.awt.Button();
    protected java.awt.TextArea  texta_1_meldungen = new java.awt.TextArea();
    protected java.awt.Button  cb_1_schliessen = new java.awt.Button();
    protected java.awt.Label  label_1_meldungen = new java.awt.Label();
    protected java.awt.TextField  textf_1_eingaben = new java.awt.TextField();
    protected java.awt.Button  cb_1_senden = new java.awt.Button();


    // add your data members here
	private Config modalConfig;
	int remotePort;
	java.lang.String remoteHostName;
}




Code:
eher: du brauchst eine Referenz auf die Textarea, wer erzeugt die wann wo?
am besten wäre es, wenn du eine SubKlasse von Frame hast,
darin die TextArea als Exemplarvariable gespeichert
und der Aufruf dann

parent.writeInYourTextArea(String);
und um den Rest muss sich Parent = deine Frame-Klasse kümmern

Ich verstehe echt nur noch Bahnhof, zumal ich diese Aufgabe mit PowerJ lösen muss. Ich hasse es.

Gruß
Jens
 
S

SlaterB

Gast
sofern du eine Frage stellen willst, wäre es Zeit, dies zu tun
 

Aphex

Mitglied
Oh Sorry,

egal was ich nach wie vor mache, ich bekomme es nicht hin, im Textfeld aus dem dialogfenster durch Drücken des Schliessen-Buttons eine Ausgabe zu machen. Irgendwo habe ich da ein Verständnisproblem.
Wenn ich es mit parent.texta_1_meldungen.append("Test"); versuche bekomme ich die Meldung:

No declaration for name 'texta_1_meldungen'

Versuche ich es folgendermaßen, bekomme ich zwar keine Fehlermeldung, es passiert aber nichts:

....
ChatClient cc=new ChatClient();
cc.texta_1_meldungen.append("Test");
.....

Ich weiß echt nicht weiter.

Gruß
Aphex
 
S

SlaterB

Gast
weil dein Parent ein Frame ist und kein ChatClient,
wenn du irgendwas ChatClient-spezifisches tun möchtest,
dann musst du auch eine ChatClient-Variable haben, keine x-beliebiges Frame

also mit solchen elementaren Programmier-Nichtkenntnissen rate ich davon ab, komplizierte GUI-Programme mit Dialogen usw. zu basteln


eine Frage, wie du einen ChatClient statt eines Frames speichert, ginge ja inhaltlich noch, obwohl es handwerklich eigentlich einfach ist,
aber den Unterschied zwischen Frame und ChatClient erst nicht zu erkennen ist bedenklicher
 

Aphex

Mitglied
Hallo,

den Unterschied zwischen ChatClient und Frame habe ich schon erkannt, allerdings wußte ich nicht, wie ich die Sache anpacke. Du hast mir da einen wichtigen Hinweis gegeben.
Das ich elementare Programmier-Kenntnisse nicht habe, ist mir bewusst. Ich habe mir diese Programmieraufgabe auch nicht ausgesucht, sie ist Teil meines Lehrgangs. Vielleicht sollte ich den alten Stoff mal ein wenig auffrischen, da ich eine längere Pause einlegen musste.
Ich werde aber nicht aufgeben und eine Lösung finden.
Wenn ich sie habe, poste ich es.


Gruß
Aphex
 

Aphex

Mitglied
Hallo SlaterB,

ich habe es tatsächlich geschafft. Vielleicht nicht sehr elegant, aber es funktioniert.

Hier mal Auszüge aus dem Code:

Code:
..............

//Diese Methode wird in der Klasse Config(modaler Dialog) ausgeführt und setzt neue Werte für den
//ChatClient.
private void cb_1_schliessen_actionPerformed( java.awt.event.ActionEvent event )
    {
		//Textfeldeintrag wird an Variable übergeben
        hostNameNeu=textf_1_rH.getText();
        //Textfeldeintrag wird an Variable übergeben
		portNeu=Integer.parseInt(textf_1_rP.getText());
        setVisible(false);
		destroy();

    }
	//Getter-Methode für den neuen HostName
	public String getHostNameNeu() {
		return hostNameNeu;
	}
	//Getter-Methode für den neuen Port
	public int getPortNeu() {
		return portNeu;
	}
..................

Code:
....................
//Der Konstruktor der Klasse ChatClient
public ChatClient(Config conf) {
		this.conf=conf;
	}
.....................


Code:
.....................
//Verbindung wird mit neuen Werten gestartet, die im modalen Dialog gesetzt wurden.
//Diese Methode wird in der Klasse ChatClient ausgeführt.
    private void cb_1_verbinden_actionPerformed( java.awt.event.ActionEvent event )
    {

		remoteHostName=conf.getHostNameNeu();
		remotePort=conf.getPortNeu();
		//Dient der Test-Ausgabe
		System.out.println(remoteHostName+ " "+remotePort);
		socket_1.connect();
    }
.......................................

Gruß
Aphex
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Oben