2013-05-16 1 views
1

J'ai une application Java Swing et un JInternalFrame ..Modal JInternalFrame qui renvoie les données à l'appelant

Dans le JInternalFrame j'ai quelques champs d'entrée, et quand je presse un raccourci clavier que je veux ce qui suit pour se produire:

  1. Toute l'exécution dans le JInternalFrame actuel est suspendue et aucun des champs de saisie ne peut recevoir le focus.
  2. Une nouvelle trame (inputFrame) s'ouvrira dans une sorte de mode modal et offrira de l'aide à l'utilisateur pour remplir la bonne valeur. (Les données sont extraites d'un EJB et filtrées selon le choix des utilisateurs)
  3. Lorsque l'utilisateur clique sur OK, inputFrame est fermé et les données sont renvoyées à mainFrame. MainFrame accepte les données et continue son traitement.

Si possible, je voudrais que inputFrame soit un JInternalFrame, mais ce n'est pas un problème majeur.

Est-ce que quelqu'un connaît un moyen d'y parvenir?

+0

[JDialog] (http://docs.oracle.com/javase/tutorial/uiswing/components/dialog.html#api) ou JOptionPane personnalisé. –

Répondre

0

Je trouve la réponse dans le code source pour JOptionPane là, je copiais deux méthodes statiques createInternalFrame et startModal (avec seulement quelques petits changements) et créé ma propre classe ci-dessous:

public class ModalInternalPanel { 

    public static Object showInternalDialog(Component parentComponent, Container container, HasReturnValue hasReturnValue, String title) { 
     JInternalFrame frame = createInternalFrame(parentComponent, title, container); 
     startModal(frame); 
     if (hasReturnValue!=null) return hasReturnValue.getReturnValue(); else return null; 
    } 


    public static JInternalFrame createInternalFrame(Component parentComponent, String title, Container container) throws RuntimeException { 
     // Try to find a JDesktopPane. 
     JLayeredPane toUse = JOptionPane.getDesktopPaneForComponent(parentComponent); 
     // If we don't have a JDesktopPane, we try to find a JLayeredPane. 
     if (toUse == null) toUse = JLayeredPane.getLayeredPaneAbove(parentComponent); 
     // If this still fails, we throw a RuntimeException. 
     if (toUse == null) throw new RuntimeException ("parentComponent does not have a valid parent"); 

     JInternalFrame frame = new JInternalFrame(title); 


     frame.setContentPane(container); 
     frame.setClosable(true); 

     toUse.add(frame); 
     frame.setLayer(JLayeredPane.MODAL_LAYER); 

     frame.pack(); 
     frame.setVisible(true); 

     return frame; 
    } 



    private static void startModal(JInternalFrame f) { 
     // We need to add an additional glasspane-like component directly 
     // below the frame, which intercepts all mouse events that are not 
     // directed at the frame itself. 
     JPanel modalInterceptor = new JPanel(); 
     modalInterceptor.setOpaque(false); 
     JLayeredPane lp = JLayeredPane.getLayeredPaneAbove(f); 
     lp.setLayer(modalInterceptor, JLayeredPane.MODAL_LAYER.intValue()); 
     modalInterceptor.setBounds(0, 0, lp.getWidth(), lp.getHeight()); 
     modalInterceptor.addMouseListener(new MouseAdapter(){}); 
     modalInterceptor.addMouseMotionListener(new MouseMotionAdapter(){}); 
     lp.add(modalInterceptor); 
     f.toFront(); 

     // We need to explicitly dispatch events when we are blocking the event 
     // dispatch thread. 
     EventQueue queue = Toolkit.getDefaultToolkit().getSystemEventQueue(); 
     try { 
      while (! f.isClosed())  { 
       if (EventQueue.isDispatchThread()) { 
        // The getNextEventMethod() issues wait() when no 
        // event is available, so we don't need do explicitly wait(). 
        AWTEvent ev = queue.getNextEvent(); 
        // This mimics EventQueue.dispatchEvent(). We can't use 
        // EventQueue.dispatchEvent() directly, because it is 
        // protected, unfortunately. 
        if (ev instanceof ActiveEvent) ((ActiveEvent) ev).dispatch(); 
        else if (ev.getSource() instanceof Component) ((Component) ev.getSource()).dispatchEvent(ev); 
        else if (ev.getSource() instanceof MenuComponent) ((MenuComponent) ev.getSource()).dispatchEvent(ev); 
        // Other events are ignored as per spec in 
        // EventQueue.dispatchEvent 
       } else { 
        // Give other threads a chance to become active. 
        Thread.yield(); 
       } 
      } 
     } 
     catch (InterruptedException ex) { 
      // If we get interrupted, then leave the modal state. 
     } 
     finally { 
      // Clean up the modal interceptor. 
      lp.remove(modalInterceptor); 

      // Remove the internal frame from its parent, so it is no longer 
      // lurking around and clogging memory. 
      Container parent = f.getParent(); 
      if (parent != null) parent.remove(f); 
     } 
    } 
} 
2

Regardez le How to Use Internal Frames et recherchez showInternal. Là réside la réponse.

+0

Je me souviens maintenant. ;) –

+0

Pas exactement la fonction dont j'avais besoin, mais elle m'a orienté dans la bonne direction. Merci! – Ulf

Questions connexes