2015-05-10 16 views
5

Ho uno stage con un elenco variabile di caselle di controllo. Quando l'elenco cambia, lo stage deve essere ridimensionato. Funziona bene in molte occasioni, dopo aver aggiunto tutte le caselle di controllo a un VBox, quindi chiama stage.sizeToScene() e lo stage viene ridimensionato di conseguenza. Tuttavia, se si inserisce tutto questo in una scheda all'interno di una tabella, stage.sizeToScene() non funziona più. Sono un po 'bloccato perché questo è. Qualcuno ha un buon lavoro o soluzione?JavaFX TabPane e ridimensionamento fase padre

Alcuni esempi di codice sono di seguito. Basta cambiare il campo withTabs con false o true, per mostrare la situazione senza e con un TabPane.

Grazie per l'aiuto.

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

}

risposta

2

Ecco alcune informazioni che ho trovato. Tieni presente che sono ancora un programmatore dilettante.

Ho copiato il codice e ho cercato di trovare una soluzione su come risolvere questo problema.

Ci sono alcune cose strane che accadono con il tabs come ho notato - il contenuto della scheda diventerebbe bianco tutto d'un tratto, i metodi che restituirebbero dei limiti restituirebbero sempre lo stesso valore, e sizeToSceneMethod() fa proprio questo - imposta la larghezza e l'altezza del palco in base a cosa c'è dentro.

Ora dopo aver notato strane cose ho scavato attraverso google a find this bug submission, che dice che non è stato risolto per alcuni anni.

Lì ho trovato un frammento di codice che funziona, ma ha questo problema - scheda viene rimosso e aggiunto ogni volta, e si può vedere questo visivamente

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

Usando questo metodo e quindi chiamando sizeToScene ha funzionato:

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

oltre a questo, la soluzione migliore sarebbe quella di impostare la dimensione fase manualmente, anche se questo tipo di odori, se funziona:

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

Modifica: ho notato che ho risposto a una domanda di 2 anni.

+0

Grazie mille! Apprezzo comunque la risposta: sempre utile per gli altri a leggere. – macster110

Problemi correlati