JavaFx: Kontrolki

Interfejs jest tworzony przez scalanie węzłów screena-wykresu w hierarchii wewnątrz sceny (Scene). Trzy typy Rodziców (Parent) mają różne cechy układu:

  • Grupy (Group): nie wykonuje żadnego pozycjonowania dzieci i nie jest bezpośrednio skalowalny (patrz następna sekcja) i po prostu przyjmuje zbiorowe granice swoich widocznych dzieci. Grupy są najbardziej odpowiednie, gdy trzeba statycznie zmontować kolekcję węzłów na ustalonych pozycjach i / lub zastosować efekt lub przekształcić go w tę kolekcję.
  • Region (Region): klasa podstawowa dla wszystkich paneli układu ogólnego przeznaczenia; jest skalowalny i można go wymieniać za pomocą CSS. Obsługuje dynamiczny układ poprzez zmianę rozmiaru i pozycjonowanie elementów podrzędnych podczas przejścia układu (w razie potrzeby). Jeśli podklasa Region (panel układu) obsługuje paradygmat układu, którego potrzebujesz, użyj go zamiast pozycjonowania ręcznego z Grupą.
  • Kontrolka (Control): klasa podstawowa dla wszystkich sterowań podlegających skróceniu. Jest resizable i podklasy są stylable przez CSS. Kontroluje przekazywanie układu do ich skórek (które są regionami). Każda podklasa Control layout zapewnia unikalny API do dodawania treści w odpowiednim miejscu w skórze; nie dodajecie bezpośrednio dzieci do kontrolki.

Prosty przykład, który daje przedsmak, jeśli nigdy nie programowałeś FX:

Text text = new Text("JavaFX 2.0!");
text.setFill(Color.RED);
text.setFont(new Font(24));
Line line = new Line(2, 8, 104, 8);
line.setStroke(Color.BLUE);
line.setStrokeWidth(4);
Group group = new Group();
group.setEffect(new DropShadow());
group.getChildren().addAll(text, line);

BorderPane root = new BorderPane();
root.setTop(new Label("Introducing..."));
root.setCenter(group);

Scene scene = new Scene(root);
stage.setScene(scene);
stage.setVisible(true);

Aby zapoznać się z podstawowymi pojęciami dotyczącymi układu wykresów scen, przyjrzyjmy się najważniejszym klasom:

Zmiana rozmiaru

Każdy Węzeł na wykresie sceny ma potencjał, by być „skalowalnym”, co oznacza, że wyraża jego minimalne, preferowane i maksymalne ograniczenia rozmiaru i umożliwia rodzicowi zmianę jego rozmiaru podczas układania (miejmy nadzieję, że w tym zakresie, jeśli rodzic jest honorowy) .

Każde okienko układu implementuje własne zasady dotyczące zmiany rozmiaru zmiennego rozmiaru dziecka, biorąc pod uwagę zakres wielkości dziecka. Na przykład, StackPane spróbuje zmienić rozmiar wszystkich dzieci, aby wypełnić swoją szerokość / wysokość (przestrzegając maksymalnych limitów), podczas gdy FlowPane zawsze zmienia rozmiar dzieci do ich preferowanych rozmiarów, co rozumiemy pod pojęciem „autosize” (zmiana rozmiaru na preferowane).

Ale oto co zaskakuje (i denerwuje) ludzi: nie wszystkie klasy węzłów grafu sceny są skalowalne:

  • Skalowalne:  Region, Control, WebView
  • Nieskalowalne: Group, Text, Shape, MediaView*, ImageView*

*zostanie zmieniony w przyszłym wydaniu

Jeśli klasa Node nie może zmienić rozmiaru, to isResizable() zwraca false, minWidth()/minHeight(), prefWidth()/prefHeight() i maxWidth()/maxHeight() wszystkie zwracają bieżący rozmiar, a resize() to no-op. Na wielkość nieodkształcalnego węzła wpływają jego różne właściwości (szerokość / wysokość dla prostokąta, promień dla okręgu, itd.) I obowiązkiem aplikacji jest ustawienie tych właściwości (i pamiętaj, że skalowanie NIE jest tym samym co zmiana rozmiaru, ponieważ Skala przekształci również obrys, co zwykle nie jest tym, czego potrzebujesz do układu). Gdy nieskalowalne węzły są rzucane do paneli układu, będą one ustawione, ale nie zostaną zmienione.

 

