2010-04-03 3 views

Répondre

-1

Peut être que vous voulez essayer cette solution:

classe MyDialog {

private static String[] returnValues = new String[10] 
private static MyDialog dialog; 

private MyDialog() { 
    initDialog() 
} 

private void closeDialog() 
{ 
    dispose(); 
} 

private initDialog() 
{ 

//.... 
btnOk = new JButton("OK"); 
    jTextField1 = new JTextField(); 
    ... 
    jTextField10 = new JTextField(); 
    ... 
    ActionListener btnOK_click = new ActionListener() { 

     public void actionPerformed(ActionEvent e) 
     { 
      returnValues[0] = jTextField1.getText(); 
      ... 
      returnValues[9] = jTextField10.getText(); 
      closeDialog(); 
     } 
    } 
    btnOk.addActionListener(btnOk_click); 
} 

public static String[] showMyDialog() { 
    dialog = new MyDialog(); 
    dialog.setVisible(true); 
    return returnValues; 
} 

}

+2

Je suis désolé ... mais c'est TRÈS mal. Si vous pouvez créer une classe "MyDialog" personnalisée, pourquoi ne pas simplement créer getter et setter pour votre classe de domaine? Le retour d'un tableau de chaînes est une abomination. –

+2

Je complète entièrement la remarque d'eugener. En outre, l'utilisation de statique ici est absolument terrible. Il existe essentiellement 2 solutions valides (que je connais) à ce problème: MVC ou Event Bus. Toute autre solution serait généralement une odeur de code. – jfpoilpret

2

Il y a deux choses que vous pourriez faire:

  • Vous pouvez créer un observateur/relation Observable entre votre application et la boîte de dialogue, et de faire la boîte de dialogue publier un événement lorsque la boîte de dialogue ferme avec les valeurs de la un événement.
  • Vous pouvez gérer une boîte de dialogue pour votre boîte de dialogue dans votre application et lorsque vous appelez setVisible(false) dans une boîte de dialogue, vous pouvez interroger la boîte de dialogue pour ses données.
+0

N'importe quel code d'échantillon en ligne que je peux apprendre? – Frank

+0

+1 @Frank: Voici une discussion sur un délégué 'Observable', utile lors de l'extension de' JDialog'. http://faculty.yu.edu.jo/Izzat/DownloadHandler.ashx?pg=4f8b39f8-9f32-4973-9ed4-10b79703fe59§ion=58862511-0eb9-40fb-b3d1-9387d4be642b&file=Observer.pdf – trashgod

1

L'interface utilisateur doit généralement être superposée à l'application sous-jacente. (OMI, l'interface utilisateur devrait elle-même être divisée en couches, mais une autre diatribe.) Passez une partie pertinente de votre demande à la création de votre interface utilisateur. Lorsque vous êtes prêt pour les valeurs à passer de l'interface utilisateur à l'application (ce qui peut être un bouton OK dans une boîte de dialogue multi-pages, jusqu'à chaque frappe), placez les données dans le composant d'application.

0

Je suggérerais la conception MVC (Model-view-controller). Donc, la boîte de dialogue sera vous voir et éventuellement le contrôleur. Mais vous devez avoir une classe de domaine qui sera votre modèle. Par exemple, si la boîte de dialogue est créée pour éditer des données personnelles, vous pouvez avoir une classe appelée Person qui va contenir les données. La boîte de dialogue doit être conçue de manière à pouvoir définir et obtenir une personne à partir de celle-ci.

+0

J'ai pensé à un De cette façon, utilisez les champs statiques de la classe principale pour contenir les valeurs, de sorte que les valeurs sont définies dans la boîte de dialogue, quand elle est fermée, je peux accéder aux valeurs de ces champs dans la classe principale. – Frank

1

Plutôt que d'utiliser seulement les pauvres API Java Observable/Observer, je préfère vous conseille de jeter un oeil à un « événement Bus », qui devrait être particulièrement adapté à votre situation.

Deux implémentations de bus événement:

  • EventBus très générale bus d'événements, peut être utilisé dans toutes les situations
  • GUTS Event Bus spécifique à la bibliothèque d'injection de dépendance Guice

L'un d'eux devrait aider vous avec votre problème actuel.

1

suffit de définir une interface avec une seule méthode (comme: « returnToCaller (returntype rt) ") dans votre classe de dialogue.

Le constructeur de la boîte de dialogue prend une instance de cette interface en entrée et l'utilise pour renvoyer les résultats à la sortie/ok. Le module principal (fenêtre ou autre) instancie simplement le dialogue et rend ainsi l'utilisation de l'interface, définissant la méthode de retour, un peu comme un délégué (C#).

L'appel étant alors:

MyDialog md = new MyDialog(new MyDialog.ReturnToCaller() { 
     public void returnToCaller(ReturnValues rv) { 
         // Handle the values here 
     } 
    }); 
    md.setModal(true); 
    md.setVisible(true); 
0

La classe implémentant votre panneau de dialogue doit avoir un lien vers votre programme principal, et votre programme principal doit fournir une méthode avec des paramètres qui seront les valeurs à transmettre.

Ensuite, votre classe de panneau de dialogue écoute le bouton Ok, et sur le bouton clic, il récupère les valeurs et les utilise avec la méthode susmentionnée.

class Main { 
    //... 
    private Dialog myDialog ; 

    public Main(){ 
     //... 
     myDialog = new Dialog(this); 
     //... 
    } 

    //... 

    public void onDialogOk(String valueA, int valueB) 
    { 
     //... 
    } 
} 

class Dialog implement ActionListener{ 
    //... 
    private Main myMain ; 

    public setMain(Main main){ 
     myMain = main; 
    } 

    public Dialog(Main main){ 
     //... 
     setMain(main) ; 

     //... 
     JButton ok = new JButton("ok") ; 
     ok.addActionListener(this); 
    } 

    public void actionPerformed(ActionEvent e) { 
     // retrieve form values 
     String valueA = ... ; 
     int valueB = Integer.parse(...); 
     myMain.onDialogOK(valueA, valueB) ; //DONE 
    } 
} 
Questions connexes