Moin moin,
ich habe folgendes Problem. Ich habe für die Scene bzw. die Stage eine minWidth/minHeigth festgelegt, damit die Applikation nach dem starten nicht kleiner gezogen werden sollte, aber größer gezogen werden darf. Soweit ja ganz einfach. Den View über fxml gebastelt, einer Scene zugewiesen und die Scene dann der Stage hinzugefügt. Dann lass ich das ganze anzeigen und setze an der Stage mit
die minWidth/minHeigth, in dem ich die aktuelle Width/Heigth abfrage. Danach sollte die Stage ja eigentlich die Höhe und Breite haben, die die Stage hätte, wenn das Fenster für den Nutzer angezeigt wird.
Ist leider nicht so. Ich habe nach dem stage.show() mal zwei system.out.println's gesetzt und darauf ein Breakpoint, damit ich mir das ganze im Debug-Modus anschauen kann. Das Fenster ist weder fertig gebaut, noch hat es die richtigen Werte. Ich bekomme die Werte, die die Stage hat, die durch den View festgelegt wurden. Allerdings wird danach noch vom Betriebssystem der Skin drumgebrezelt. Sodass unter Windows z.B. in der Breite 8pix und in der Höhe 34pix dazukommen. Da das ganze aber ja systemunabhängig laufen sollte, kann ich die Werte nicht einfach draufrechnen, weil unter Linux (Ubuntu 14.04) in der Breite keine Pixel mehr dazukommen.
Ich hab jetzt eine Woche lang gegoogelt und auch dieses Forum hier durchforstet (ca. 20 Beiträge, die in der engeren Auswahl standen komplett gelesen), allerdings scheint nichts wirklich mein Problem zu lösen. Es gibt einen Beitrag, in dem z.B. auf die Scene ein ChangeListener gesetzt wird. Interessanter Gedanke, das würde auch theoretisch funktionieren, nur leider ist dann nicht der erste Wert der richtige, sondern betriebssystemabhängig mal der 2. oder 3. Wert durch den ChangeListener.
Was an der Geschichte wirklich lustig ist, gestern ging das, heute wieder nicht. Ich hab 2 PC's und eine Laptop. Auf einem läuft Win7, auf dem anderen Kubuntu 15.04. Auf dem Laptop Ubuntu 14.04. Mit allen drei Systemen habe ich das mit der Javaversion 8.45 getestet. Ich entwickle mit Intellij Idea Version 14.
Ich muss ehrlich sagen, dass ich verwirrt bin. Ich habe von gestern auf heute nichts verändert, außer die Rechner runter- und hochgefahren
. Weiß vielleicht einer, woran das liegen könnte? Eventuell hat ja jemand ein speziellen Lösungsansatz. Rein theoretisch würde es ja reichen, wenn ich nach dem show() die Werte setze, allerdings ist das Fenster noch nicht richtig aufgebaut, sodass ich also warten muss, bis das passiert ist. Das wäre nach der start()-Methode in der Main. Danach befindet sich die Applikation aber in einem Wartemodus, sodass erst irgendein Event fliegen müsste, damit die Werte abgefragt werden.
Das Problem habe ich mit einer einfachen "Hello World!"-Applikation dargestellt.
Hier die Main:
Hier der Code vom View:
Hier der Code des Controllers zur Ausgabe der Werte nach dem fertigen Fensteraufbau:
Mit freundlichen Grüßen
Krappe87
ich habe folgendes Problem. Ich habe für die Scene bzw. die Stage eine minWidth/minHeigth festgelegt, damit die Applikation nach dem starten nicht kleiner gezogen werden sollte, aber größer gezogen werden darf. Soweit ja ganz einfach. Den View über fxml gebastelt, einer Scene zugewiesen und die Scene dann der Stage hinzugefügt. Dann lass ich das ganze anzeigen und setze an der Stage mit
Java:
primaryStage.setMinWidth(primaryStage.getWidth());
primaryStage.setMinHeight(primaryStage.getHeight());
Ist leider nicht so. Ich habe nach dem stage.show() mal zwei system.out.println's gesetzt und darauf ein Breakpoint, damit ich mir das ganze im Debug-Modus anschauen kann. Das Fenster ist weder fertig gebaut, noch hat es die richtigen Werte. Ich bekomme die Werte, die die Stage hat, die durch den View festgelegt wurden. Allerdings wird danach noch vom Betriebssystem der Skin drumgebrezelt. Sodass unter Windows z.B. in der Breite 8pix und in der Höhe 34pix dazukommen. Da das ganze aber ja systemunabhängig laufen sollte, kann ich die Werte nicht einfach draufrechnen, weil unter Linux (Ubuntu 14.04) in der Breite keine Pixel mehr dazukommen.
Ich hab jetzt eine Woche lang gegoogelt und auch dieses Forum hier durchforstet (ca. 20 Beiträge, die in der engeren Auswahl standen komplett gelesen), allerdings scheint nichts wirklich mein Problem zu lösen. Es gibt einen Beitrag, in dem z.B. auf die Scene ein ChangeListener gesetzt wird. Interessanter Gedanke, das würde auch theoretisch funktionieren, nur leider ist dann nicht der erste Wert der richtige, sondern betriebssystemabhängig mal der 2. oder 3. Wert durch den ChangeListener.
Was an der Geschichte wirklich lustig ist, gestern ging das, heute wieder nicht. Ich hab 2 PC's und eine Laptop. Auf einem läuft Win7, auf dem anderen Kubuntu 15.04. Auf dem Laptop Ubuntu 14.04. Mit allen drei Systemen habe ich das mit der Javaversion 8.45 getestet. Ich entwickle mit Intellij Idea Version 14.
Ich muss ehrlich sagen, dass ich verwirrt bin. Ich habe von gestern auf heute nichts verändert, außer die Rechner runter- und hochgefahren
Das Problem habe ich mit einer einfachen "Hello World!"-Applikation dargestellt.
Hier die Main:
Java:
package sample;
import controller.Controller;
import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;
public class Main extends Application {
@Override
public void start(Stage primaryStage) throws Exception{
FXMLLoader fxmlLoader = new FXMLLoader();
fxmlLoader.setLocation(getClass().getResource("/view/sample.fxml"));
Parent root = fxmlLoader.load();
Controller controller = fxmlLoader.getController();
controller.setStage(primaryStage);
primaryStage.setTitle("Hello World");
Scene scene = new Scene(root);
primaryStage.setScene(scene);
System.out.println("before show sceneW " + scene.getWidth());
System.out.println("before show sceneH " + scene.getHeight());
System.out.println("before show stageW " + primaryStage.getWidth());
System.out.println("before show stageH " + primaryStage.getHeight());
primaryStage.show();
System.out.println("after show sceneW " + scene.getWidth());
System.out.println("after show sceneH " + scene.getHeight());
System.out.println("after show stageW " + primaryStage.getWidth());
System.out.println("after show stageH " + primaryStage.getHeight());
primaryStage.setMinWidth(primaryStage.getWidth());
primaryStage.setMinHeight(primaryStage.getHeight());
}
public static void main(String[] args) {
launch(args);
}
}
Hier der Code vom View:
HTML:
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.control.*?>
<?import java.lang.*?>
<?import javafx.scene.layout.*?>
<?import javafx.geometry.Insets?>
<?import javafx.scene.layout.GridPane?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.control.Label?>
<GridPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="275.0" minWidth="300.0" prefHeight="275.0" prefWidth="300.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="controller.Controller">
<columnConstraints>
<ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
<ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
</columnConstraints>
<rowConstraints>
<RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
<RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
<RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
</rowConstraints>
<children>
<Button mnemonicParsing="false" onAction="#btnAction" text="Button" />
</children>
</GridPane>
Hier der Code des Controllers zur Ausgabe der Werte nach dem fertigen Fensteraufbau:
Java:
package controller;
import javafx.fxml.FXML;
import javafx.stage.Stage;
public class Controller {
private Stage stage;
@FXML
public void btnAction() {
System.out.println("stageW " + stage.getWidth());
System.out.println("stageH " + stage.getHeight());
}
public void setStage(Stage stage) {
this.stage = stage;
}
}
Mit freundlichen Grüßen
Krappe87