Willkommen ~Gast!
Registrieren || Einloggen || Hilfe/FAQ || Staff
Probleme mit der Registrierung im Forum? Melde dich unter registerEin Bild.
Autor Beitrag
000
12.10.2005, 01:20
doener



Ich hasse Java. Wie rufe ich eine "Methode" mit nem Button UND einfach so auf? Zurzeit steht da:

public void resetActionPerformed (ActionEvent evt)

Wenn ich nen Button klicke wird das aufgeführt. Jetzt will ich das aber nicht nur mit dem Button aufrufen, sondern auch direkt irgendwo anders, also ungefähr so:

resetActionPerformed();

Wie geht das???

--

zum Seitenanfang zum Seitenende Profil || Suche
001
12.10.2005, 01:23
theDon



Quellcode:instance.resetActionPerformed();

--

\o tanz den naziprau! o/

And more than ever, I hope to never fall,
Where enough is not the same it was before

zum Seitenanfang zum Seitenende Profil || Suche
002
12.10.2005, 01:36
KhanRKerensky



Ich hab zwar nicht wirklich ne Ahnung von Java, aber es gäbe da zwei Ansätze.
1. Eine zusätzliche Funktion erstellen die genau das macht wie deine Buttonfunktion. Da brauchst dann kein ActionEvent.
2. Du erstellst nen dummyobjekt vom Typ ActionEvent und übergibst das der Funktion. Da du das Event anscheint eh nicht auswertest dürfte das gehen. So hab ich das zumindest teilweise bei Delphi gemacht, wo man allerdings nur ein TObject übergeben musste.

/edit
Oder man machts einfach im Javastyle wie es theDon vorgeschlagen hat ;)

--

"[...] you're going to burn in a very special level of Hell. A level they reserve for child molesters and people who talk at the theater." - Book


Dieser Beitrag wurde am 12.10.2005 um 01:38 von KhanRKerensky bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
003
12.10.2005, 01:45
doener



Quellcode:cannot find symbol
        instance.resetActionPerformed();
        ^
@KhanRKerensky: Quelltext dublizieren mach ich nicht, das ist mir zu dumm. Das mit dem Dummy-Ding hab ich nicht verstanden, ich versteh diesen ganzen Event-Kram bei den Buttons nicht, das ist ne Vorgabe von unserem Lehrer:
Quellcode:reset.addActionListener (new ActionListener () {
      public void actionPerformed (ActionEvent evt) {
        resetActionPerformed (evt);}});
Könnt ihr mir das bitte mal genau erklären? Die SUN-Doku hilft mir kein bisschen weiter!

--


Dieser Beitrag wurde am 12.10.2005 um 01:59 von doener bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
004
12.10.2005, 03:03
theDon



