ich habe eine eigene klasse "Dialog.java" vom typ "JDialog" erstellt und möchte einen dialog mit folgender funktion aus meiner main klasse vom typ "JFrame" starten lassen:
Java:
publicstaticvoidstart_dialog(){JDialog d =newDialog(this,true);
d.setLocationRelativeTo(this);
d.setVisible(true);}
allerdings meckert er, da "this" non-static ist und ich diese nicht in einer static verwenden kann.
wie mach ich diese referenz? ich hab da auch schon rumprobiert. der konstruktor von JDialog erwartet den typ "java.awt.Frame". mein JFrame hab ich "MainFrame" genannt.
das mit dem kskb wird auf die schnelle schwierig
na ja, so z.B. .... du entscheidest doch, was du wem wann und wo mitgibst.
Hier gebe ich der DialogKlasse eine Referenz auf den MainFrame mit. Da ich hier annoyme ActionListener benuzte, muss ich mir sogar eine Referenz im Konstruktor schaffen, nicht schön...aber sollte dir zeigen, dass es relativ einfach ist...
Java:
importjava.awt.BorderLayout;importjava.awt.Dimension;importjava.awt.event.ActionEvent;importjava.awt.event.ActionListener;importjavax.swing.JButton;importjavax.swing.JDialog;importjavax.swing.JFrame;importjavax.swing.JPanel;publicclassMainFrameextendsJFrame{publicstaticvoidmain(String[] args){newMainFrame().setVisible(true);}MainFrame dieserFrame;publicMainFrame(){
dieserFrame =this;setSize(500,400);setLocationRelativeTo(null);initSomeComponents();setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);}privatevoidinitSomeComponents(){JPanel p =newJPanel();JButton b =newJButton("ein Button");
b.addActionListener(newActionListener(){@OverridepublicvoidactionPerformed(ActionEvent e){newDialogKlasse(dieserFrame).start_dialog();}});
p.add(b);this.add(p,BorderLayout.NORTH);}}classDialogKlasseextendsJDialog{MainFrame mainFrame;publicDialogKlasse(MainFrame mainFrame){this.mainFrame = mainFrame;}publicvoidstart_dialog(){JDialog d =newJDialog(mainFrame,true);
d.setSize(newDimension(50,50));
d.setLocationRelativeTo(mainFrame);
d.setVisible(true);}}
vielen dank, aber das funktioniert so nicht.
der unterschied bei mir liegt darin, dass mein JPanel eine eigene klasse in einer eigenen datei "Panel.java" ist. das füg ich dann einem anderen panel im JFrame hinzu:
von diesem panel aus möchte ich dann auf die funktion im JFrame zugreifen, die den JDialog (wiederum eigene klasse) öffnet.
Java:
publicstaticvoidstart_dialog(){JDialog d =newDialog(this,true);
d.setLocationRelativeTo(this);
d.setVisible(true);}
mein problem ist einfach, dass diese start_dialog() eine static ist und ich damit "this" nicht verwenden kann und ohne weiß ich nicht wie ich die referenz auf mein mainframe setzen kann.
wenn start_dialog() nicht-statisch ist, dann kann ich sie nicht aus meiner panel-klasse aufrufen.
irgendwann initialisierst du dein panel doch...dann gib dem eine Referenz von deinem Frame mit. Diese merkwürdig static-Methode sollte in eine normale Methode verwandelt werden.
ich weiß sonst auch nicht, wie man dir helfen kann...oder du postest deine Klassen und dann kann man dir das mal an einem Bsp. zeigen, wie man es machen könnte.
danke, das war die lösung, ich geb dem konstruktor des panels die referenz einfach mit danke!
so funktionierts!
wo wir gerade dabei sind, vielleicht hab ich da auch was grundlegendes nicht verstanden?!? aber um diese methode start_dialog() nicht-statisch zu machen, müsste ich sie doch irgendeinem objekt zuordnen? weil wenn ich das static einfach raus nehm, kann ich von einer anderen klasse nicht mehr so einfach (z.b. durch einen buttonklick in einer anderen klasse) drauf zugreifen.
richtig, aber zu irgendeiner Klasse gehört ja diese Methode! Du bräuchtest natürlich eine Instanz dieses Objektes, um dann darauf zugreifen zu können. Wenn diese Methode nur ein Dialog öffnet, langt es evtl dir eine Util-Klasse zu machen, die dann auch static Methoden anbietet...ansonsten beginnst du langsam mit dem Design von SW und triffst auf die ersten Probs damit. Schau dir bspw. MVC mal an, oder andere Patterns, die sich mit der Trennung von View und bspw. Logik beschäftigen.