# Klassenübergreifende Ermittlung eines Strings aus einem Textfeld



## Turmfalke (14. Apr 2009)

Hallo 
ich hab schon seit einigen Tagen mit dem Problem zu kämpfen, dass ich den String aus den Textfeldern einer anderen Klasse nicht auslesen kann bzw. ich weiss nicht, wie ich die Klasse Farbenbereich in den Steuerbereich "integriere"...
Meine erste Klasse heisst: Steuerbereich, die zweite Farbenbereich.
Mittels Button aus dem Steuerbereich möchte ich aus dem Textfeld des Farbenbereichs den String auslesen und weiterverarbeiten. Ich hab schon jede Menge gegoogelt. Bisher hab ich aber leider noch nichts gefunden, was mir weiterhelfen könnte.

Ich möchte nur einen Stubser in die richtige Richtung - nichts weiter 
Ziel des Programms ist es ein Kreis zu zeichnen.
Ich will im Prinzip mittels dieses Strings den Kreis in Bereiche teilen (aber das nur am Rande  ).

So meine Frage:
Wie kann ich im Steuerbereich den Farbenbereich "einfügen", um mittels getText() den String zu bekommen? Hab auf einer anderen Seite was mittels "extends Erbklasse" gelesen, aber da steht ja schon Panel^^

also zu den Quelltexten:

*Steuerbereich:*


```
import java.awt.*;
import java.awt.event.*;

public class Steuerbereich[B] extends Panel[/B] {

  /*Attribute*/

  /**
     * 
     */
  private static final long serialVersionUID = 1L;
  Label         lXMitte, lYMitte, lRadius;
  TextField     tXMitte, tYMitte, tRadius;
  Button        Bu_Ueb;

  [B]private String FB_Ed_Bereiche = new String("");[/B]
  private Kreis    KrS = new Kreis (200,200,100);
  private Component repaintComponent;
  
  /*Methoden*/

  public Steuerbereich (Kreis newKrS, Component comp_ZB) 
  {
    KrS = newKrS;
    repaintComponent = comp_ZB;
    
    setLayout(new FlowLayout());
    setBackground(Color.gray);
    lXMitte = new Label ("X: ")              ; add(lXMitte);
    tXMitte = new TextField ("200",4)        ; add(tXMitte);
    lYMitte = new Label ("Y: ")              ; add(lYMitte);
    tYMitte = new TextField ("200",4)        ; add(tYMitte);
    lRadius = new Label ("Radius: ")         ; add(lRadius);
    tRadius = new TextField ("100",4)        ; add(tRadius);
    Bu_Ueb  = new Button ("Übernehmen")     ; add(Bu_Ueb);
    
    Bu_Ueb.addMouseListener(new MouseAdapter()
    {
        public void mouseClicked(MouseEvent e)
        {
            Bu_UebAction();
        }
    });    
 }    

  [B]public void Bu_UebAction () 
  { [/B][I]//Ermittlung der Strings:
     //Initialisierung des Farbenbereichs in der Klasse. Notwendig? und wie?[/I][B]  
    FB_Ed_Bereiche = Farbenbereich().getEd_Bereiche();  //!!!! - ????
    [/B][I]//Prüfen des Textinhalts, damit keine leeren Strings übergeben werden.[/I]if ((tXMitte.getText()!="") && (tYMitte.getText()!=""))
    {
     KrS.versetze(Integer.parseInt(tXMitte.getText()),Integer.parseInt(tYMitte.getText()));
    }
    if (tRadius.getText()!="")
    {
     KrS.setzeRadius(Integer.parseInt(tRadius.getText()));
    }
    //Ist was ins Textfeld geschrieben?
    if (FB_Ed_Bereiche!="")
    {
     KrS.setzeWinkel(Integer.parseInt(FB_Ed_Bereiche)/2, Integer.parseInt(FB_Ed_Bereiche));
    }
    else {System.out.println("Textfeld leer");}
    repaintComponent.repaint();
  }    
  
}
```

und nun der 
*Farbenbereich:*