`instance' ist natuerlich eine Instanzvariable eines Typs, der resetActionPerformed() implementiert. Vermutlich ist das bei ActionListener der Fall. So wie ich das sehe, konstruirst du da einen anonymen Typen, der von ActionListener erbt. Dieser wird direkt instanziert und an addActionListener() uebergeben. Damit hast du allerdings keine explizite Instanzvariable, ueber die du resetActionPerformed() aufrufen koenntest. Im Zweifelsfall ist das eh protected, von daher haette sich das direkt erledigt. Ich bin jetzt aber zu faul, das nachzugucken. Falls nicht, koennte das so funktionieren:

Quellcode:ActionListener listener = new ActionListener()
{
  public void actionPerformed(ActionEvent evt)
  {
    resetActionPerformed(evt);
  };
}

reset.addActionListener(listener);
listener.resetActionPerformed(new ActionEvent()); //!< fraglich, ob ActionEvent nicht eventuell abstrakt ist...
Am Rande: Euer Coding-Style suckt massivst. :P

--

\o tanz den naziprau! o/

And more than ever, I hope to never fall,
Where enough is not the same it was before


Dieser Beitrag wurde am 12.10.2005 um 03:03 von theDon bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
005
12.10.2005, 12:16
Kriz



Quellcode:import java.awt.*;
import java.awt.event.*;

public class Buttontest
extends Frame
implements ActionListener
{
    Button b = new Button("UND");

    public static void main(String[] args)
    {
        Buttontest app = new Buttontest();
        app.setVisible(true);
    }

    public Buttontest()
    {
        super("Buttontest");
        setLayout(new GridLayout(1,1));

        b.addActionListener(this);
        add(b);

        pack();
    }

    public void actionPerformed(ActionEvent event)
    {
        Object obj = event.getSource();

        if(obj instanceof Button)
        {
            Button but = (Button)obj;

            if(but == b) doSomething();
        }
    }

    public void doSomething()
    {
        b.setText("Was und?");
    }
}
Du drückst den Button und er wechselt die Beschriftung. Wie du sehen kannst, ist die Operation hierfür in der Methode doSomething() abgelegt. Diese kannst du (zumindest in dieser Deklarationsform) überall über ein Klassenobjekt von Buttontest oder überall aus Buttontest selbst heraus aufrufen. Der Eventlistener actionPerformed() ist ja aus dem Interface ActionListener und _muß_ in der implementierenden Klasse konkretisiert werden. Das sollte helfen für dein Projekt.

Es gibt noch andere Möglichkeiten, Events zu behandeln (damit meine ich nicht das ursprüngliche, beknackte Eventmodell von Java 1.0). So kann man auch direkt in einer abgeleiteten Klasse von Button auf alle möglichen Events direkt reagieren und dann diese an übergeordnete EventListener durchschleifen. Aber das glaube ich ist nicht das, wonach du suchst, oder?

--

K:R-I)Z++
"CSS ist cascading style sheets. Und nicht so'n Ranzspiel." - dp
In memory of Voice († 2005/03/30)

zum Seitenanfang zum Seitenende Profil || Suche
006
13.10.2005, 15:59
doener



Erstmal Danke für die ganzen Vorschläge, das meiste davon versteh ich zwar net wirklich, aber:
@Kriz: Du hast ja eigentlich nichts anderes gemacht, als Methoden geschachtelt:

Das, was dein Prog macht, sieht doch im Wesentlichen wie folgt aus:
Quellcode:public void actionPerformed(ActionEvent event)
   {
       doSomething();
   }

    public void doSomething()
    {
       //den shit den ich hier halt haben will>;
    }

public void bindauerndamlaufen()
   {
       doSomething();
   }
Die erste ist also nur ne Art Weiterleitung zu der richtigen Methode, und zwar für den Button. Die richtige Methode kann ich dann ja auch direkt aufrufen, is klar. Aber geht das nicht nur mit EINER Methode? Also ungefähr so:
Quellcode:b.click = doSomething();

public void doSomething()
   {
       //lalala;
   }

public void bindauerndamlaufen()
   {
       doSomething();
   }

--


Dieser Beitrag wurde am 13.10.2005 um 16:06 von doener bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
007
13.10.2005, 17:48
Kriz



Nein. Nicht direkt. Und btw. ist deine Syntax da oben JavaScript like und das beißt sich gewaltig mit Java. Was du machen kannst ist einen Buttonklick simulieren, indem die Methode b.doClick() aufgerufen wird. Aber wie auch immer, du mußt den ActionListener _immer_ konkretisieren durch performAction(ActionEvent)!

Schau dir erstmal das Eventmodell von Java an, dann wirst du sehen, daß meine Lösung korrekt ist.

www.javabuch.de
http://www.galileocomputing.de/openbook/javainsel4/

--

K:R-I)Z++
"CSS ist cascading style sheets. Und nicht so'n Ranzspiel." - dp
In memory of Voice († 2005/03/30)

zum Seitenanfang zum Seitenende Profil || Suche
008
13.10.2005, 20:32
doener



Bestreite ich auch garnicht, hab nur gedacht das geht einfacher...
Naja, dann geht's halt nicht... und ey: Nichts gegen JavaScript, in Javascript gibt's sowas nicht! :)

--


Dieser Beitrag wurde am 13.10.2005 um 20:33 von doener bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
009
16.10.2005, 15:56
doener



Was ist der Unterschied zwischen:

zahl = Integer.valueOf(einstring).intValue();
zahl = Integer.valueOf(einstring);

???
Beides lässt sich fehlerfrei kompilieren und hat das gleiche Ergebnis, aber mein Lehrer behauptet die zweite Möglichkeit wäre falsch... O_o

--

zum Seitenanfang zum Seitenende Profil || Suche
010
16.10.2005, 16:43
CN



evtl mal googlen? auf die idee kommst du nich oder wie .. da stehts:
http://java.sun.com/j2se/1.4.2/docs/api/java/lang/Integer.html

--

zum Seitenanfang zum Seitenende Profil || Suche
011
16.10.2005, 17:05
doener



Ich mache seit über zwei Stunden nichts anderes als die API-Referenz durchzugehen... ich kann daraus nur immer wieder entnehmen, dass die Schreibweise "Integer.valueOf(einstring).intValue();" total unsinnig ist, dass die ganze Methode "intValue()" auf ein Integer Objekt angewandt unsinnig ist. Und anscheinend wird das trotzdem gemacht:
http://www.google.de/search?hl=de&q=Integer.valueof%28stringwert%29.intValue%28%29%3B&meta=
Sind die alle dumm oder was?

--

zum Seitenanfang zum Seitenende Profil || Suche
012
16.10.2005, 17:25
theDon



Integer ist eine Klasse.
int ist ein primitiver Typ.
Anders ausgedrueckt: Integer und int sind zwei voellig unterschiedliche Typen. Von daher ist eine Konvertierung absolut nicht sinnfrei.

--

\o tanz den naziprau! o/

And more than ever, I hope to never fall,
Where enough is not the same it was before

zum Seitenanfang zum Seitenende Profil || Suche
013
16.10.2005, 17:45
HammerBlade



Zitat:
doener postete
Beides lässt sich fehlerfrei kompilieren und hat das gleiche Ergebnis, [...]
Das glaube ich dir nicht. Ausserdem hast du verschwiegen was zahl für einen Typ hat (int oder Interger). Egal welchen Typ es hat (int oder Interger) eine der beiden Version (mit oder ohne intValue()) wird eine Fehler beim Compilieren erzeugen.

Compilier mal bitte das hier:
Quellcode:class main
{
    public static void main(String[] args)
    {
        int zahl = 0;
        
        zahl = Integer.valueOf("42").intValue();
        zahl = Integer.valueOf("17");
    }
}
Und sag, ob es fehlerfrei bei dir compiliert.

--

"Mit C++ (noch besser mit C) kann man sich _sehr_ leicht in den Fuss schiessen." - theDon
Auspack und freu! - Auszug aus einer, aus dem japanischen übersetzten, Bedienugsanleitung für ein Spielzeugaquarium.
--
Photon Audio Player | Majestic42.net | How To Ask Questions The Smart Way


Dieser Beitrag wurde am 16.10.2005 um 17:45 von HammerBlade bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
014
17.10.2005, 01:16
doener



Hab zu Anschauungszwecken was neutrales ergänzt:

Eine Variable vom Typ Integer ist ein Zahlentyp, ist klar, was ist ein "int"? Ich hab gedacht das wär ne Abkürzung für Integer?! Ich hab in meinem Programm Zahlen-Variablen immer mit "int zahl2 = 4;" etc. deklariert, hab gedacht damit mache ich Integer-Variablen, bisher verhalten sie sich auch genau so (kann keine Kommazahl sein, typische Länge etc.).

--

zum Seitenanfang zum Seitenende Profil || Suche
015
17.10.2005, 09:28
hausi



int ist der primitive Typ, der nur die Zahl beinhaltet. Integer ist die Klasse dazu, die alles mögliche an Manipulations- unf Konvertierungs-Methoden hat.
Im Normalfall verwendet man int und nimmt nur die statischen Methoden von Integer. Wenn du aber z.B. einen int speichern willst, bietet sich die Klasse Integer an, da sie Serializable ist und du somit nix selber machen musst.

--

zum Seitenanfang zum Seitenende Profil || Suche
016
17.10.2005, 10:40
Kriz



Primitive wie int sind in Java immer serialisierbar, da brauch man kein Integer als Wrapper (außer man deklariert sie als 'transient'). Früher wurden die Primitivwrapper genutzt, um Konvertierungen zu machen wie float nach String oder so. Heute braucht man sie zwingend für den Einsatz in den Templates von Java 5, da Java nur Klassenobjekte als generische Datentypen akzeptiert und Primitive davon ausgeschlossen sind. Wer also ein int in einer Liste nach Java 5 speichern will, der muß Integer als Objekt angeben. Das dynamische Autocasting sollte dann automatisch ein int nach Integer wandeln bzw. ein Integer nach int (ich würde mich aber nicht darauf verlassen).

PS: Was für eine IDE ist das? Kostenlos?

--

K:R-I)Z++
"CSS ist cascading style sheets. Und nicht so'n Ranzspiel." - dp
In memory of Voice († 2005/03/30)


Dieser Beitrag wurde am 17.10.2005 um 10:41 von Kriz bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
017
17.10.2005, 11:36
HammerBlade



Ich verstehe nicht warum das bei doener so vom Compiler geschluckt wird. Ich bekomme eine Incompatible-Types-Fehler, wie ich auch erwartet hatte. Auch mein JDK unterscheidet sich nur in der Subversion: JDK 1.5.0_02.

Zitat:
Kriz postete
Das dynamische Autocasting sollte dann automatisch ein int nach Integer wandeln bzw. ein Integer nach int (ich würde mich aber nicht darauf verlassen).
Was verstehst du unter "dynamische Autocasting"? Soll das Coercion (impliziter Cast, z.B. von float auf int: int n = 5; float f = n;) sein? Oder soll das so laufen wie mit toString()?

--

"Mit C++ (noch besser mit C) kann man sich _sehr_ leicht in den Fuss schiessen." - theDon
Auspack und freu! - Auszug aus einer, aus dem japanischen übersetzten, Bedienugsanleitung für ein Spielzeugaquarium.
--
Photon Audio Player | Majestic42.net | How To Ask Questions The Smart Way


Dieser Beitrag wurde am 17.10.2005 um 11:39 von HammerBlade bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
018
17.10.2005, 11:37
CN



steht doch da :P java-editor
http://www.google.de/search?hl=de&q=java+editor&btnG=Google-Suche&meta=
den haben wir auch benutzt als wir in der schule java gemacht haben

--

zum Seitenanfang zum Seitenende Profil || Suche
019
17.10.2005, 13:01
Kriz



Zitat:
Was verstehst du unter "dynamische Autocasting"? Soll das Coercion (impliziter Cast, z.B. von float auf int: int n = 5; float f = n;) sein? Oder soll das so laufen wie mit toString()?
Das ist ein neues Feature von Java 5, speziell für die Nummernwrapper gedacht. Der Interpreter erkennt automatisch bei einer Parameterliste, ob der Typ primitiv ist oder ein Wrapper. Wenn also ein Primitivtyp erwartet wird (int, double, usw.) und man übergibt stattdessen einen Wrapper (Integer, Double, usw.), dann castet Java den Wrapper automatisch in den passenden Primitivtyp um. Andersherum genauso. Leider hat das Autocasting auch seine Schwächen, weshalb ich nicht so recht davon überzeugt bin.

@CN: Hm, ich suche immer eine halbwegs gute Java IDE. Seit jeher arbeite ich mit Kawa Pro, an Eclipse taste ich mich gerade ran. Wenn das Ding da was taugt, dann schnupper ich da auch mal rein, da Kawa Pro dummerweise immer an die aktuelle Java VM gebunden war (d.h. bei 1.3 wurde die Entwicklung gestoppt o_O). Mit ein paar Tricks kann man aber durchaus auch Java 5 damit coden. Nur solche Dinge wie IntelliSense usw. bleiben infolge der 1.3er Codedefinition auf dem Stand von 1.3 stehen. Das prickelt nicht so dolle...

Und der Debugger erwartet dummerweise eine 1.3er DLL, die ich aber nicht mehr habe, daher läuft nur noch der JDB, alles andere versagt. (brummel)

--

K:R-I)Z++
"CSS ist cascading style sheets. Und nicht so'n Ranzspiel." - dp
In memory of Voice († 2005/03/30)


Dieser Beitrag wurde am 17.10.2005 um 13:03 von Kriz bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
020
17.10.2005, 13:31
HammerBlade



Dynamische Autocasting läuft also so wie toString(). Nur warum geht das dann bei doener und bei mir nicht? Mal auf 1.5.0_05 updaten.

--

"Mit C++ (noch besser mit C) kann man sich _sehr_ leicht in den Fuss schiessen." - theDon
Auspack und freu! - Auszug aus einer, aus dem japanischen übersetzten, Bedienugsanleitung für ein Spielzeugaquarium.
--
Photon Audio Player | Majestic42.net | How To Ask Questions The Smart Way

zum Seitenanfang zum Seitenende Profil || Suche
021
17.10.2005, 13:53
doener



Also ist die Antwort auf meine Frage:

zahl = Integer.valueOf(einstring).intValue();
zahl = Integer.valueOf(einstring);

ist beides möglich, da sich kürzlich seit einer Java-Version irgendwas geändert hat?

--

zum Seitenanfang zum Seitenende Profil || Suche
022
17.10.2005, 13:59
HammerBlade



Mit JDK 1.5.0_05 kann ich das jetzt auch fehlerfrei compilieren. mit JDK 1.5.0_02 ging es nicht.

Es ist wohl ab JDK 1.5.0_05 beides möglich. Ich würde aber

Quellcode:int zahl = Integer.valueOf(einstring).intValue(); bevorzugen, weil es expilizter ist.

--

"Mit C++ (noch besser mit C) kann man sich _sehr_ leicht in den Fuss schiessen." - theDon
Auspack und freu! - Auszug aus einer, aus dem japanischen übersetzten, Bedienugsanleitung für ein Spielzeugaquarium.
--
Photon Audio Player | Majestic42.net | How To Ask Questions The Smart Way


Dieser Beitrag wurde am 17.10.2005 um 13:59 von HammerBlade bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
023
17.10.2005, 15:21
Kriz



Davon rede ich doch die ganze Zeit. Das ist Autocasting live.

Integer.valueOf("10") produziert ein int mit dem Wert 10. Es stünde also da:

int zahl = 10.intValue();

Nun kommt Autocasting und erkennt, daß eine aus Integer bekannte Methode ( intValue() ) auf ein Primitiv angewendet werden soll. Folglich casted der Interpreter (bzw. hat der Compiler evtl. schon vorher gebytecodet) die Zahl 10 intern um in Integer(10), worauf er wieder durch intValue() die Zahl 10 ausspuckt. Daher ist es _nicht_ ratsam, dieses Konstrukt zu wählen, da es auf die Laufzeit geht. Das Endergebnis ist sowieso dasselbe und der Ausdruck Integer.valueOf(String) ist sowieso der gebräuchlichere.

Zitat:
Mit JDK 1.5.0_05 kann ich das jetzt auch fehlerfrei compilieren. mit JDK 1.5.0_02 ging es nicht.
Leider hat das Autocasting auch seine Schwächen, weshalb ich nicht so recht davon überzeugt bin. SUN gibt selber zu, daß Autocasting eher Beta als Stable ist. Eventuell wird das ja mit 1.6 besser...

--

K:R-I)Z++
"CSS ist cascading style sheets. Und nicht so'n Ranzspiel." - dp
In memory of Voice († 2005/03/30)

zum Seitenanfang zum Seitenende Profil || Suche
024
17.10.2005, 16:05
theDon



Zitat:
static Integer valueOf(String s)
Returns an Integer object holding the value of the specified String.
Wo bitte ist Integer.valueOf("10") ein int?

--

\o tanz den naziprau! o/

And more than ever, I hope to never fall,
Where enough is not the same it was before

zum Seitenanfang zum Seitenende Profil || Suche