Slyh: 2 Probleme mit Java-Browser (URL verändern & Layout)

Beitrag lesen

Hallo,

Jetzt zu meinem zweiten Problem:
Wie schon klar geworden ist möchte ich ein JTextfield, in das der Anwender eine Adresse angeben kann. Diese Adresse soll dann per Klick auf den OK-Button angezeigt werden. Doch ich habe starke Probleme das Verändern der URL zu erreichen. Wie muss ich es schreiben, dass es klappt?

Ich gehe jetzt allgemein mal über deinen Code und sage etwas dazu, ohne
auf dein Problem einzugehen. Um den Code genauer zu verstehen, bin ich
jetzt ehrlich gesagt zu müde. Vielleicht kannst du meine Kommentare
soweit schonmal zur Kenntnis nehmen, ggf. den Code anpassen, nochmal
posten und so Hilfe erhalten.

Hier der Quelltext mit Kommentaren:

[code lang=java]
package test;

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

Verwendest du eine IDE? Das solltest du ggf. langsam mal. Die kann dir
bei vielen Dingen schon weiterhelfen. Wie man von Hand kompiliert, hast
du vermutlich jetzt ja gelernt.

class Test{
    String neueSeite;
}

Was macht das da?

class Adresse{
    static void SetzeURL(Test nS){

Du solltest Methodennamen auf jeden Fall mit kleinem Anfangsbuchstaben
schreiben. Das ist eine Konvention in Java. Wenn ich auf Code stoße,
der großgeschrieben ist, denke ich sofort an eine Klasse und bin
verwirrt, wenn es doch keine ist. Den meisten anderen Entwicklern
wird das auch so gehen.

"nS" ist außerdem kein wirklich sprechender Name...

Wieso hat "nS" nicht gleich den Typ "String"? Ich nehme stark an, daß
du eine URL übergibst?! Du brauchst dafür keine eigene Klasse "Test"
bauen. Verwende als Datentyp einfach String.

nS.neueSeite = adresse.getText();
        //Hier meckert Java, weil es adresse nicht kennt. Ich weiß aber nicht, wie ich es schreiben muss, damit Java weiß was ich damit mein?!

Wo kommt "adresse" her? Das sieht aus wie eine Instanzvariable von der
Klasse "Adresse". Ich sehe dort aber keine Instanzvariable die so
heißt. Was willst du hier tun?

}
}

public class JBrowserTextField extends JEditorPane implements HyperlinkListener {
  JBrowserTextField( String url )
  {
    setEditable( false );
    addHyperlinkListener( this );

try
    {
      setPage( new URL(url) );
    }
    catch ( IOException e ) { e.printStackTrace(); }
  }
  public void hyperlinkUpdate( HyperlinkEvent event )
  {
    HyperlinkEvent.EventType typ = event.getEventType();

if ( typ == HyperlinkEvent.EventType.ACTIVATED )
    {
      try
      {
        setPage( event.getURL() );
      }
      catch( IOException e ) {
        JOptionPane.showMessageDialog( this,
                                      "Can't follow link to "
                                        + event.getURL().toExternalForm(),
                                      "Error",
                                      JOptionPane.ERROR_MESSAGE);
      }
    }
  }

Den obenstehenden Code habe ich mir jetzt nicht näher angeschaut.

public static void main(String[] args){
        String startseite = "http://www.selfhtml.org";

JFrame f = new JFrame();
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setLayout(new GridLayout(2,0));

JPanel eingabe = new JPanel();

Der Name "eingabe" ist irgendwie nicht so toll. :)

final JTextField adresse = new JTextField(startseite);
        final JButton ok = new JButton("OK");

eingabe.add(adresse);
        eingabe.add(ok);
        f.add(eingabe);

ActionListener al = new ActionListener(){

Du machst mit "a1" (schlechter Name) gar nichts. Du solltest ihn noch
als ActionListener für den Button setzen...

public void actionPerformed(ActionEvent e){
                Adresse neueURL = new Adresse();
                JBrowserTextField( neueURL );
                //Hier meckert Java wegen dem Fehler weiter oben (siehe erster Kommentar).

Das ist auch kein Wunder, weil das kein gültiger Code ist. (Außer ich
übersehe etwas.) Ich weiß auch nicht genau, was du da machen willst.
Es ist auch nicht "ansatzweise" richtig, nein. :)

Allgemein solltest du dir überlegen, ob das Befüllen des JFrame wirklich
in main() passieren sollte. Möglicherweise wäre ein Konstruktor oder
eine init()-Methode sinnvoller hierfür geeignet.

Dann solltest du dir ohnehin überlegen, ob es nicht klüger wäre, eine
Applikationsklasse (z.B. "MyBrowser") zu erstellen, die von JFrame
ableitet. So wird das oftmals in Java gelöst.

public class MyBrowser extends JFrame

In main() machst du im Prinzip nur noch folgendes:

MyBrowser myBrowser = new MyBrowser();
  myBrowser.setSize(600, 500);
  myBrowser.setVisible(true);

Das Code, der das Frame mit den Komponenten befüllt, würde sich dann
ab sofort im Konstruktor von MyBrowser befinden.

Die aktuelle Adresse könntest du in einer Instanzvariable(!) "adresse"
von MyBrowser speichern. Somit kannst du aus jeder Methode von MyBrower
auf die aktuelle Adresse zugreifen.

Im Konstruktor würdest du außerdem das ActionPerformed-Handling einrichten.

Entweder indem du das über eine anynome Inner-Klasse löst, so wie das
jetzt ansatzweise in deinem Code vorhanden ist, oder indem du MyBrowser
außerdem noch ActionListener implementieren läßt, so daß deine Klassen-
Deklaration so aussieht:
  public class MyBrowser extends JFrame implements ActionListener

Du mußt dann natürlich die Methode "actionPerformed" implementieren.
Diese könnte dann durch den Aufruf von setPage() auf das JBrowserTextField-
Objekt die Seite wechseln.

Der Code könnte in etwa so aussehen:
  adresse = adressTextfield.getText();
  browserTextField.setPage(adresse);

Die Instanzvariable(!) "browserTextField" wäre also ein Objekt vom Typ
"JBrowserTextField", das du während der Initialisierung im Konstruktor
befüllst.

Aus JBrowserTextField machst du eine eigene Klasse in einer eigenen
.java-Datei.

So, mal sehen, ob du damit was anfangen kannst. Meine Beschreibung
ist möglicherweise ein bißchen durcheinander. Versuch dich mal ein
bißchen damit auseinanderzusetzen. Möglicherweise kommst du dann
schon drauf.

Falls du Fragen hast, weil ich zu wirr geschrieben habe oder falls
du sonst nicht weiterkommst, frag bitte einfach nach.

Ich gebe dir auf jeden Fall als Ratschlag, den Code vollständig von
vorne zu beginnen. Der bestehende Code ist nämlich stellenweise mehr
als falsch -- und zwar nicht nur syntaktisch -- und verwirrt dich in
seinem jetzigen Zustand sicherlich nur.

Insgesamt möchte ich dir noch folgende "Ratschläge" auf den Weg geben:
Du solltest dir klar werden, was eine lokale Variable und was eine
Instanzvariable ist. Das sind Grundlagen der Objektorientierung,
ohne die es nicht geht. Du solltest außerdem wissen, was Klassen sind
und wofür sie gut sind. Und wenn du das weißt, solltest du mit Übungen
anfangen, die einfachere Komponenten als die Browser-Komponente von
Java enthalten. :)

Gruß
Slyh