```
import java.awt.*;
import java.awt.event.*;


public class Farbenbereich [B]extends Panel[/B]
{
    /**
     * 
     */
    private static final long serialVersionUID = 1L;
    /*Attribute*/
    Label        La_Ueberschrift, La_Bereiche, La_FarbeRand;
    [B]TextField    Ed_Bereiche;[/B]
    TextField   Ed_FarbeRand;
    Component    c;
    Button        Bu_Close;
    

    /*Methoden*/
    public Farbenbereich()
    {
        GridBagConstraints constraints = new GridBagConstraints();
        setLayout(new GridBagLayout()); 
        setBackground(Color.GRAY);
        La_Ueberschrift = new Label("Farbenkonfiguration:")          ;
        La_Bereiche     = new Label("Farbeinteilung des Kreises:");
        La_FarbeRand    = new Label("Farbe des Kreisrandes:")      ;
        Ed_Bereiche        = new TextField("",3)                       ;
        Ed_FarbeRand    = new TextField("",3)                      ;
        Bu_Close        = new Button("Schließen")                  ;
        
        constraints.fill       = GridBagConstraints.HORIZONTAL;
        constraints.anchor       = GridBagConstraints.PAGE_START;
        
        constraints.gridwidth  = GridBagConstraints.REMAINDER;
        constraints.insets     = new Insets(0,0,0,0);
        constraints.gridheight = 3;
        La_Ueberschrift.setFont(new Font("Helvetica", Font.BOLD, 16 ));
        add(La_Ueberschrift, constraints);
        
        constraints.gridwidth  = GridBagConstraints.REMAINDER;
        constraints.gridheight = 1;
        add(La_Bereiche, constraints);
        
        constraints.gridwidth  = GridBagConstraints.REMAINDER;
        add(Ed_Bereiche, constraints);
        
        constraints.gridwidth  = GridBagConstraints.REMAINDER;
        add(La_FarbeRand, constraints);
        
        constraints.gridwidth  = GridBagConstraints.REMAINDER;
        add(Ed_FarbeRand, constraints);
        
        add(Bu_Close);
        Bu_Close.addMouseListener(new MouseAdapter()
        {
            public void mouseClicked(MouseEvent e)
            {
                Bu_CloseAction();
            }
        
        }); 
    }
   [B] public String getEd_Bereiche()
    {
        return Ed_Bereiche.getText();
    }
    public String getEd_FarbeRand()
    {
        return Ed_FarbeRand.getText();
    }[/B]
    public void Bu_CloseAction()
    {
        System.exit(0);
    }
}
```

