Dans mon application Swing, les utilisateurs peuvent cliquer sur un bouton pour ouvrir une boîte de dialogue et entrer des valeurs, puis cliquer sur "OK" pour fermer et retourner au programme principal, mais comment puis-je transmettre les valeurs entrer dans le programme principal sans les enregistrer dans un fichier en premier?Avec Java Swing App, comment obtenir les valeurs d'un panneau de dialogue dans l'application principale?
Répondre
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;
}
}
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.
N'importe quel code d'échantillon en ligne que je peux apprendre? – Frank
+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
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.
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.
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
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.
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);
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
}
}
- 1. Comment obtenir la valeur du 1er panneau et insérer dans le 2ème panneau dans Java Swing
- 2. positionnement avec Java Swing
- 3. Java, swing, JFrame et JPanel
- 4. Java/Swing: Problème avec l'écouteur de touche
- 5. Swing: affichage dynamique d'un panneau
- 6. Comment fonctionnent les événements dans Java Swing?
- 7. Panneau avec retour à la ligne et saut de ligne dans Java Swing
- 8. Problème avec la peinture dans Java App Swing en Java 1.6
- 9. Opérations sur Java Swing
- 10. Java Swing: JInternalFrame: besoin d'une fenêtre de dialogue
- 11. squelette app pour swing
- 12. Boîte de dialogue Ouvrir avec Java
- 13. Java obtenir thread créé en appelant principale
- 14. Comment obtenir toutes les valeurs enum dans Java?
- 15. comment obtenir les valeurs d'emplacement géographique du panneau Préférences de Lotus Sametime
- 16. comment obtenir les valeurs d'emplacement géographique du panneau de préférences d'IBM Sametime
- 17. Besoin de Java Swing HTML toile avec le soutien pour les contrôles de swing intégré
- 18. Scala Swing réactions dans un panneau étendu
- 19. Java (SWING) travaillant avec rotation
- 20. Comment obtenir les valeurs de Arraylist?
- 21. Prévention des doublons inutiles des boîtes de dialogue dans Java Swing
- 22. Boîte de dialogue Swing Paint Issue
- 23. GoogleEarth dans Java Swing
- 24. Positionnement en java swing
- 25. Java swing "enfants" windows
- 26. Java: Comment stylisez-vous les composants Swing?
- 27. Java Swing Table taille
- 28. Problème de rendu avec l'application Swing et les boîtes de dialogue modales
- 29. Java Swing Font Chooser
- 30. Java Swing. Windows en avant lancé à partir de JDialog
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. –
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