2012-04-11 21 views
1

Ich habe eine Java-Anwendung, deren grundlegende UI aus zwei JFrames besteht: einem Clientbereich und einem Tool Palette, die immer über dem Client-Bereich erscheinen sollte. Um dies zu erreichen, ist die Werkzeugpalette auf alwaysOnTop (true) eingestellt, was in allen Fällen sehr gut funktioniert, außer in Windows: Wenn ein modaler JDialog geöffnet wird, klicken Sie auf den Clientbereich und/oder die Palette (beides) blockiert) bewirkt, dass die Palette hinter den Client-Bereich fällt. Sobald der modale Dialog geschlossen ist, erscheint die Palette wieder, aber ihre "immer im Vordergrund" ist verloren gegangen: Klicken auf den Client-Bereich verdeckt die Palette.Java (nur Windows-Problem): alwaysOnTop JFrame fällt in die Z-Reihenfolge, wenn der modale Dialog geöffnet und blockiert wird JFrames werden geklickt

Hier ist eine minimal, einzelne Quelldatei Demonstration:

// FloatingPaletteExample.java 
// 4/11/2012 sorghumking 
// 
// Demo of a Windows-only issue that has me puzzled: When a modal dialog is 
// opened, and user clicks in blocked JFrames (sequence depends on ownership of 
// modal dialog: follow the instructions in modal dialog to see the problem 
// behavior), the floating tool palette loses its "always on top-ness". 

import javax.swing.*; 

import java.awt.BorderLayout; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.event.WindowAdapter; 
import java.awt.event.WindowEvent; 

public class FloatingPaletteExample { 
    public static void main(String [] args) { 
     final JFrame clientAreaJFrame = new JFrame("client JFrame"); 
     clientAreaJFrame.addWindowListener(new WindowAdapter() { 
      public void windowClosing(WindowEvent windowevent) { 
       clientAreaJFrame.dispose(); 
       System.exit(0); 
      } 
     }); 

     clientAreaJFrame.setSize(800, 600); 
     clientAreaJFrame.setVisible(true); 

     final JFrame floatingToolFrame = new JFrame("tool JFrame"); 
     final JCheckBox ownerCheckbox = new JCheckBox("Owned by tool frame (otherwise, null owner)"); 
     JButton popModalButton = new JButton("Open Modal Dialog"); 
     popModalButton.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent e) { 
       JFrame owner = ownerCheckbox.isSelected() ? floatingToolFrame : null; 
       JDialog modalDialog = new JDialog(owner, "Modal Dialog", true); 
       final String labelText = ownerCheckbox.isSelected() ? "Click anywhere in the client JFrame." : 
                     "Click the tool JFrame, then anywhere in the client JFrame"; 
       modalDialog.add(new JLabel(labelText)); 
       modalDialog.pack(); 
       modalDialog.setLocation(100, 100); 
       modalDialog.setVisible(true); 
      } 
     }); 
     floatingToolFrame.add(popModalButton, BorderLayout.NORTH); 
     floatingToolFrame.add(ownerCheckbox, BorderLayout.SOUTH); 

     floatingToolFrame.pack(); 
     floatingToolFrame.setLocationRelativeTo(clientAreaJFrame); 
     floatingToolFrame.setAlwaysOnTop(true); 
     floatingToolFrame.setVisible(true); 
    } 
} 

Ich versuchte floatingToolFrame.setFocusableWindowState (false), die the doc nach „der Standard-Mechanismus für eine Anwendung auf der AWT ein Fenster, das wird zu identifizieren ist als schwebende Palette oder Symbolleiste verwendet werden ", aber das Verhalten bleibt gleich.

Ich habe eine Problemumgehung gefunden: Rufen Sie FloatingToolFrame.setAlwaysOnTop (false) vor dem Aufrufen des modalen Dialogfelds auf, und rufen Sie FloatingToolFrame.setAlwaysOnTop (true) auf, nachdem es geschlossen wurde. Es erscheint jedoch lächerlich, diesen Umbruch zu verlangen, wenn ein modaler Dialog geöffnet wird. Ja, ich könnte JDialog ableiten und alle meine Dialoge aus dieser Unterklasse ableiten, um dies hinter den Kulissen zu tun, aber warum ist das notwendig?

Irgendwelche Ideen, wie Sie dies ohne die Problemumgehung lösen können? Ist meine Herangehensweise, eine immer auf der Oberseite liegende Palette zu kreieren, völlig fehlgeleitet? (Noch ein Hinweis: Dies scheint das Gegenteil des hier beschriebenen Problems zu sein: Java 6, JFrame stuck alwaysontop).

Alle Gedanken würden sehr geschätzt werden!

Antwort

0

Zu meiner absoluten Freude scheint dieses Problem in Java 7 SE gelöst zu sein! Das obige Beispiel verhält sich ordnungsgemäß gegen 7u4 Build b20 ausgeführt.