Dialog soll nicht in Vordergrund springen

  • Themenstarter Themenstarter Guest
  • Beginndatum Beginndatum
Status
Nicht offen für weitere Antworten.
G

Guest

Gast
Guten Morgen zusammen,

da ich selbst nicht mehr so weiter komme hoffe ich, dass ihr mir vielleicht helfen könnte.

Wir haben eine Anwendung die von Java aus Word (über eine C-Schnittstelle) mit Daten füllt, das Word-Dokument anschließend anzeigt und danach (in der Anwendung) einen Druckdialog anzeigt in dem der Anwender abschließend den Druckmodus (und noch einige andere Einstellungen) vorgeben kann bevor das Word-Dokument gedruckt wird.

So bald jetzt dann der Dialog angezeigt wird springt die Anzeige natürlich von Word auf den Dialog um und der Anwender muss (wenn er in Word vor dem Drucken noch Anpassungen machen will) selbst wieder zum Word-Dokumen "springen".

Erst den Dialog sichtbar machen und dann Word funktioniert leider nicht, da der Dialog (gewollt) modal ist und die Anwendung nach dem Einblenden dann ja "steht" bis der Dialog geschlossen wird. Auch Word in einem extra Thread sozusagen zeitversetzt starten geht nicht, da über unsere Schnittstelle ein Zugriff auf Word nur in einem Thread möglich ist.

Gibt es eine Möglichkeit, die ich noch nicht gefunden habe, dass man die Ansicht nach dem "Sichtbarmachen" des Dialoges wieder auf Word schalten kann (ohne, dass der Anwender eingreifen muss). Oder kann man dem Dialog (auch wenn er Modal ist) vielleicht irgendwie sagen, dass er nicht in den Vordergrund springen soll?

Vielen Dank schon im Voraus für eure Hilfe.

Gruß
Stefan
 
hmm, ich denke nicht, dass die Eigenschaft modal mit deinem Wunsch vereinbar ist,
und modal läßt sich anscheinend auch nicht nachbauen, zumindest nicht mit einfachen Mitteln:

Bildet eine Java-Applikation zwei Fenster, so kann der Anwender zwischen beiden Fenstern hin- und herschalten. Es ist nicht möglich, ein Fenster aufzubauen und dort Eingaben zu erzwingen, während das andere Fenster gesperrt ist. Dafür gibt es in Java spezielle Fenster, die Dialoge.
http://www.galileodesign.de/openbook/javainsel5/javainsel15_003.htm


da bleibt wahrscheinlich nur, keinen Dialog sondern zwei gleichberechtigte JFrames zu verwenden,
und im Hauptfenster alle Optionen manuell zu sperren, bis das eigene Dialog-JFrame geschlossen ist
 
Modal: andere Anwendungen werden blockiert.
Du sagst: Der Dialog ist gewollt modal, soll andere Anwendungen aber nicht blockieren.
Wie passt das zusammen?
 
Wildcard hat gesagt.:
Modal: andere Anwendungen werden blockiert.
Du sagst: Der Dialog ist gewollt modal, soll andere Anwendungen aber nicht blockieren.
Wie passt das zusammen?

Der Dialog soll die Java-Anwendung blockieren (deshalb ist er ja modal). Die Eigenschaften was Modal für die Anwendung angeht sind ja gut so und sollen auch so bleiben.

Problem hier ist nur, dass sich beim "Sichtbarwerden" des Dialoges die Java-Anwendung wieder in den Vordergrund schaltet und Word damit verdeckt und der Anwender durch z. B. klicken in der Taskleiste oder Umschalten per Alt-Tab wieder zu Word wechseln muss.

Für mich ist das kein riesiges Problem aber die Anwender wollen es so also suche ich 😀

Also wie gesagt es geht mir nur drum, dass sich beim Dialog#setVisible(true) die Java-Anwendung nicht in den Vordergrund schaltet sondern Word bleibt und der Dialog in der Anwendung trotzdem "normal", modal auf geht, sprich der Anwender (wenn er in Word fertig ist) zur Anwendung wechselt und dort nichts machen kann bis er den Dialog geschlossen hat.
 
Was du beschreibst ist eher Aufgabe des Window Managers des Betriebssystems. Denke nicht, dass du da eine Chance hast.
 
Wildcard hat gesagt.:
Was du beschreibst ist eher Aufgabe des Window Managers des Betriebssystems. Denke nicht, dass du da eine Chance hast.

Genau die Vermutung habe ich auch irgendwie :cry:

Hatte nur gehoft, dass man da von Java aus vielleicht irgendwie (zumindest ein kleines bisschen 😎 ) Einfluß drauf nehmen kann und dem Window / Dialog dann vielleicht mit geben kann, dass er sich nicht in den Vordergrund schalten soll.
 
wenn Word eine andere Anwendung ist, dann willst du vielleicht das ganze Java-Programm zurückstellen?
das ist ja eine andere Aufgabe

folgendes funktioniert bei mir, JFrame ist hinter dem Eclipse-Fenster,
ob mit Dialog oder nicht

Code:
public class TestGUI
    extends JFrame
{

    public TestGUI()
        throws Exception
    {

        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setSize(500, 400);
        setVisible(true);

        toBack();
        JDialog d = new JDialog(this, true);
        d.setVisible(true);
    }


    public static void main(String[] args)
        throws Exception
    {
        new TestGUI();
    }
}


> Erst den Dialog sichtbar machen und dann Word funktioniert leider nicht, da der Dialog (gewollt) modal ist und die Anwendung nach dem Einblenden dann ja "steht" bis der Dialog geschlossen wird.

sowas ist ja auch nicht in Stein gemeißelt,
starte vor dem Dialog einen Thread, der x ms später das Word-Programm aufruft,
je nachdem was dieses Word in deinem Programm überhaupt ist
 
SlaterB hat gesagt.:
wenn Word eine andere Anwendung ist, dann willst du vielleicht das ganze Java-Programm zurückstellen?
das ist ja eine andere Aufgabe

folgendes funktioniert bei mir, JFrame ist hinter dem Eclipse-Fenster,
ob mit Dialog oder nicht

Code:
public class TestGUI
    extends JFrame
{

    public TestGUI()
        throws Exception
    {

        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setSize(500, 400);
        setVisible(true);

        toBack();
        JDialog d = new JDialog(this, true);
        d.setVisible(true);
    }


    public static void main(String[] args)
        throws Exception
    {
        new TestGUI();
    }
}


> Erst den Dialog sichtbar machen und dann Word funktioniert leider nicht, da der Dialog (gewollt) modal ist und die Anwendung nach dem Einblenden dann ja "steht" bis der Dialog geschlossen wird.

sowas ist ja auch nicht in Stein gemeißelt,
starte vor dem Dialog einen Thread, der x ms später das Word-Programm aufruft,
je nachdem was dieses Word in deinem Programm überhaupt ist

Das mit toBack() hab ich gerade nur kurz ausprobiert, hatte jedoch leider nicht den Effekt den ich mir vorgestellt hatte, werde da aber mal noch n bisschen mehr ausprobieren. Danke für den Hinweis schon mal.

Was Word angeht ist das das ferngesteuerte MS Word, das bei uns von Java aus (über ein entsprechendes Objekt) über eine C-Schnittstelle (dll) ferngesteuert wird. Ein eigener Thread ist hier nicht möglich da die Schnittstelle Zugriffe auf Word aus verschiedenen Threads nicht erlaubt und Word komplett in einem eigenen Thread laufen lassen ist anwendungsbedingt nicht möglich.

So dann werd ich mal noch ein wenig mit toBack() experimentieren, vielleicht krieg ich es ja irgendwie hin 🙂
 
> Ein eigener Thread ist hier nicht möglich da die Schnittstelle Zugriffe auf Word aus verschiedenen Threads nicht erlaubt

na aber dann wirst du doch sicherlich andersrum den Dialog in einem anderen Thread starten können,
dann ist zwar die GUI gesperrt, aber durchaus denkbar, dass der Word-Thread noch sein Word-Fenster öffnen kann,
danach kann der Word-Thread ja von mir aus auf das Ende des Dialog warten 😉

sind in der Richtung jetzt aber teilweise abenteuerliche Vorschläge,
du scheinst ungefähr zu wissen was du tust
 
SlaterB hat gesagt.:
> Ein eigener Thread ist hier nicht möglich da die Schnittstelle Zugriffe auf Word aus verschiedenen Threads nicht erlaubt