Wskazówka: jeśli potrzebujesz skalowalnego prostokąta, użyj regionu i nadaj mu styl CSS.

Odchylenie zawartości

W przypadku większości klas węzłów szerokość i wysokość są niezależne od siebie, jednak istnieje grupa, w której wysokość zależy od szerokości lub odwrotnie. Aby poprawnie poradzić sobie z tymi obiektami, układ potrzebuje sposobu na jego odszyfrowanie, stąd metoda węzła getContentBias(). Zwraca domyślnie wartość null, co oznacza brak zależności szerokości/wysokości, a kod układu może przepuszczać -1 jako alternatywny wymiaru do metod minWidth(h)/minHeight(w), prefWidth(h)/prefHeight(w) i maxWidth(h)/maxHeight(w).

Oznakowane elementy sterujące mają odchylenie w wartościach poziomych, gdy włączone jest zawijanie. FlowPane i TilePane obsługują odchylenie w stosunku do ich orientacji. Uwaga: okazuje się, że HBox, VBox i StackPane mają zerowy wpływ na treść, jednak powinny one monitorować odchylenie w oparciu o uprzedzenia docelowe i pomne: jest to błąd, który zostanie naprawiony przed ostateczną wersją.

Nasze klasy layoutów zajmują się podnoszeniem zawartości w systemie, więc dopóki nie napiszesz niestandardowej klasy układu, która obsługuje dowolne węzły, nie musisz zajmować się bezpośrednio tym interfejsem. Po prostu wiesz, że układ automatycznie obsługuje treść, gdy budujesz swoje interfejsy.

Przesłanianie Min / Pref / Max Sizes

Większość klas kontroli i paneli układu jest całkiem niezła w obliczaniu, jak duże powinny być oparte na ich zawartości i ustawieniach właściwości – nazwijmy to ich „wewnętrznymi” minimalnymi, preferowanymi i maksymalnymi rozmiarami. Na przykład Przycisk (Button) oblicza te rozmiary na podstawie ich tekstu, czcionki, wypełnienia itd .; dodatkowo domyślny maksymalny rozmiar przycisku jest ustawiony domyślnie, ponieważ zazwyczaj nie chcemy, aby przyciski rozszerzały się, aby wypełnić przestrzeń. Nie powinieneś wyraźnie określać rozmiaru elementów sterujących, paneli układu, ani nawet Sceny, ponieważ system będzie się zmniejszał, aby dopasować się do twoich treści.

Ale to kłamstwo. Lub co najmniej sprzeczne z naturą projektantów. W ten sposób można bezpośrednio wpływać na wielkość kontrolek i regionów, ustawiając ich właściwości „nadpisania” min, pref i max:

button.setPrefWidth(100);

Domyślnie właściwości te mają wartość wskaźnika USE_COMPUTED_SIZE, co powoduje, że metody minWidth(h)/minHeight(w), prefWidth(h)/prefHeight(w), maxWidth(h)/maxHeight(w) zwracają wartości wewnętrzne. Ustawienie ich na dodatnią wartość podwójną zastąpi ich wartości wewnętrzne.

Często chcesz, aby minimalny lub maksymalny rozmiar śledził preferowane, więc minimalne i maksymalne nadpisania mogą być również ustawione na USE_PREF_SIZE, co jest oczywiste:

stackpane.setMaxSize(USE_PREF_SIZE, USE_PREF_SIZE);

Uważaj na subtelne różnice między metodami Node i właściwościami rozmiaru override:

button.getPrefWidth() returns the size override (might be a magic sentinel value) while button.prefWidth(-1) returns the actual preferred width of the button (returning the override if set).  Layout code should always use Node’s minWidth(h)/minHeight(w), prefWidth(h)/prefHeight(w), maxWidth(h)/maxHeight(w) methods for layout computations.

button.getPrefWidth () zwraca nadpisanie rozmiaru (może to być magiczna wartość), natomiast button.prefWidth (-1) zwraca rzeczywistą preferowaną szerokość przycisku (zwracanie przesłonięcia, jeśli jest ustawione). Kod układu powinien zawsze wykorzystywać metody minWidth(h)/minHeight(w), prefWidth(h)/prefHeight(w), maxWidth(h)/maxHeight(w) do obliczeń układu.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *