2015-05-10 12 views
5

Mam etap ze zmienną listą pól wyboru. Kiedy lista zmienia się, etap musi się zmienić. Działa to dobrze w większości przypadków, po dodaniu wszystkich pól wyboru do VBox, a następnie wywołanie stage.sizeToScene() i etap odpowiednio zmienia rozmiar. Jeśli jednak umieścisz to wszystko w Tab w ramach TabPane, stage.sizeToScene() już nie działa. Trochę utknąłem, dlaczego tak jest. Czy ktoś ma dobrą pracę lub rozwiązanie?JavaFX TabPane i zmiana rozmiaru obiektu nadrzędnego Etap

Przykładowy kod znajduje się poniżej. Wystarczy zmienić pole withTabs na false lub true, aby pokazać sytuację bez i z TabPane.

Dzięki za pomoc.

import javafx.application.Application; 
import javafx.collections.FXCollections; 
import javafx.collections.ObservableList; 
import javafx.event.ActionEvent; 
import javafx.event.EventHandler; 
import javafx.scene.Scene; 
import javafx.scene.control.Button; 
import javafx.scene.control.CheckBox; 
import javafx.scene.control.ComboBox; 
import javafx.scene.control.Tab; 
import javafx.scene.control.TabPane; 
import javafx.scene.layout.BorderPane; 
import javafx.scene.layout.HBox; 
import javafx.scene.layout.Pane; 
import javafx.scene.layout.VBox; 
import javafx.stage.Stage; 

public class TabResizeError extends Application { 

boolean withTabs=false; 

public static void main(String[] args) { 
    launch(args); 
} 

@Override 
public void start(Stage primaryStage) { 

    primaryStage.setTitle("Hello World!"); 


    //holds variable number of check boxes 
    VBox channelBox=new VBox(); 
    channelBox.setSpacing(5); 

    //create controls 
    HBox controlsHBox=new HBox(); 
    controlsHBox.setSpacing(5); 

    Button btn = new Button(); 
    btn.setText("Resize Test"); 

    ComboBox<Integer> comboBox=new ComboBox<Integer>(); 
    ObservableList<Integer> number=FXCollections.observableArrayList(); 
    for (int i=0; i<32; i++){ 
     number.add(i); 
    } 
    comboBox.setItems(number); 
    comboBox.getSelectionModel().select(5); 

    controlsHBox.getChildren().addAll(btn, comboBox); 

    btn.setOnAction(new EventHandler<ActionEvent>() { 

     @Override 
     public void handle(ActionEvent event) { 
      //remove all check boxes 
      channelBox.getChildren().removeAll(channelBox.getChildren()); 
      //add new check boxes 
      for (int i=0; i<comboBox.getSelectionModel().getSelectedItem(); i++){ 
       CheckBox checkBox=new CheckBox(("Channel "+i)); 
       channelBox.getChildren().add(checkBox); 
      } 
      primaryStage.sizeToScene(); 
     } 
    }); 

    Pane root=null; 

    VBox mainPane = new VBox(); 
    mainPane.getChildren().addAll(controlsHBox,channelBox); 
    mainPane.setSpacing(5); 
    if (withTabs){ 
     TabPane tabbedPane=new TabPane(); 
     Tab tab=new Tab("TestTab"); 
     tab.setContent(mainPane); 
     tabbedPane.getTabs().add(tab); 
     root=new BorderPane(tabbedPane); 
    } 
    else{ 
     root = mainPane; 
    } 
    //  root.setTop(controlsHBox); 
    //  root.setCenter(channelBox); 

    primaryStage.setScene(new Scene(root)); 
    primaryStage.setMinHeight(300); 
    primaryStage.show(); 
} 

}

Odpowiedz

2

Oto kilka informacji, które znalazłem. Pamiętaj, że nadal jestem dość amatorskim programistą.

Skopiowałem twój kod i próbowałem znaleźć rozwiązanie, jak obejść ten problem.

Było dziwnych rzeczy dzieje się z tabpane, jak zauważyłem - zawartość karty nagle zmieni kolor na biały, metody, które zwrócą granice zawsze zwracają tę samą wartość, a sizeToSceneMethod() po prostu to robi - ustawia szerokość i wysokość sceny zgodnie z jej zawartością.

Teraz po zauważeniu dziwnych rzeczy przekopałem google do find this bug submission, który mówi, że nadal nie został rozwiązany przez kilka lat.

Nie znalazłem fragment kodu, który działa, ale ma ten problem - karta jest usuwany i dodawany za każdym razem, i widać to wizualnie

private static final void changeTabPaneSize(final TabPane tabPane) { 
    final int index = tabPane.getSelectionModel().getSelectedIndex(); 
    if (index < 0 || tabPane.getTabs().isEmpty()) { 
     return; 
    } 

    if (tabPane.getTabs().size() == 1) { 
     final Tab tab = tabPane.getTabs().remove(0); 
     tabPane.getTabs().add(tab); 
    } else if (tabPane.getTabs().size() > 1 && index == 0) { 
     tabPane.getSelectionModel().select(1); 
    } else if (tabPane.getTabs().size() > 1 && index != 0) { 
     tabPane.getSelectionModel().select(1); 
    } 

    tabPane.getSelectionModel().select(index); 
} 

Stosując tę ​​metodę, a następnie wywołanie sizeToScene wyszło:

changeTabPaneSize(tabbedPane); 
primaryStage.sizeToScene();//method called after resetting the tab 

Poza tym, najlepiej byłoby, aby ręcznie ustawić rozmiar sceny, chociaż tego rodzaju zapachy, choć to działa:

primaryStage.sizeToScene(); 
double constantFoundByTrialAndError = 70; 
primaryStage.setHeight(mainPane.getHeight()+constantFoundByTrialAndError); 

Edytuj: Zauważyłem, że odpowiedziałem na dwuletnie pytanie.

+0

Dziękuję bardzo! Doceń odpowiedź - i zawsze dobrze, aby inni ludzie ją przeczytali. – macster110