JavaFX 8: сценические вставки (толщина оконной отделки)?
Как определить сценические / оконные вставки в JavaFX? В Swing я мог бы просто написать:
JFrame frame = new JFrame();
Insets insets = frame.getInsets();
Что может быть эквивалентно в JavaFX, чтобы получить размер границы и заголовок окна?
1 ответ
Вы можете определить их, взглянув на границы сцены относительно ширины и высоты окна.
Учитывая Scene scene;
, scene.getX()
а также scene.getY()
дать координаты х и у Scene
в окне. Они эквивалентны левой и верхней вставкам соответственно.
Справа и снизу немного сложнее, но
scene.getWindow().getWidth()-scene.getWidth()-scene.getX()
дает правильные вставки, а так же
scene.getWindow().getHeight()-scene.getHeight()-scene.getY()
дает нижние вставки.
Эти значения, конечно, будут иметь смысл только после того, как сцена будет помещена в окно, и окно будет видно на экране.
Если вы действительно хотите Insets
Объект, который вы можете сделать что-то вроде следующего (который даже остался бы действительным, если граница или строка заголовка изменили размер после отображения окна):
import javafx.application.Application;
import javafx.beans.binding.Bindings;
import javafx.beans.binding.ObjectBinding;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
public class WindowInsetsDemo extends Application {
@Override
public void start(Stage primaryStage) {
Label topLabel = new Label();
Label leftLabel = new Label();
Label rightLabel = new Label();
Label bottomLabel = new Label();
VBox root = new VBox(10, topLabel, leftLabel, bottomLabel, rightLabel);
root.setAlignment(Pos.CENTER);
Scene scene = new Scene(root, 600, 400);
ObjectBinding<Insets> insets = Bindings.createObjectBinding(() ->
new Insets(scene.getY(),
primaryStage.getWidth()-scene.getWidth() - scene.getX(),
primaryStage.getHeight()-scene.getHeight() - scene.getY(),
scene.getX()),
scene.xProperty(),
scene.yProperty(),
scene.widthProperty(),
scene.heightProperty(),
primaryStage.widthProperty(),
primaryStage.heightProperty()
);
topLabel.textProperty().bind(Bindings.createStringBinding(() -> "Top: "+insets.get().getTop(), insets));
leftLabel.textProperty().bind(Bindings.createStringBinding(() -> "Left: "+insets.get().getLeft(), insets));
rightLabel.textProperty().bind(Bindings.createStringBinding(() -> "Right: "+insets.get().getRight(), insets));
bottomLabel.textProperty().bind(Bindings.createStringBinding(() -> "Bottom: "+insets.get().getBottom(), insets));
primaryStage.setScene(scene);
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}
}