tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
8
ZUGRIFFE
698
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    xanadoo xanadoo ist offline Mitglied Gold
    Registriert seit
    Mar 2005
    Beiträge
    119
    Hallo zusammen

    Ich möchte von einem Modalen JDialog aus ein Help-System aufrufen.
    Dies muss aber Nicht-Modalen angezeit werden, und sollte natürlch auch bedienbar sein ohne das ich den Modalen Dialog vorher schliesse.

    Wie bringe ich denn über eine Modale, eine Nicht-Modale Swing Componente?
    So direkt geht das ja nicht.
    Jedoch denke ich, dass es eine Lösung geben muss, denn z.B. JavaHelp lässt sich ja auch von einem Modalen Dialog aus aufrufen.


    Besten Dank für jede Hilfe.
     

  2. #2
    Tsunamii Tsunamii ist offline Mitglied Silber
    Registriert seit
    Jul 2009
    Beiträge
    75
    wenn du dein Help-System auch als JDialog aufziehst und als Owner den modalen Dialog mitgibst sollte es eigentlich funktionieren.
    Denn ein modaler Dialog sollte eigentlich nur alle übergeordneten Fenster sperren nicht aber untergeordnete.
     

  3. #3
    xanadoo xanadoo ist offline Mitglied Gold
    Registriert seit
    Mar 2005
    Beiträge
    119
    Leider handelt es sich beim HelpSystem um ein JFrame, welches ich, wenn irgendwie möglich, so übernemen möchte.

    Ich habe es nun mal zu Testzwecken mit zwei JDialogen versucht.
    Jedoch lässt sich der vom modalen Dialog aufgerufene nicht moddale Dialog mit der Maus nicht bedienen, sondern nur in den Vordergund holen.
    (Mit der Tastatur liese er sich zwar bedienen, jedoch ist dies natürlich nicht befriedigend).
     

  4. #4
    Tsunamii Tsunamii ist offline Mitglied Silber
    Registriert seit
    Jul 2009
    Beiträge
    75
    hm laut doku sollte es aber eigentlich gehen:
    Code java:
    1
    2
    3
    4
    
    JDialog modalDialog = new JDialog(...);
    ...
    modalDialog.setModalityType(ModalityType.APPLICATION_MODAL);
    ...
    siehe:
    http://download.oracle.com/javase/6/...odalityType%29
    http://download.oracle.com/javase/6/...LICATION_MODAL

    Zu beachten ist jedoch dass der JFrame von der Dialog-Klasse aus aufgerufen werden muss da er nur so als Kind-Element gezählt wird.
    Beim JDialog könnte man dies durch die Angabe im Konstruktor ganz einfach umgehen.
    Berichtigt mich bitte einer wenn ich falsch liege
     

  5. #5
    xanadoo xanadoo ist offline Mitglied Gold
    Registriert seit
    Mar 2005
    Beiträge
    119
    Hallo und Danke für deine Tipps.

    Ich habe das mit den Dialogen nun doch auch hin bekommen. Keine Ahnung, wieso es vorher nicht geklappt hat.
    Jedoch schaffe ich es im Moment nicht mit einem Frame...

    Hier mal ein einfaches Beispiel von einem Modalen Dialog, welcher über einen Button ein Frame aufruft, das Frame wiederum ruftüber einen Button eine einfache JOptionPane auf, um zu sehen ob das Frame richtig bedienbar ist:

    Code :
    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
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    
    import java.awt.event.*;
    import javax.swing.*;
     
    public class Test {
     
        public static void main(String[] args) {
            new Modal().show();
        }
        
    }
     
    /**
     * Der Modale Dialog
     */
    class Modal extends JDialog implements ActionListener {
     
        JButton jButton = null;
     
        public Modal() {
            super();
            initialize();
        }
     
        private void initialize() {
            this.setTitle("Modal");
            this.setContentPane(getButton());
            this.setModal(true);
            this.pack();
        }
     
        private JButton getButton() {
            if (jButton == null) {
                jButton = new JButton("Open NonModal Frame");
                jButton.addActionListener(this);
            }
     
            return jButton;
        }
     
        public void actionPerformed(ActionEvent e) {
            JFrame nonModal = new NonModal();
            nonModal.show();
        }
    }
     
    /**
     * Das Non-Modal Frame
     */
    class NonModal extends JFrame implements ActionListener {
     
        JButton jButton = null;
     
        public NonModal() {
            super();
            initialize();
        }
     
        private void initialize() {
            this.setTitle("Non-Modal");
            this.setContentPane(getButton());
            this.pack();
        }
     
        private JButton getButton() {
            if (jButton == null) {
                jButton = new JButton("Dummy");
                jButton.addActionListener(this);
            }
     
            return jButton;
        }
     
        public void actionPerformed(ActionEvent e) {
            JOptionPane.showMessageDialog(this, "Ping");
        }
     
    }

    Aber das Frame ist gesperrt, bis ich den Dialog geschlossen habe. Ich glaub ich steh auf dem Schlauch...
    Das war doch so wie du gemeint hast oder? Einem Frame kann ich ja keinen Parent mitgeben, oder sehe ich das falsch?

    Ich muss noch sagen, dass ich mit Java 5 arbeiten muss, da gibts ModalityType noch nicht, aber ich hoffe mal, dass es am Schluss nicht daran scheitern wird.

    Hat jemand einen Tipp?
     

  6. #6
    Tsunamii Tsunamii ist offline Mitglied Silber
    Registriert seit
    Jul 2009
    Beiträge
    75
    Ok hab mich doch mal hingesetzt und hab mal ein bisschen ausprobiert. Ich hab nun auch eine Lösung gefunden.

    Um die vom Dialog aufgerufenen Frames benutzen zu können benötigt man folgende Einstellung im Dialog:
    Code java:
    1
    
    this.setModalityType(ModalityType.DOCUMENT_MODAL);
    Dadurch wird zum einen der Frame geblockt der den Dialog aufruft, aber die Frames die vom Dialog aufgerufen werden, können benutzt werden.

    Hier aber noch 2 kleine Tipps für dich:
    Code java:
    1
    2
    3
    4
    5
    
    ...
    this.setVisible(true) /* this.show() ist deprecated und sollte nicht mehr verwendet werden */
    this.setLocationRelativeTo(null) /* zentriert die Anwendung auf dem Schirm */
    /* für Dialoge bietet sich statt null auch eine Refernz auf das aufrufende Frame an */
    ...
     

  7. #7
    xanadoo xanadoo ist offline Mitglied Gold
    Registriert seit
    Mar 2005
    Beiträge
    119
    Hallo

    Besten Dank für dein Tipp, aber
    Code :
    1
    
    this.setModalityType(ModalityType.DOCUMENT_MODAL);
    gibt es erst ab Java 6 dachte ich?
     

  8. #8
    Tsunamii Tsunamii ist offline Mitglied Silber
    Registriert seit
    Jul 2009
    Beiträge
    75
    Ups hab das mit dem Java 5 irgendwie verdrängt
    Wenn ich ne Lösung finde melde ich mich noch einmal, aber ich glaube es schaut schlecht aus, weil das setModal() wirklich alle anderen Fenster sperrt
    Geändert von Tsunamii (19.11.10 um 07:43 Uhr)
     

  9. #9
    xanadoo xanadoo ist offline Mitglied Gold
    Registriert seit
    Mar 2005
    Beiträge
    119
    Ja, da das Ding am Schluss auch auf Mac OS 10.4 laufen muss hänge ich auf Java 5 fest
    Ich befürchte inzwischen auch, dass ich das JFrame nun doch in einen JDialog umbuen muss.

    Trozdem danke für deine Tipps.
     

Ähnliche Themen

  1. Funktion in einem anderen Fenster aufrufen
    Von swunder im Forum Borland CBuilder und VCL
    Antworten: 0
    Letzter Beitrag: 02.01.08, 16:54
  2. Modales Fenster
    Von nero110 im Forum Java
    Antworten: 2
    Letzter Beitrag: 04.03.05, 12:08
  3. nicht modales Fenster
    Von Cycrow im Forum VisualStudio & MFC
    Antworten: 15
    Letzter Beitrag: 08.01.05, 10:43
  4. nicht modales Fenster erzeugen
    Von Cycrow im Forum Visual Basic 6.0
    Antworten: 1
    Letzter Beitrag: 30.12.04, 17:01
  5. Von einem Fenster eine Methode in einem anderen Aufrufen
    Von Benzol im Forum Javascript & Ajax
    Antworten: 2
    Letzter Beitrag: 08.11.04, 10:45