All Classes Namespaces Files Functions Variables
ModalController.java
Go to the documentation of this file.
1 package fi.jyu.mit.fxgui;
2 
3 import java.io.IOException;
4 import java.net.URL;
5 
6 import javafx.fxml.FXML;
7 import javafx.fxml.FXMLLoader;
8 import javafx.scene.Node;
9 import javafx.scene.Parent;
10 import javafx.scene.Scene;
11 import javafx.stage.Modality;
12 import javafx.stage.Stage;
13 
14 /**
15  * Modaalisen dialogin näyttäminen
16  *
17  * @author vesal
18  * @version 2.1.2016
19  * @param <TYPE> minkä tyyppinen tulos palautetaan dialogista.
20  */
21 public class ModalController<TYPE> implements ModalControllerInterface<TYPE> {
22 
23  /**
24  * Funktionaalinen rajapinta takaisinkutsulle luokan alustamiseksi
25  * @author vesal
26  * @version 18.3.2016
27  *
28  * @param <TYPE> mikä on perusluokan tyyppi
29  * @param <CONTROLLERTYPE> mikä on dialogin kontrolleriluokan tyyppi
30  */
31  public interface ModalInitializeInterface<TYPE, CONTROLLERTYPE extends ModalControllerInterface<TYPE>> {
32  /**
33  * @param ctrl kontrolleri, jonne jotakin asetetaan
34  */
35  public void initialize(CONTROLLERTYPE ctrl);
36  }
37 
38 
39  class MyGenericClass<T> {
40  private final Class<T> clazz;
41  public MyGenericClass(Class<T> clazz) {
42  this.clazz = clazz;
43  }
44  public Class<T> getGenericClass() {
45  return clazz;
46  }
47  }
48 
49 
50  private Stage stage;
51 
52  @FXML private void handleDefaultOK() {
53  stage.close();
54  }
55 
56 
57  @FXML private void handleDefaultCancel() {
58  stage.close();
59  }
60 
61 
62  /**
63  * @return palautetaan dialogin tulos
64  */
65  @Override
66  public TYPE getResult() {
67  return null;
68  }
69 
70 
71  /**
72  * Asetetaan oletusarvo
73  * @param oletus mitä näyteteään oletuksena
74  */
75  @Override
76  public void setDefault(TYPE oletus) {
77  //
78  }
79 
80 
81  /**
82  * Mitä tehdään kun dialogi on näytetty
83  */
84  @Override
85  public void handleShown() {
86  //
87  }
88 
89 
90  /**
91  * Palauttaa nodea vastaavan stagen
92  * @param n minkä stagea etsitään
93  * @return nodea vstaava stage
94  */
95  public static Stage getStage(Node n) {
96  return ((Stage)n.getScene().getWindow());
97  }
98 
99 
100  /**
101  * Sulkee stagen johon node kuuluu
102  * @param n minkä stagea etsitään
103  */
104  public static void closeStage(Node n) {
105  getStage(n).close();
106  }
107 
108 
109  /**
110  * Luodaan dialogi ja palautetaan siihen täytetty data tai null
111  * @param url osoite, josta .fxml tiedosto löytyy
112  * @param title Otsikko joka näytetään
113  * @param modalityStage mille ollaan modaalisia, null = sovellukselle
114  * @param oletus mitä dataa näytetään oletuksena
115  * @return null jos painetaan Cancel, muuten kirjoitettu nimi
116  */
117  public static <TYPE> TYPE showModal(URL url, String title, Stage modalityStage, TYPE oletus) {
118  return showModal(url, title, modalityStage, oletus, null);
119  }
120 
121 
122  /**
123  * Luodaan dialogi ja palautetaan siihen täytetty data tai null
124  * @param url osoite, josta .fxml tiedosto löytyy
125  * @param title Otsikko joka näytetään
126  * @param modalityStage mille ollaan modaalisia, null = sovellukselle
127  * @param oletus mitä dataa näytetään oletuksena
128  * @param initializeCallback mitä kutsutaan kun dialogi on luotu
129  * @return null jos painetaan Cancel, muuten dialogin data
130  */
131  public static <TYPE, CONTROLLERTYPE extends ModalControllerInterface<TYPE>>
132  TYPE showModal(URL url, String title, Stage modalityStage, TYPE oletus,
133  ModalInitializeInterface<TYPE, CONTROLLERTYPE> initializeCallback) {
134  try {
135  FXMLLoader ldr = new FXMLLoader(url);
136  Parent root = ldr.load();
137  @SuppressWarnings("unchecked")
138  final CONTROLLERTYPE dialogCtrl = (CONTROLLERTYPE)ldr.getController();
139  Stage stage = new Stage();
140  if ( dialogCtrl instanceof ModalController ) {
141  ((ModalController<TYPE>)dialogCtrl).stage = stage;
142  }
143 
144  stage.setScene(new Scene(root));
145  stage.setTitle(title);
146  if ( modalityStage != null ) {
147  stage.initModality(Modality.WINDOW_MODAL);
148  stage.initOwner(modalityStage);
149  } else
150  stage.initModality(Modality.APPLICATION_MODAL);
151 
152  if ( dialogCtrl != null ) {
153  dialogCtrl.setDefault(oletus);
154  stage.setOnShown((e)-> {
155  // dialogCtrl.vastaus.requestFocus();
156  //dialogCtrl.vastaus.selectAll();
157  dialogCtrl.handleShown();
158  });
159  if ( initializeCallback != null ) initializeCallback.initialize(dialogCtrl);
160  stage.showAndWait();
161  return dialogCtrl.getResult();
162  }
163  stage.showAndWait();
164  return null;
165 
166  } catch (IOException e) {
167  System.err.println(e.toString());
168  return null;
169  }
170  }
171 
172 
173  /**
174  * Luodaan modeless dialogi ja palautetaan sen käsittelijä
175  * @param url osoite, josta .fxml tiedosto löytyy
176  * @param title Otsikko joka näytetään
177  * @param oletus mitä dataa näytetään oletuksena
178  * @return null jos painetaan Cancel, muuten kirjoitettu nimi
179  */
180  public static <TYPE, CONTROLLERTYPE extends ModalControllerInterface<TYPE>> CONTROLLERTYPE showModeless(URL url, String title, TYPE oletus) {
181  Stage stage = new Stage();
182  try {
183  FXMLLoader ldr = new FXMLLoader(url);
184  Parent root = ldr.load();
185  @SuppressWarnings("unchecked")
186  final CONTROLLERTYPE dialogCtrl = (CONTROLLERTYPE)ldr.getController();
187  stage.setScene(new Scene(root));
188  stage.setTitle(title);
189  if ( dialogCtrl != null ) {
190  dialogCtrl.setDefault(oletus);
191  stage.setOnShown((e)-> {
192  // dialogCtrl.vastaus.requestFocus();
193  //dialogCtrl.vastaus.selectAll();
194  dialogCtrl.handleShown();
195  });
196  stage.show();
197  return dialogCtrl;
198  }
199  stage.show();
200  return null;
201 
202  } catch (IOException e) {
203  System.err.println(e.toString());
204  return null;
205  }
206  }
207 }