tutorials.de Buch-Aktion 05/2012
Seite 1 von 2 12 LetzteLetzte
ERLEDIGT
JA
ANTWORTEN
16
ZUGRIFFE
327
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    hesk hesk ist offline Mitglied Gold
    Registriert seit
    Oct 2007
    Beiträge
    192
    Hallo!

    Momentan hole ich mir das mainFrame mit

    Klasse xyz:
    Code :
    1
    
    JFrame mainFrame = Application.getInstance(test.main.HelperMain.class).getMainFrame();

    Wobei HelperMain der FrameView ist.

    Gibt es eine Möglichkeit sich den MainFrame zu holen ohne die Klasse angeben zu müssen.
    Denn wenn man die Klasse xyz in einer anderen SingleFrameApplikation verwenden möchte, dann wirft er eine ClastCastException.
     

  2. #2
    Avatar von Fabio Hellmann
    Fabio Hellmann Fabio Hellmann ist offline Mitglied Brokat
    Registriert seit
    Aug 2011
    Ort
    München
    Beiträge
    494
    Was genau willst du den mit diesem Code bezwecken?
     

  3. #3
    hesk hesk ist offline Mitglied Gold
    Registriert seit
    Oct 2007
    Beiträge
    192
    Es geht um einige Dialogs die ich während der Applikation aufrufe.
    Dort möchte ich ein setRelativeTo setzen, und das soll sich immer auf das mainFrame beziehen.
     

  4. #4
    Avatar von Fabio Hellmann
    Fabio Hellmann Fabio Hellmann ist offline Mitglied Brokat
    Registriert seit
    Aug 2011
    Ort
    München
    Beiträge
    494
    Warum übergibst du das JFrame dann nicht einfach an den Dialog?

    Andernfalls, falls du wieder nicht so viele Parameter übergeben willst, kannst du das auch folgendermaßen realisieren:

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    
    import javax.swing.JFrame;
     
    public class JWindow extends JFrame
    {
        private static JFrame mainFrame;
        
        public JWindow() {
            super("Test");
            mainFrame = this;
        }
     
        /**
         * @return the mainFrame
         */
        public static JFrame getMainFrame() {
            return mainFrame;
        }
    }

    Dann musst du im Dialog natürlich nur noch vom Frame die Position abfragen und kannst anschließen die Position des Dialogs bestimmen.
     

  5. #5
    hesk hesk ist offline Mitglied Gold
    Registriert seit
    Oct 2007
    Beiträge
    192
    Nach deinem Code müßte dann in jeder Applikation die Klasse mit dem FrameView gleich heißen.

    Denn in der Klasse xyz verwende ich dann JWindow.getMainFrame();

    Ich möchte aber unabhängig davon wie die FrameView-Klasse heißt das mainFrame bekommen.
     

  6. #6
    Avatar von Fabio Hellmann
    Fabio Hellmann Fabio Hellmann ist offline Mitglied Brokat
    Registriert seit
    Aug 2011
    Ort
    München
    Beiträge
    494
    Das geht nicht (nichts das mir bekannt wäre). Du kannst nicht auf die Klasse JWindow/JFrame zugreifen, wenn du nicht über JWindow gehst. Selbst wenn du dir die Klasse JWindow via den ClassLoader in der jeweiligen Klasse lädst, musst du auch den JWindow-Pfad angeben.
     
    Bitte die Code-Tags verwenden. Bei Java-Code: [java]...[/java]

    Tutorials:
    Automatisches erzeugen eines Inhaltsverzeichnisses (Javascript)
    JAnimationPanel - Animationen für Swing/AWT
    SWTRatingBar (Bewertungs-Composite) selbst programmieren
    ____________________________________________________________________________
    Über eine Bewertung (Stern links unter dem Beitrag) oder ein Danke freue ich mich sehr.

  7. #7
    Avatar von Fabio Hellmann
    Fabio Hellmann Fabio Hellmann ist offline Mitglied Brokat
    Registriert seit
    Aug 2011
    Ort
    München
    Beiträge
    494
    Ich muss mich mal eben selber korrigieren, es geht doch. Wenn du es wie in meinem Beispiel machst und dann in den jeweiligen Klassen (in denen du auf JWindow zugreifst) die Methode getMainFrame() als static import einbindest. Das geht wie folgt:

    Code java:
    1
    
    import static de.tutorials.JWindow.getMainFrame;

    Ich hoffe das ist das was du brauchst.
     
    Bitte die Code-Tags verwenden. Bei Java-Code: [java]...[/java]

    Tutorials:
    Automatisches erzeugen eines Inhaltsverzeichnisses (Javascript)
    JAnimationPanel - Animationen für Swing/AWT
    SWTRatingBar (Bewertungs-Composite) selbst programmieren
    ____________________________________________________________________________
    Über eine Bewertung (Stern links unter dem Beitrag) oder ein Danke freue ich mich sehr.

  8. #8
    Avatar von zerix
    zerix zerix ist offline Hausmeister
    tutorials.de Moderator
    Registriert seit
    May 2005
    Beiträge
    4.335
    Hallo,

    Es gibt doch eine getInstance-Methode, die kein Class-Objekt erfordert. Warum nutzt du nicht diese?


    Gruß

    Sascha
     
    Es ist schwer Allwissend zu sein. Aber ich komme damit klar. ;-)

  9. #9
    hesk hesk ist offline Mitglied Gold
    Registriert seit
    Oct 2007
    Beiträge
    192
    Weil ich durch Application.getInstance()... kein MainFrame bekomme.
     

  10. #10
    hesk hesk ist offline Mitglied Gold
    Registriert seit
    Oct 2007
    Beiträge
    192
    Zitat Zitat von Fabio Hellmann Beitrag anzeigen
    Ich muss mich mal eben selber korrigieren, es geht doch. Wenn du es wie in meinem Beispiel machst und dann in den jeweiligen Klassen (in denen du auf JWindow zugreifst) die Methode getMainFrame() als static import einbindest. Das geht wie folgt:

    Code java:
    1
    
    import static de.tutorials.JWindow.getMainFrame;

    Ich hoffe das ist das was du brauchst.

    Das ist leider nicht das was ich möchte.

    Das Ziel:

    Ich hab 2 Applikationen:

    App1
    App2

    Beide haben unterschiedliche FrameView-Klassen.
    Beide verwenden irgendwo die Klasse xyz.

    In der Klasse xyz möchte ich nun das mainFrame von der Applikation bekommen.
    Da die Klasse xyz in beiden Applikationen verwendet wird, kann ich nicht per .getInstace(...class) drauf zugreifen, weil ich ja nicht weiß welche Klasse es ist.

    Ich bräuchte quasi eine Funktion in der Applikation, wo ich sage setMainFrame( app1-FrameView).
    Und in der xyz-Klasse dann: Application.getMainFrame().

    Hoffe jetzt ist es verständlicher
     

  11. #11
    Avatar von Fabio Hellmann
    Fabio Hellmann Fabio Hellmann ist offline Mitglied Brokat
    Registriert seit
    Aug 2011
    Ort
    München
    Beiträge
    494
    Dann schau dir das am besten mal in SWT die Klasse Display an (Methode: getCurrent()/findDisplay(Thread)). Das müsste genau das sein, was du haben willst. Wenn ich dich jetzt richtig verstanden habe
     
    Bitte die Code-Tags verwenden. Bei Java-Code: [java]...[/java]

    Tutorials:
    Automatisches erzeugen eines Inhaltsverzeichnisses (Javascript)
    JAnimationPanel - Animationen für Swing/AWT
    SWTRatingBar (Bewertungs-Composite) selbst programmieren
    ____________________________________________________________________________
    Über eine Bewertung (Stern links unter dem Beitrag) oder ein Danke freue ich mich sehr.

  12. #12
    hesk hesk ist offline Mitglied Gold
    Registriert seit
    Oct 2007
    Beiträge
    192
    Und wie würde ich diese in der Application verwenden?
     

  13. #13
    Avatar von Fabio Hellmann
    Fabio Hellmann Fabio Hellmann ist offline Mitglied Brokat
    Registriert seit
    Aug 2011
    Ort
    München
    Beiträge
    494
    Hier mal ein Beispiel-Code:

    Die Klasse JWindow:
    Code java:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    
    import javax.swing.JFrame;
     
    public class JWindow extends JFrame
    {
        private final JDisplay display;
        
        public JWindow(String title, JDisplay display) {
            super(title);
            this.display = display;
        }
     
        /**
         * @return the display
         */
        public JDisplay getDisplay() {
            return display;
        }
    }
    Die Klasse JWindow extendest du bei der jeweiligen Klasse, die dein Fenster beinhaltet. Dann müsste es funktionieren.

    Die Klasse JDisplay:
    Code java:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    
    import java.awt.Window;
    import java.util.HashMap;
    import java.util.Map;
     
    public class JDisplay
    {
        private static Map<Thread, JDisplay> displays = new HashMap<Thread, JDisplay>();
        
        public JDisplay() {
            displays.put(Thread.currentThread(), this);
        }
        
        /**
         * @return
         */
        public static JDisplay getCurrent() {
            return displays.get(Thread.currentThread());
        }
        
        /**
         * @return
         */
        public JWindow getActiveWindow() {
            final Thread thread = Thread.currentThread();
            final JDisplay display = displays.get(thread);
            
            Window[] windows = JWindow.getWindows();
            if(windows == null) {
                return null;
            }
            
            for(int i = 0; i < windows.length; i++) {
                JWindow window = (JWindow) windows[i];
                if(window.getDisplay().equals(display)) {
                    return window;
                }
            }
            return null;
        }
    }

    Die Klasse JDisplayTest: (zum Testen)
    Code java:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    
    public class JDisplayTest
    {
        /**
         * @param args
         */
        public static void main(String[] args) {
            JDisplay display = new JDisplay();
            JWindow window = new JWindow("Demo", display);
            window.setTitle("Demo");
            window.setSize(400, 400);
            window.setDefaultCloseOperation(JWindow.EXIT_ON_CLOSE);
            window.setVisible(true);
            
            System.out.println("ActiveWindow="+JDisplay.getCurrent().getActiveWindow().getTitle());
        }
    }
     
    Bitte die Code-Tags verwenden. Bei Java-Code: [java]...[/java]

    Tutorials:
    Automatisches erzeugen eines Inhaltsverzeichnisses (Javascript)
    JAnimationPanel - Animationen für Swing/AWT
    SWTRatingBar (Bewertungs-Composite) selbst programmieren
    ____________________________________________________________________________
    Über eine Bewertung (Stern links unter dem Beitrag) oder ein Danke freue ich mich sehr.

  14. #14
    hesk hesk ist offline Mitglied Gold
    Registriert seit
    Oct 2007
    Beiträge
    192
    In deiner Main-Methode kannst du auf JDisplay zugreifen, logisch.

    Aber wie würde es so aussehen:


    Die Klasse JDisplayTest: (zum Testen)
    Code java:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    
    public class JDisplayTest
    {
        /**
         * @param args
         */
        public static void main(String[] args) {
            JDisplay display = new JDisplay();
            JWindow window = new JWindow("Demo", display);
            window.setTitle("Demo");
            window.setSize(400, 400);
            window.setDefaultCloseOperation(JWindow.EXIT_ON_CLOSE);
            window.setVisible(true);
            
            Xyz xyz = new Xyz();
        }
    }

    Code java:
    1
    2
    3
    4
    5
    6
    7
    
    public class Xyz()
    {
       public xyz()
       {
            Hier möchte ich das mainFrame haben
       }
    }

    Dass ich der Klasse xyz das JDisplay übergeben kann ist mir schon klar.
    Das hier ist nur ein einfaches Beispiel. Die Klasse xyz ist ja viel tiefer, und man müßte dann das JDisplay Object immer mitschleppen.

    Da kann ich dann gleich von MainFrame aus der JFrame mitschleppen
     

  15. #15
    Avatar von Fabio Hellmann
    Fabio Hellmann Fabio Hellmann ist offline Mitglied Brokat
    Registriert seit
    Aug 2011
    Ort
    München
    Beiträge
    494
    Nein musst du nicht, da wo du das JWindow brauchst, machst du einfach den Aufruf:
    Code java:
    1
    
    JDisplay.getCurrent().getActiveWindow()
    ...und das wars.
     
    Bitte die Code-Tags verwenden. Bei Java-Code: [java]...[/java]

    Tutorials:
    Automatisches erzeugen eines Inhaltsverzeichnisses (Javascript)
    JAnimationPanel - Animationen für Swing/AWT
    SWTRatingBar (Bewertungs-Composite) selbst programmieren
    ____________________________________________________________________________
    Über eine Bewertung (Stern links unter dem Beitrag) oder ein Danke freue ich mich sehr.

Ähnliche Themen

  1. SingleFrameApplication - Preferences
    Von hesk im Forum Java
    Antworten: 9
    Letzter Beitrag: 10.08.11, 09:07
  2. Antworten: 6
    Letzter Beitrag: 09.08.11, 10:29
  3. Antworten: 13
    Letzter Beitrag: 09.08.11, 08:45
  4. JSF Applikation innerhalb einer JSF Applikation
    Von Chefkoch333 im Forum Enterprise Java (JEE, J2EE, Spring & Co.)
    Antworten: 0
    Letzter Beitrag: 12.10.07, 13:21
  5. MFC View aus MainFrame?
    Von Codex27 im Forum VisualStudio & MFC
    Antworten: 1
    Letzter Beitrag: 06.06.06, 21:45