2017-02-04 8 views
1

Я пытаюсь получить как Height, так и Width из WebView на вкладке для изменения размера. Высота Width не соответствует высоте. На дисплее System.out.println(); показано, что высота вводится правильно, но вы можете видеть только немного вверху. Как сделать так, чтобы высота масштабировалась, как это делает ширина?JavaFX height resize issue

public class OuroborosViewer extends Application { 

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

@Override 
public void start(Stage stage) { 
    stage.setTitle("Ouroboros"); 
    Scene scene = new Scene(new VBox(), 1200, 800); 
    scene.setFill(Color.OLDLACE); 

    MenuBar menuBar = new MenuBar(); 
    Menu menuFile = new Menu("File"); 
    Menu menuEdit = new Menu("Edit"); 
    Menu menuView = new Menu("View"); 

    menuBar.getMenus().addAll(menuFile, menuEdit, menuView); 
    ((VBox) scene.getRoot()).getChildren().addAll(menuBar); 

    BorderPane borderPane = createTab(scene); 
    ((VBox) scene.getRoot()).getChildren().add(borderPane); 

    scene.widthProperty().addListener(new WidthListener()); 
    scene.heightProperty().addListener(new HeightListener()); 
    // stage.getIcons().add(new Image("Ouroboros.svg")); 
    stage.setScene(scene); 
    stage.show(); 
} 

private BorderPane createTab(Scene scene) { 
    TabPane tabPane = new TabPane(); 
    BorderPane borderPane = new BorderPane(); 

    Tab tab = new Tab(); 
    tab.setText("Google"); 
    VBox hbox = new VBox(); 
    hbox.setAlignment(Pos.CENTER); 
    tab.setContent(hbox); 
    tabPane.getTabs().add(tab); 

    tab.setContent(new OuroborosBrowser(scene)); 
    // bind to take available space 

    borderPane.setCenter(tabPane); 
    return borderPane; 
} 

private static class WidthListener implements ChangeListener<Number> { 

    @Override 
    public void changed(ObservableValue<? extends Number> observableValue, Number oldSceneWidth, Number newSceneWidth) { 
     String no = String.valueOf(newSceneWidth); 
     double width = Double.parseDouble(no); 
     System.out.println("Width : " + width); 
     OuroborosBrowser.browsers[0].setPrefWidth(width); 
    } 
} 

private static class HeightListener implements ChangeListener<Number> { 

    @Override 
    public void changed(ObservableValue<? extends Number> observableValue, Number oldSceneHeight, Number newSceneHeight) { 
     String no = String.valueOf(newSceneHeight); 
     double height = Double.parseDouble(no); 
     System.out.println("Height : " + height); 
     OuroborosBrowser.browsers[0].setPrefHeight(height); 
    } 
} 
} 

class OuroborosBrowser extends Region { 
public static int browserCounter = 0; 
public static WebView[] browsers = new WebView[25]; 
private static WebView browser = new WebView(); 
final WebEngine webEngine = browser.getEngine(); 
private static double browserWidth = 1200; 
private static double browserHeight = 800; 

public OuroborosBrowser(Scene scene) { 
    // getStyleClass().add("browser"); 
    webEngine.load("http://www.google.com/index.html"); 
    browser.setPrefSize(scene.getWidth(), scene.getHeight()); 
    getChildren().add(browser); 
    browsers[browserCounter] = browser; 
    browserCounter++; 
} 
} 
+0

я не понимаю этого _but вы можете только немного посмотреть наверху? что вы имеете в виду? – Elltz

+0

Ну, когда прослушиватель высоты будет прокомментирован, он будет работать, как и ожидалось, просто не масштабируется, когда это не тот, что есть только крошечный бит, видимый сверху, всего один пиксель или два размера, простирающийся по ширине кадра , –

ответ

0

Ширина работает, потому что Scene ширина всегда равна Content ширине, следовательно, ваша проблема, высота отличается, так как вы добавили MenuBar (menuBar)

Так что в вашем HeightListener сделать это

System.out.println("Height : " + newSceneHeight); 
OuroborosBrowser.browsers[0].setPrefHeight(newSceneHeight.doubleValue() 
    - OuroborosBrowser.browsers[0].getScene().getRoot().getChildrenUnmodifiable() 
      .get(0).prefHeight(-1));//all this nonsense to get the menuBar 

также эти

String no = String.valueOf(newSceneWidth); //no need 
    double width = Double.parseDouble(no); // no need use newSceneHeight.doubleValue() 
    System.out.println("Width : " + width); //why not use no rather ??, no need 
    OuroborosBrowser.browsers[0].setPrefWidth(width);//use newSceneHeight.doubleValue() 

также изменить все это, его трудно понять, вы можете вернуть только вкладку здесь, BorderPane должен быть корневой, где вы можете добавить menuBar с setTop(node)

TabPane tabPane = new TabPane(); 
BorderPane borderPane = new BorderPane(); 

Tab tab = new Tab(); 
tab.setText("Google"); 
VBox hbox = new VBox();//you are not using this 
hbox.setAlignment(Pos.CENTER); 
tab.setContent(hbox);//you replaced this 
tabPane.getTabs().add(tab); 

tab.setContent(new OuroborosBrowser(scene));//you see? 
// bind to take available space 

borderPane.setCenter(tabPane); // why this? its not needed 
return borderPane;