PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Java | neues Fenster / "Dialog" erzeugen



maceop
15-10-2002, 22:00
hallo,
ich hab mich gefragt wie man auf Knopfdruck z.B. ein neues Fenster öffnen kann, ich weiss das man dies im ActionListener implementieren muss, doch zur Erzeugung eines zweiten Fensters.... hab ich noch ne Frage .

muss ich dafür z.B. die Methoden....von JDialog vererben (mit extends) ? oder gibt es eine einfacherere methode ? bisher dachte ich, man müsste es auf jeden fall von JDialog "ableiten"...

kennt jemand ne andere methode auf knopfdruck ein neues fenster (mit z.B. weiteren Buttons) zu öffnen ?

maceop

anda_skoa
15-10-2002, 22:41
Du mußt nicht ableiten, du kannst auch direkt im actionPerformed alle Elemente hinzfügen.
Ist halt praktischer, wenn man schon alles fix und fertig in einer eigene Klasse hat und die nur mehr anzeigen muß :)

Ciao,
_

maceop
16-10-2002, 18:35
hi,
in gewisser weise hab ich mich wohl falsch ausgedrückt, ich weiss das ich nen action listener mit actionPerformed hinzufügen muss, doch innerhalb von actionPerformed will ich erreichen das ein neues (zweites,drittes..) Fenster geöffnet wird, welchees wiederum gewisse elemente wie buttons...enthält

tia
maceop

anda_skoa
16-10-2002, 18:38
Das hab ich doch geschrieben :confused:

Ich schrieb, dass es natürlich überalle möglich ist, Fenster zu erzeugen und Element hinzuzufügen, dass es aber einfacher ist, wenn man eine eigene Subklasse hat und diese nur instanzieren muß.

Ciao,
_

maceop
17-10-2002, 18:27
ok, nur wie sieht der code aus, in actionnPerformed ? ich meine wie kann ich in meinem programm ein zweites fenster erzeugen ?

etwa auch so dass ich ne class sowieso hol, den konstruktur bilde, super(titel) mache und das wars ?

mfg
maceop

ps. sorry für meine dummen fragen

anda_skoa
17-10-2002, 19:11
Sagen wir die Klasse, die das actionPerformed implementiert ist ein JFrame oder eine andere Klasse, die als Windowparent dienen kann.



public void actionPerformed(ActionEvent e)
{
JDialog dlg = new JDialog(this);
dlg->setVisible(true);
}


Geht natürlich analog mit AWT Klassen :)

Ciao,
_

maceop
17-10-2002, 21:27
hmm..komisch :

"cannot resolve symbol
symbol : constructor JDialog (myaction)
location: class javax.swing.JDialog
JDialog dlg = new JDialog(this); "

dabei sind meine imports :

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

hier der ganze code:



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

public class Edit extends JFrame
{
Edit(String titel)
{
super(titel);
Button first = new Button("my button");
add(first);

class myaction implements ActionListener {
public void actionPerformed(ActionEvent e)
{
JDialog dlg = new JDialog(this);
dlg.setVisible(true);
}
}

first.addActionListener(new myaction());
}



public static void main(String[] args)
{
Edit e = new Edit("small example of opening other windows");

e.setLocation(100,100);
e.pack();
e.show();
}
}


ich hab "dein" dlg->setVisible(true); durch dlg.setVisible(true); ersetzt, beim kompilieren kommt der oben genannte fehler.... hat einer ne ahnung warum ?

danke nochmals
maceop

anda_skoa
17-10-2002, 23:42
Original geschrieben von maceop
hmm..komisch :


Nein, gar nicht :)



"cannot resolve symbol
symbol : constructor JDialog (myaction)
location: class javax.swing.JDialog
JDialog dlg = new JDialog(this); "


this bezog sich auf den JFrame.
Hab extra geschrieben, dass ich annehme, dass das Codesnippet in einem JFram oder einer anderen Klasse ist, die als Windowparent erlaubt ist.
Wenn du dir die Konstruktoren von JDialog ansiehts, wirst du sehen, dass solche Klassen von JFrame oder JDialog abgeleitet sein müssen.

Du hast es aber in einer anderen Klasse gemacht und der Kompiler weißt dich darauf hin, dass myaction kein gültiger Parameter für einen JDialogkonstruktor ist.



ich hab "dein" dlg->setVisible(true); durch dlg.setVisible(true); ersetzt


Sorry, zuviel C++ heute :)

Ciao,
_

maceop
18-10-2002, 13:47
hi,
hab jetzt 'extends JDialog' hinzugefügt, und es klappt.

hab da mal ne dumme frage, und zwar "wie kann man eigentlich das symbol in der "status/titel leiste" ändern ? unter delphi gings ganz leicht...
nur mal so als zwischenfrage


danke nochmals !

maceop

anda_skoa
18-10-2002, 14:15
Original geschrieben von maceop
hi,
hab jetzt 'extends JDialog' hinzugefügt, und es klappt.


Du hast das bei der internen class myaction dazugeschrieben?
Das wäre in ziemlich übler Hack.