na aber dann wirst du doch sicherlich andersrum den Dialog in einem anderen Thread starten können,
dann ist zwar die GUI gesperrt, aber durchaus denkbar, dass der Word-Thread noch sein Word-Fenster öffnen kann,
danach kann der Word-Thread ja von mir aus auf das Ende des Dialog warten 😉

sind in der Richtung jetzt aber teilweise abenteuerliche Vorschläge,
du scheinst ungefähr zu wissen was du tust

Danke 😳 Allerdings bin ich mir nicht immer so sicher zu wissen was ich tue. :lol: Aber im Ernst bevor ich da in der Anwendung (die an sich so gut läuft) anfange mit Threads zu experimentieren, nur weil die Anwendung sich beim "Sichtbarschalten" des Dialoges in den Vordergrund schiebt, muss der Anwender den einen Klick halt machen.

Ich habe allerdings gerade beim Testen festgestellt, dass das Verhalte auch nicht immer so war (hatte mich schon gewundert warum sich früher keiner beschwerte). Wir hatten bis vor kurzem Java 1.4 im Einsatz und haben jetzt auf Java 6 umgestellt. Mit 1.4 bliebt die Anwendung inkl. Dialog im Hintergrund. Das Verhalten kam also soz. mit Java 6 (oder 5 das kann ich hier leider nicht testen, habe nur 1.4 und 6).

Jetzt hab ich den Grundgedanken, dass es ja irgendwie gehen muss wenn es vorher anders war (hoffe ich :autsch: ) nur kriege ich es irgendwie nicht hin.

Das mit toBack() funktioniert wenn ich so ein kleines Beispiel mache wie du problemlos für unsere Anwendung leider nicht. Die ist so aufgebaut, dass nach dem Start ein Applet auf geht (hat leider kein toBack() da es nicht von Window erbt). Im Applet sind dann verschiedene Fachanwendungen zur Auswahl die gestartet werden können, diese werden dann in Frames angezeit. Ich kann jetzt zwar den Frame der aktuellen Fachanwendung ermitteln und bei diesem toBack() aufrufen (habe dann zur Sicherheit auch beim Dialog nochmal toBack() aufgerufen) leider jedoch ohne den gewünschten Erfolg.

Edit: Der Gast war übrigens ich :bae:

Habe das Beispiel auch mal etwas abgewandelt um nochmal n bisschen mit toBack() zu testen:

Code:
public class Test {

   /**
    * @param args
    */
   public static void main(String[] args) {
      JFrame f = new JFrame("Test");
      f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      f.setSize(200, 100);
      f.add(new JButton("Button"));
      f.setVisible(true);
      
      try {
         Thread.sleep(2000);
      } catch (InterruptedException e) {
         e.printStackTrace();
      }
      
      f.toBack();
      
      try {
         Thread.sleep(2000);
      } catch (InterruptedException e) {
         e.printStackTrace();
      }
      
      JDialog d = new JDialog(f, true);
      d.setVisible(true);
   }
}

Die Pausen hab ich rein gemacht damit ich die Abfolgen besser sehe. Effekt des Codes ist aber, dass der Frame bei toBack() zwar in den Hintergrund wechselt, beim Erscheinen des Dialoges jedoch wieder im Vordergrund ist (getestet mit jdk1.6.0_06). :bahnhof:
 
Ich habe allerdings gerade beim Testen festgestellt, dass das Verhalte auch nicht immer so war (hatte mich schon gewundert warum sich früher keiner beschwerte). Wir hatten bis vor kurzem Java 1.4 im Einsatz und haben jetzt auf Java 6 umgestellt. Mit 1.4 bliebt die Anwendung inkl. Dialog im Hintergrund. Das Verhalten kam also soz. mit Java 6 (oder 5 das kann ich hier leider nicht testen, habe nur 1.4 und 6).
In 1.4 gab es nur Modal oder nicht, mittlerweile gibt es Modality Types
 
