2014-10-13 7 views

risposta

13

questo post del blog spiega tutto:

http://fxexperience.com/2014/09/announcing-controlsfx-8-20-7/

Questo rilascio è stato birra dal 8.0.6 è stato rilasciato il 29 maggio - in modo sostanzialmente quattro mesi. Questo non è tipico per noi (di solito abbiamo versioni molto più veloci), ma Eugene e io eravamo entrambi distratti da un'importante impresa: elevare l'API e l'implementazione delle finestre di dialogo ControlsFX nella prossima versione di JavaFX (apparirà in JavaFX 8u40 , anche se l'API è molto diversa da quella che vedi in ControlsFX 8.0.6). Il risultato finale è che abbiamo iterato attraverso un mucchio di lavoro di progettazione dell'API (vedere RT-12643) e nessuno di questi ha beneficiato di ControlsFX, ma ha occupato tutto il nostro tempo.

Una volta che le finestre di dialogo JavaFX 8u40 erano complete dell'API (che era solo a metà agosto), abbiamo sviluppato un piano su come procedere con le finestre di dialogo ControlsFX. In sostanza, non ritenevamo opportuno mantenere un'API di dialogo in ControlsFX che fosse così divergente rispetto a quanto verrà fornito in JavaFX 8u40. Pertanto, il piano che abbiamo sviluppato è stato deprecare la vecchia API ControlsFX, inserire l'API delle finestre di dialogo JavaFX in un nuovo progetto denominato openjfx-dialogs e ricreare le funzionalità aggiuntive che ControlsFX include (ma mancano di JavaFX) utilizzando la nuova API (questo include finestre di dialogo come progresso, scelta dei caratteri, comando, accesso, ecc.).

+3

Grazie per il link. Davvero una brutta decisione di controlsfx. La nuova libreria è GPL e non può essere utilizzata nella maggior parte delle applicazioni. Queste due API hanno quindi un focus diverso e la vecchia API non dovrebbe essere deprecata ... –

+1

Secondo https://bitbucket.org/controlsfx/openjfx-dialogs la licenza è GPL più Classpath-Exception che significa che può essere utilizzato in applicazioni commerciali. (disclaimer: IANAL) – rli

+0

@ArtjomB. Sì, ma il tuo commento è durato oltre 3 mesi prima della modifica per renderlo una risposta valida. Ah bene, ordinato ora, la risposta va bene che è l'obiettivo finale – James

11

Ora con java 8 update 60, anche l'utilizzo della versione precedente non controllata di controlsfx non funziona. Quindi, la soluzione sta usando l'API di dialogo nativa da javafx inclusa in java 8 update 40 (non ha bisogno di librerie di terze parti). Non sono semplici e pieni di funzionalità come i controlli fx. Ma per la codifica più veloce, è possibile creare una classe wrapper, come questo che ho fatto:

package br.atualy.devolucaodevenda.util; 

import javafx.scene.control.*; 
import javafx.scene.control.Label; 
import javafx.scene.control.TextArea; 
import javafx.scene.input.KeyCode; 
import javafx.scene.input.KeyEvent; 
import javafx.scene.layout.GridPane; 
import javafx.scene.layout.Priority; 
import javafx.stage.StageStyle; 

import java.awt.*; 
import java.io.PrintWriter; 
import java.io.StringWriter; 
import java.util.ArrayList; 
import java.util.List; 
import java.util.Optional; 

public class FxDialogs { 

    public static void showInformation(String title, String message) { 
     Alert alert = new Alert(Alert.AlertType.INFORMATION); 
     alert.initStyle(StageStyle.UTILITY); 
     alert.setTitle("Information"); 
     alert.setHeaderText(title); 
     alert.setContentText(message); 

     alert.showAndWait(); 
    } 

    public static void showWarning(String title, String message) { 
     Alert alert = new Alert(Alert.AlertType.WARNING); 
     alert.initStyle(StageStyle.UTILITY); 
     alert.setTitle("Warning"); 
     alert.setHeaderText(title); 
     alert.setContentText(message); 

     alert.showAndWait(); 
    } 

    public static void showError(String title, String message) { 
     Alert alert = new Alert(Alert.AlertType.ERROR); 
     alert.initStyle(StageStyle.UTILITY); 
     alert.setTitle("Error"); 
     alert.setHeaderText(title); 
     alert.setContentText(message); 

     alert.showAndWait(); 
    } 