Besser wäre es, entweder den ActionListener in der Frame Klasse zu implementieren, oder, wenn es unbedingt eine extra Klasse sein muß, dieser den Frame als Argument zu geben, damit sie ihn dann an den Dialog geben kann.

Ich würde da zu ersterem raten, da Edit sonst eh keinen ActionListener braucht.



hab da mal ne dumme frage, und zwar "wie kann man eigentlich das symbol in der "status/titel leiste" ändern ? unter delphi gings ganz leicht...


Hmm, der Statusbar enthält normalerweise kein Icon.
In der Windowtitle Leiste geht das glaub ich mit
Frame.setIconImage

Ciao,
_

maceop
18-10-2002, 17:15
achso, wusste ich nicht , werd wohl deinen ersten vorschlag wahrnehmen...

hab in dem javabuch nachgeguckt (www.javabuch.de), dort steht u.a. drin das man es mit setIconImage machen kann..

danke

maceop

maceop
18-10-2002, 22:45
Original geschrieben von anda_skoa
Du hast das bei der internen class myaction dazugeschrieben?

bisher sah die zeile so aus:

class myaction extends JDialog implements ActionListener {
...
}

diese "Schreibweise" hab ich aus Jetzt lerne ich java (m&t)....




Besser wäre es, entweder den ActionListener in der Frame Klasse zu implementieren, oder, wenn es unbedingt eine extra Klasse sein muß, dieser den Frame als Argument zu geben, damit sie ihn dann an den Dialog geben kann.


hab jetzt schon verschiedene extends und implements varianten versucht, funzt nur irgendwie nicht so richtig....

warum wäre es eigentlich ein übler hack ?

tia
maceop

anda_skoa
19-10-2002, 14:04
Original geschrieben von maceop
diese "Schreibweise" hab ich aus Jetzt lerne ich java (m&t)....

Markt&Technik :rolleyes:



hab jetzt schon verschiedene extends und implements varianten versucht, funzt nur irgendwie nicht so richtig....


so sollte es gehen.


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

public class Edit extends JFrame implements ActionListener
{
public Edit(String titel)
{
super(titel);
Button first = new Button("my button");
add(first);
first.addActionListener(this);
}

public void actionPerformed(ActionEvent e)
{
JDialog dlg = new JDialog(this);
dlg.setVisible(true);
}
}




warum wäre es eigentlich ein übler hack ?


Weil es die einzige Aufgabe von myaction ist, ein ActionListener zu sein.
So wäre er auch ein JDialog, ohne jemals in dieser Eigenschaft benutzt zu werden.

Außerdem ist das Verhalten anders.
Dadurch, dass myaction selbst dann keinen Parent hat, wird er nicht mit dem Hauptfesnter minimiert aund damit auch nicht der Dialog dlg.
Das ist aber das erwartetet Verhalten bei einem Dialog, dass er auch verschwindet, wenn man das Hauptfenster miminiert.

Ciao,
_

maceop
19-10-2002, 14:33
No Errors found ;)

Danke für deine Hilfe und deine Geduld !


maceop

maceop
19-10-2002, 17:33
Original geschrieben von anda_skoa

wenn es unbedingt eine extra Klasse sein muß, dieser den Frame als Argument zu geben, damit sie ihn dann an den Dialog geben kann.



die vorherige version "basiert" doch eigentlich darauf das Edit nur einen ActionListener benötigt/ benutzt, doch wie siehts aus , wenn man mehrere Elemente wie Buttons....added und das selbe erreichen will ?

meinst du mit dem quote z.B. so was :

class blabla implents ActionListener
{
....
blabla(JFrame f, String titel)
{
super(f,titel,true);
...
}
}

und beim aufruf :
blabla testdialog = new blabla(this,"Dialog");

sind nur schnipsel....

maceop

anda_skoa
19-10-2002, 18:15
In dem Fall muß blabla aber extends JDialog sein, wenn du es als Diaog benutzen willst, aber sonst, ist es das,w s ich gemeint habe.

Wenn man eine extra Klasse als ActionListener macht, kann man dieser Klasse den JFrame als Parameter geben, damit sie ihn dann weitergeben kann.

Man kann einen ActionListener für mehrere Elemente eintragen.
Das ActionEvent hat Methoden, mit denen man rausfinden kann, woher es kommt.

Ansich ist es keine schlechte Idee, Listener in eigene Klasse zu implementieren, vorallem wenn viel dort gemacht werden soll.
Man kann dann nämlich leicht HIlfsmethoden implementieren, die sonst nur stören würden.

Bei einfachen Sache, oder wenn viel auf die Elemente eines Frames oder Dialogs zugegriffen werden muß, kann es manchmal besser sein, es direkt im Dialog oder Frame zu machen.
Zum Beispiel, bei OK/Cancel/Apply Buttons in Dialogen.

Es gibt keine "beste" Lösung für alle Fälle, man muß von Fall zu Fall einfach abwägen, was besser ist.

Ciao,
_