2014-10-13 9 views

Odpowiedz

13

Ten blogu wyjaśnia wszystko:

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

Ta wersja została warzenia od 8.0.6 został wydany w dniu 29 maja - więc w zasadzie cztery miesiące. Nie jest to typowe dla nas (zwykle mamy o wiele szybsze wydania), ale zarówno Eugene, jak i ja byliśmy rozproszeni na dużym przedsięwzięciu - przeniesienie API DialsFX i implementacji do następnej wersji samego JavaFX (pojawi się w JavaFX 8u40 , mimo że API znacznie różni się od tego, co widzisz w ControlsFX 8.0.6). Końcowym rezultatem jest to, że przeszliśmy przez kilka prac projektowych interfejsu API (patrz RT-12643) i nic z tego nie przyniosło korzyści ControlsFX, ale zajęło to cały nasz czas.

Po zakończeniu dialogów JavaFX 8u40 z API ukończono (co było dopiero w połowie sierpnia), opracowaliśmy plan, jak postępować z oknami dialogowymi ControlsFX. W gruncie rzeczy nie uważaliśmy, aby rozsądnie było utrzymywać interfejs dialogów API w ControlsFX, który był tak rozbieżny, niż to, co będzie wysyłane w JavaFX 8u40. Dlatego opracowany przez nas plan miał na celu wycofanie starego interfejsu API ControlsFX, rozwinięcie interfejsu API dialogów JavaFX do nowego projektu o nazwie openjfx-dialogs oraz odtworzenie dodatkowych funkcji, które obejmuje ControlsFX (ale brakuje w samej JavaFX) za pomocą nowego interfejsu API (obejmuje to dialogi, takie jak postęp, wybór czcionki, link polecenia, login, itp.).

+3

Dzięki za link. Naprawdę zła decyzja controlfx. Nowa biblioteka to GPL i nie może być używana w większości aplikacji. Te dwa interfejsy API mają inne znaczenie, a stary interfejs API nie powinien być już przestarzały ... –

+1

Zgodnie z https://bitbucket.org/controlsfx/openjfx-dialogs licencja to GPL plus wyjątek Classpath, co oznacza, że ​​MOŻE być stosowane w zastosowaniach komercyjnych. (zrzeczenie się: IANAL) – rli

+0

@ArtjomB. Tak, ale twój komentarz był ponad 3 miesiące przed edycją, aby uczynić z niej realną odpowiedź. No cóż, posortowane, odpowiedź jest w porządku, co jest ostatecznym celem – James

11

Teraz z aktualizacją Java 60, nawet przy użyciu starej nieoficjalnej wersji controlfx nie działa. Tak więc rozwiązaniem jest użycie natywnego interfejsu API interfejsu API z javafx zawartego w aktualizacji Java 40 40 (nie wymaga to bibliotek innych firm). Nie są one tak proste i pełne funkcji, jak kontrole. Ale dla szybszego kodowania, można utworzyć klasy otoki, jak ten zrobiłem:

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; 
     } 

    } 

} 

Aby korzystać z okien dialogowych:

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

Czy widziałeś i wypróbowałeś to? "Dla użytkowników JavaFX 8u60 i nowszych pobierz wersje kontrolne ControlsFX 8.40.10-SNAPSHOT." – mipa

+0

Nowsze wersje (przynajmniej jakiś czas temu) mają wycofaną klasę Dialogów, czy naprawiono ją w tej wersji? Nie mogę znaleźć tej wersji na maven, ostatnia ma 8.40.9 na centralnym komputerze. Mogę jednak znaleźć słoik, czy muszę zainstalować go ręcznie w moim lokalnym repozytorium? –

+0

Ponieważ nazwa pliku sugeruje, że jest to wersja migawka, więc jest mało prawdopodobne, że znajdziesz go na maven central. Będziesz musiał jakoś zainstalować go ręcznie. Nie wiem, jakie zmiany są, ale przynajmniej wydaje się konieczne dla 8u60, inaczej nie wspominają o tym na swojej stronie internetowej. – mipa