    public static void showException(String title, String message, Exception exception) { 
     Alert alert = new Alert(Alert.AlertType.ERROR); 
     alert.initStyle(StageStyle.UTILITY); 
     alert.setTitle("Exception"); 
     alert.setHeaderText(title); 
     alert.setContentText(message); 

     StringWriter sw = new StringWriter(); 
     PrintWriter pw = new PrintWriter(sw); 
     exception.printStackTrace(pw); 
     String exceptionText = sw.toString(); 

     Label label = new Label("Details:"); 

     TextArea textArea = new TextArea(exceptionText); 
     textArea.setEditable(false); 
     textArea.setWrapText(true); 

     textArea.setMaxWidth(Double.MAX_VALUE); 
     textArea.setMaxHeight(Double.MAX_VALUE); 
     GridPane.setVgrow(textArea, Priority.ALWAYS); 
     GridPane.setHgrow(textArea, Priority.ALWAYS); 

     GridPane expContent = new GridPane(); 
     expContent.setMaxWidth(Double.MAX_VALUE); 
     expContent.add(label, 0, 0); 
     expContent.add(textArea, 0, 1); 

     alert.getDialogPane().setExpandableContent(expContent); 

     alert.showAndWait(); 
    } 

    public static final String YES = "Yes"; 
    public static final String NO = "No"; 
    public static final String OK = "OK"; 
    public static final String CANCEL = "Cancel"; 

    public static String showConfirm(String title, String message, String... options) { 
     Alert alert = new Alert(Alert.AlertType.CONFIRMATION); 
     alert.initStyle(StageStyle.UTILITY); 
     alert.setTitle("Choose an option"); 
     alert.setHeaderText(title); 
     alert.setContentText(message); 

     //To make enter key press the actual focused button, not the first one. Just like pressing "space". 
     alert.getDialogPane().addEventFilter(KeyEvent.KEY_PRESSED, event -> { 
      if (event.getCode().equals(KeyCode.ENTER)) { 
       event.consume(); 
       try { 
        Robot r = new Robot(); 
        r.keyPress(java.awt.event.KeyEvent.VK_SPACE); 
        r.keyRelease(java.awt.event.KeyEvent.VK_SPACE); 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
      } 
     }); 

     if (options == null || options.length == 0) { 
      options = new String[]{OK, CANCEL}; 
     } 

     List<ButtonType> buttons = new ArrayList<>(); 
     for (String option : options) { 
      buttons.add(new ButtonType(option)); 
     } 

     alert.getButtonTypes().setAll(buttons); 

     Optional<ButtonType> result = alert.showAndWait(); 
     if (!result.isPresent()) { 
      return CANCEL; 
     } else { 
      return result.get().getText(); 
     } 
    } 

    public static String showTextInput(String title, String message, String defaultValue) { 
     TextInputDialog dialog = new TextInputDialog(defaultValue); 
     dialog.initStyle(StageStyle.UTILITY); 
     dialog.setTitle("Input"); 
     dialog.setHeaderText(title); 
     dialog.setContentText(message); 

     Optional<String> result = dialog.showAndWait(); 
     if (result.isPresent()) { 
      return result.get(); 
     } else { 
      return null; 
     } 

    } 

} 

Per utilizzare le finestre di dialogo:

FxDialogs.showInformation("Hi", "Good Morning y'all!"); 
if (FxDialogs.showConfirm("Choose one baby!", "Can i ask you a question?", FxDialogs.YES, FxDialogs.NO).equals(FxDialogs.YES)) { 
    FxDialogs.showWarning(null, "Pay attention to my next question!"); 
    String answer = FxDialogs.showTextInput("Are you a pink elephant disguised as a flying pig?", "Tell me!", "No"); 
    FxDialogs.showError(null, "You should not have said " + answer + "!"); 
    FxDialogs.showException("Now i'm angry", "I'm going home...", new RuntimeException("Exception caused by angry dinossaurs")); 
} 
+0

Hai visto e provato questo? "Per gli utenti di JavaFX 8u60 e versioni successive, scaricare le versioni di ControlsFX 8.40.10-SNAPSHOT." – mipa

+0

Le versioni più recenti (almeno qualche tempo fa) hanno deprecato la classe Dialogs, l'hanno risolto su questa versione? Non riesco a trovare quella versione su Maven, l'ultima è 8.40.9 su Maven Central. Potrei trovare il barattolo, devo installarlo manualmente sul mio repository locale? –

+0

Come suggerisce il nome del file, si tratta di una versione di snapshot e quindi è improbabile che lo si trovi su Maven Central. Quindi dovrai installarlo manualmente in qualche modo. Non so quali sono i cambiamenti ma almeno sembra necessario per l'8u60 altrimenti non lo menzionerebbero sul loro sito web. – mipa