2012-04-25 4 views
15

Mam aplikację JavaFX 2.0 z FXML. Chcę, aby komponenty (pola tekstowe, elementy składowe, układy itd.) Zmieniły się, gdy zmieni się rozmiar okna z aplikacją. Więc ...Jak powiązać zmianę rozmiaru sceny ze zmianą rozmiarów komponentów?

  • Jak to jest napisane na Oracle documentation for JavaFX, aby zrobić coś takiego z kształtach, istnieje kilka szczególne właściwości do kształtów:

Podczas tworzenia aplikacji GUI z JavaFX, zauważysz, że niektóre klasy w API już implementują właściwości. Na przykład klasa javafx.scene.shape.Rectangle zawiera właściwości dla arcHeight, arcWidth, height, width, x i y. Dla każdej z tych właściwości będą odpowiednie metody pasujące do poprzednio opisanych konwencji. . Na przykład, getArcHeight(), setArcHeight(double), arcHeightProperty(), które razem wskazać (dla obu twórców i narzędzi), które dana właściwość istnieje *

  • Aby dodać słuchacza do etapu muszę zrobić coś takiego:

    stage.resizableProperty().addListener(new ChangeListener<Boolean>(){ 
        @Override 
        public void changed(ObservableValue<? extends Boolean> arg0, Boolean arg1, Boolean arg2){ 
         throw new UnsupportedOperationException("Not supported yet."); 
        } 
    
    }); 
    

więc istnieją dwa pytania:

  • Aby zrobić wiązanie, muszę dostać swój etap w klasie kontrolera. Więc - w jaki sposób mogę uzyskać etap w klasie kontrolera?
  • Wygląda na to, że formanty interfejsu użytkownika nie mają żadnych właściwości width \ height, które można powiązać z czymś. A może ich nie znalazłem.

Jak mogę rozwiązać mój problem?

UPD. O programie Scene Builder dla Sergey Grinev: Kiedy używam Ctrl + K na moim komponencie (powiedz, żeby zająć cały obszar jego komponentu nadrzędnego) - wszystko jest w porządku.

Ale co, jeśli chcę powiedzieć, że mój komponent zajmuje 50% obszaru? Na przykład mam kartę z dwoma VBoxami na jej temat. Szerokość zakładki to 100px. Szerokość Vbox'a wynosi 50px dla każdego. VBox1 ma X1 = 0 i x2 = 50 i VBox2 ma X1 = 50 i X2 = 100. Następnie zmieniam rozmiar okna za pomocą aplikacji JavaFX. Teraz mam zakładkę Szerokość = 200px. Ale moi tagach vbox szerokości są nadal = 50px: VBox1 ma x1 = 0 i x2 = 50 i VBox2 ma X1 = 150 i x2 = 200. I muszę im być VBox1 x1 = 0 i x2 = 100 i VBox2 x1 = 100 i x2 = 200. Gdzie wartości x1 i x2 są współrzędnymi narożników VBoxes.

W jaki sposób Scene Builder może mi pomóc w tej sytuacji?

Odpowiedz

7

Innym łatwym rozwiązaniem jest użycie JavaFX Scene Builder (niedawno stały się dostępne w publicznej wersji beta: http://www.oracle.com/technetwork/java/javafx/tools/index.html)

To pozwala na tworzenie UI przeciągnij i upuść i kotwica UI elementów granic (o anchor tool), tak poruszają się/zmieniają rozmiar za pomocą obramowań okna.

UPDATE:

Aby osiągnąć układ automatycznej zmiany procentowe można użyć GridPane z ColumnConstraint:

public void start(Stage stage) { 

    VBox box1 = new VBox(1); 
    VBox box2 = new VBox(1); 

    //random content 
    RectangleBuilder builder = RectangleBuilder.create().width(20).height(20); 
    box1.getChildren().addAll(builder.build(), builder.build(), builder.build()); 
    builder.fill(Color.RED); 
    box2.getChildren().addAll(builder.build(), builder.build(), builder.build()); 

    //half by half screen 
    GridPane grid = new GridPane(); 
    grid.addRow(0, box1, box2); 

    ColumnConstraints halfConstraint = ColumnConstraintsBuilder.create().percentWidth(50).build(); 
    grid.getColumnConstraints().addAll(halfConstraint, halfConstraint); 

    stage.setScene(new Scene(grid, 300, 250)); 
    stage.show(); 
} 
+0

Mam odpowiedział na Twój komentarz jako aktualizacja na pytanie, jak to było z postaciami. –

+0

proszę spojrzeć na aktualizację, proszę. –

+1

Typo - GripPane – Avik

3

Sugestie:

  1. Jeśli masz tylko jeden główny etap następnie zapisać go w statycznym polem/zmienna, podczas gdy aplikacja zacząć i dostęp to wszystkich klas kontrolera.
  2. Możesz umieścić wszystkie kontrolki/komponenty w układzie/panelu, który automatycznie zarządza układem dzieci. Dla różnych układów sprawdź api doc. Następnie odpowiednio powiązaj właściwości szerokości i wysokości sceny sceny z właściwościami tego layoutu. Więcej o wiążącym spojrzeniu na Using JavaFX Properties and Binding.
    Przykład unidirectional binding
20

Niektóre sugestie na budowę resizable GUI =>

  • Upewnij korzeniem aplikacji jest podklasą okienku zamiast Group.
  • luzowania maksymalna wielkość przycisków (np button.setMaxSize (Double.MAX_VALUE, Double.MAX_VALUE).
  • Większość czasu tafle układ może obsłużyć zmianę rozmiaru dla siebie i nie trzeba powiązań i słuchaczy = > tj. tylko bind, gdy naprawdę potrzebujesz.
  • Elementy sterujące interfejsu użytkownika i panele układu to Regiony => wszystkie Regiony mają właściwości tylko do odczytu wysokości i szerokości, które można odsłuchać i powiązać z nimi.
  • Nie można bezpośrednio powiązać wysokości i szerokość właściwości kontrolki do innej wartości, zamiast tego użyj wartości MinWidth/Height, prefWidth/Height, maxWidth/Height ..
  • Scena ma wysokość i szerokość. w razie potrzeby można się z nimi połączyć. Jeśli to zrobisz, podczas zmiany rozmiaru sceny, scena zostanie zmieniona, a rozmiar powiązanych elementów zostanie zmieniony. Jeśli źródłem Twojej sceny jest panel układu, a nie grupa, wiązanie to zwykle nie jest konieczne.
  • Jeśli nie ustawisz wysokości i szerokości na scenie, w przypadku samodzielnej aplikacji scena (i scena) zostaną dopasowane tak, aby pasowały do ​​preferowanego rozmiaru węzła głównego sceny (co zwykle jest tym, czego potrzebujesz).
  • Jeśli wszystko inne zawiedzie, możesz zacząć przesłonić metodę Rodziców układowych.

Oto an example skalowalnego interfejsu JavaFX, który implementuje niektóre z powyższych zasad.