Wäre über jede Hilfe wirklich dankbar, denn langsam wirds wirklich frustrierend ;(
lg. Turmfalke


----------



## Marco13 (14. Apr 2009)

Wenn ich das richtig verstanden habe, braucht "Steuerbereich" einfach nur eine Referenz auf das Farbenbereich-Objekt... Das könnte im Konstruktor übergeben werden. Auf diesem Farbenbereich kann dann getEd_Bereiche aufgerufen werden.

LESEN !!!! : http://java.sun.com/docs/codeconv/html/CodeConventions.doc8.html


----------



## Turmfalke (14. Apr 2009)

Vielen Dank erstmal für deinen Beitrag 
Mit der Tabelle wusst ich leider nicht wirklich was anzufangen. Hab dann auf die nächste Seite geklickt und das gefunden:
" 
10.2 Referring to Class Variables and Methods

Avoid using an object to access a class (static) variable or method. Use a class name instead. For example:

    classMethod();             //OK
    AClass.classMethod();      //OK
    anObject.classMethod();    //AVOID!
"
...wäre das in meinem Falle nur: (im Steuerbereich) FB_Ed_Bereiche = Farbenbereich.getEd_Bereiche()
?
Das hatte ich aber schon, nur da mäckert Eclipse, dass das Textfeld des Farbenbereiches nicht "static" sei.
Habs so nun geändert...
Nur eine Verständnisfrage:
Mein Programm öffnet sich mit einem leeren Textfeld, wo der Benutzer etwas hineinschreiben soll. Bleibt bei einem "static Textfeld" der Inhalt nicht immer derselbe und wäre so kontraproduktiv - in diesem Falle leer?


----------



## Marco13 (14. Apr 2009)

Die Tabelle hatte nichts mit deiner eigentlichen Frage zu tun, sondern sollte nur dezent auf etwas hinweisen, was ich jetzt mal etwas weniger dezent sage: Das sind gräßliche (gräßliche gräßliche gräßliche) Variablen- und Methodennamen...

Zum eigentlichen Problem dachte ich grob an sowas

```
public class Steuerbereich extends Panel 
{
 ....
  private Farbenbereich farbenbereich;

  public Steuerbereich (Kreis newKrS, Component comp_ZB, Farbenbereich farbenbereich) 
  {
    this.farbenbereich = farbenbereich;
    ....
  }

....

  public void Bu_UebAction () 
  { 
     //Ermittlung der Strings:
    FB_Ed_Bereiche = this.farbenbereich.getEd_Bereiche();
    ...
  }
```

D.h. dort, wo du die beiden Dinger erstellst (wo und wie auch immer das passiert) würdest du dann erst ein
Farbenbereich farbenbereich = new Farbenbereich();
erstellen, und das dann dem Steuerbereich im Konstruktor übergeben
Steuerbereich steuerbereich = new Steuerbereich(newKrS, comp_ZB, farbenbereich);

Ggf. könnte man das noch abstrakter und eleganter machen, aber ... so vom Prinzip her...


----------



## Turmfalke (15. Apr 2009)

Ich denke die Namen so zu wählen, ist geschmackssache. Außerdem beziehen sie sich auf mein BorderLayout, den ich in die Bereiche unterteilt habe.
Wie wählst du denn die Namen deiner Variablen?
Zu meiner Verteidigung muss ich sagen, dass ich mir mit Bu_ (Button) , Ed_ (Editfeld) immer eine gute Übersicht verschaffen konnte.
Auf jeden Fall vielen Dank für deine Hilfe  .
lg. Turmfalke


----------



## maki (15. Apr 2009)

Es gibt Konventionen.
Auf jedenfall haben alle Bezeichner, egal ob Variablen- oder Methodennamen auf Englisch zu sein, das hier ist ja schlimmstes Denglisch 

Dann haben Klassennamen immer mit einem Großbuchstaben zu beginnen, Methodennamen mit einem Kleinbuchstaben.
Schliesslich gibt es noch die sog. KamelHöckerNotation, sollte auch unbedingt eingehalten werden, ausser für Konstanten. Letztere sind auch die einzigen, die Unterstriche enthalten dürfen, da sie immer komplett großgeschrieben werden.

Die sog. "Hungarian Notation" stammt von M$ und ist deswegen grundsätzlich bäääh


----------



## tfa (15. Apr 2009)

Vielleicht noch ein paar Tipps zum Code:



> if (tRadius.getText()!="")


sollte man nicht machen. Stringvergleiche immer mit equals() bzw. !equals().



> new String("");


das kann  immer ersetzt werden durch "". Dieser Stringkonstruktor ist Blödsinn und sollte nicht verwendet werden.



> Die sog. "Hungarian Notation" stammt von M$ und ist deswegen grundsätzlich bäääh


Nicht nur deswegen...


----------



## Marco13 (15. Apr 2009)

Deswegen der Link: Es ist nicht wirklich Geschmacksache. Dass die Namen auf Deutsch sind ist IMHO schon nicht so schön. Dass man camelCase schreiben sollte, und keine Unterstriche verwenden, steht im Link. Den Klassennamen "Editfeld" gibt es schonmal nicht. Und wenn jemand anderes der Code liest (auch wenn es nur jemand ist, der versucht, in einem Forum zu helfen), wird er es SEHR schwer haben, rauszufinden, wofür "FB_Ed_Bereiche" denn genau steht (am Namen erkennt man nichtmal, dass das eine Variable ist!), und dass "KrS" ein Kreis sein soll. Das ist (schon wegen der absurden GrOß-kleInSCHreiBung) nicht sofort ersichtlich. 

Das alles hat noch einen weiteren Grund: Menschen haben eine erstaunlich ausgeprägte Fähigkeit zur _Mustererkennung_, und Schrift sind Muster. Eine Zeile wie
FB_Pnl.getEd_BeR().add(btn_KrS);
sieht nicht nur scheiße aus, sie läßt sich auch VIEL schwerer erfassen als eine Zeile wie
colorPanel.getEditArea().add(circleButton);
Bei der ersten muss man zeichenweise(!) lesen, dann mit viel Phantasie und Wissen über das gesamte Programm(!) die Abkürzungen "auflösen", und kann dann erst nachvollziehen, was dort gemacht wird. Bei der zweiten Version steht einfach "als Text" da, was gemacht wird - ein Blick, und alles ist klar.

Aber natürlich kann man seine Variablen auch einfach a,b,c,d... nennen, oder alle mit einem $ anfangen lassen, oder sich am reichhaltigen Repertoire der Sonderzeichen bedienen. Variablennamen wie i, í, î, ì, I, l, Í, Î, und Ì (ja, die sind alle unterschiedlich!) bringen so richtig Spaß, für denjenigen, der das Programm lesen und verstehen muss :toll:


----------



## L-ectron-X (15. Apr 2009)

Vielleicht hilft dir dieser FAQ-Beitrag, dein Problem zu erkennen/lösen.
http://www.java-forum.org/java-faq-beitraege/14159-zugriff-von-einem-objekt-zum-anderen.html


----------



## Turmfalke (15. Apr 2009)

Ersteinmal vielen Dank für die ganzen Posts 
Werde eure Tipps in Zukunft beherzigen. Mein Problem ist manchmal noch, dass ich garnicht weiss, wie ich jetzt den passendsten Namen für eine meiner Variablen wähle  --> bin eben noch Javaanfänger  und muss noch viieeel lernen xD.
Wollte mit meinem vorigen Post auch hier niemanden auf die Füße treten .
@L-ectron-X: Danke für den Link.


----------