Wildcard hat gesagt.:
Ich habe allerdings gerade beim Testen festgestellt, dass das Verhalte auch nicht immer so war (hatte mich schon gewundert warum sich früher keiner beschwerte). Wir hatten bis vor kurzem Java 1.4 im Einsatz und haben jetzt auf Java 6 umgestellt. Mit 1.4 bliebt die Anwendung inkl. Dialog im Hintergrund. Das Verhalten kam also soz. mit Java 6 (oder 5 das kann ich hier leider nicht testen, habe nur 1.4 und 6).
In 1.4 gab es nur Modal oder nicht, mittlerweile gibt es Modality Types

Ich weiß und ich habe alle (insgesamt 7) möglichen Modi ausprobiert und keine führt zum gewünschten Ergebnis bei ...
Code:
      // Natürlich habe ich die einzeln getestet und nicht alle hier so nacheinander hin geschrieben :)
      JDialog d = new JDialog(f, true);
      d.setModalityType(ModalityType.APPLICATION_MODAL);
      d.setModalityType(ModalityType.DOCUMENT_MODAL);
      d.setModalityType(ModalityType.TOOLKIT_MODAL);
      d.setModalExclusionType(ModalExclusionType.APPLICATION_EXCLUDE);
      d.setModalExclusionType(ModalExclusionType.NO_EXCLUDE);
      d.setModalExclusionType(ModalExclusionType.TOOLKIT_EXCLUDE);
      d.setVisible(true);
kommt die Anwendung beim Erscheinen des Dialoges trotzdem nach vorne. Lediglich bei
Code:
      JDialog d = new JDialog(f, true);
      d.setModalityType(ModalityType.MODELESS);
      d.setVisible(true);
kommt die Anwendung nicht nach vorne, dafür ist der Dialog aber auch nicht mehr wirklich modal :roll:

Muss ich vielleicht ne Kombination aus JDialog#setModalExclusionType und JDialog#setModalityType nehmen, dass es funktioniert?

Edit: So weit ich die Beschreibungen auch verstehe beziehen sich diese Modi ja ohnehin auf die Java-Anwendung und welche "Teile" davon der Dialog dann sperren soll. Aber das hat nicht mit in den Vordergrund bringen zu tun. An sich wäre da toBack() schon die richtige Richtung denke ich aber ein toBack() beim Frame hilft nicht und beim Dialog vor setVisible zieht es nicht und nach setVisible komme ich nicht hin weil der Dialog ja modal ist. *heul*
 
Wenn ich der Meinung gewesen währe, dass ModalityTypes die Antwort auf dein Problem sind, hätte ich dir das mitgeteilt.
Ich wollte damit lediglich zum Ausdruck bringen, dass sich das Modal-Konzept seit 1.4 geändert hat.
 
Wildcard hat gesagt.:
Wenn ich der Meinung gewesen währe, dass ModalityTypes die Antwort auf dein Problem sind, hätte ich dir das mitgeteilt.
Ich wollte damit lediglich zum Ausdruck bringen, dass sich das Modal-Konzept seit 1.4 geändert hat.

Sry steh heut n bisschen auf der Leitung sitze schon ewig an dem für unsere Anwender "neuem" Verhalten. Hätte jetzt noch ne Notlösung aber ganz zufrieden bin ich damit auch nicht. :meld:

Code:
public class Test {

   /**
    * @param args
    */
   public static void main(String[] args) {
      JFrame f = new JFrame("Test");
      f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      f.setSize(200, 100);
      JButton b = new JButton("Button");
      b.addActionListener(new ActionListener() {
         public void actionPerformed(ActionEvent e) {
            System.out.println("Geklickt");
         }
      });
      f.add(b);
      f.setVisible(true);
      
      try {
         Thread.sleep(500);
      } catch (InterruptedException e) {
         e.printStackTrace();
      }
      
      f.toBack();
      
      try {
         Thread.sleep(1000);
      } catch (InterruptedException e) {
         e.printStackTrace();
      }
      
      final JDialog d = new JDialog(f, true);
      
      Thread t = new Thread() {
         public void run() {
            try {
               Thread.sleep(100);
            } catch (InterruptedException e) {
               e.printStackTrace();
            }
            d.toBack();
         }
      };
      t.start();
      
      d.setVisible(true);
   }
}

Dadurch kommt nur ein kurzes Flackern und die Anwendung ist wieder im Hintergrund. Werde aber auf jeden Fall trotzdem weiter suchen, irgendwas muss es da doch geben. :###
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben