2016-04-07 2 views
5

Я искал метод для этого, но я нашел только This question without answers.JavaFX разрешение экрана масштабирование

Я развиваю ноутбук 1366x768, я использую JavaFX для создания графического интерфейса (извините, но я не могу опубликовать код, это в основном AnchorPane, содержащая пару GridPanes, которые содержат больше GridPanes, которые содержат ярлыки , TextFields и пара диаграмм).

Проблема возникает, когда я загружаю проект на другое разрешение (1920x1080 или 1600x900).

Я использую stage.setMaximized(true);, но это только масштабирует фон, сам этап, поэтому все элементы и контейнеры (панели, ярлыки, текстовые поля .....) остаются того же размера, что и с разрешением 1366x768, что делает Графический интерфейс «не подходит» при разрешениях, которые не являются точно 1366x768.

Надеюсь, я объяснил свою проблему достаточно хорошо, мой английский далеко не идеален.

Есть ли у кого-нибудь какие-либо предложения о том, как создавать шкалы элементов с разрешением сцены?

(Мне нужно, чтобы программное обеспечение было максимально или полноэкранным на каждом мониторе, поэтому фиксированное разрешение (1366x768, например) не похоже на хорошее решение).

Спасибо всем.

Update:

Я только что создал небольшой пример. Это 2x1 GridPane внутри стандартного JavaFX AnchorPane, я добавил два примера кнопок в сетку.

<AnchorPane minHeight="-Infinity" minWidth="-Infinity" prefHeight="300.0" prefWidth="400.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" > 
<children> 
    <GridPane prefHeight="300.0" prefWidth="400.0"> 
     <columnConstraints> 
      <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> 
     <children> 
      <Button fx:id="example1" mnemonicParsing="false" text="Example 2" GridPane.halignment="CENTER" GridPane.valignment="CENTER" /> 
      <Button fx:id="example2" mnemonicParsing="false" text="Example 2" GridPane.halignment="CENTER" GridPane.rowIndex="1" GridPane.valignment="CENTER" /> 
     </children> 
    </GridPane> 
</children> 

Этот код выглядит красиво в 400x300 экране (слишком мало, я знаю, это просто пример), когда я масштабировать его до 1366x768 (Не реального полного экрана, просто stage.setMaximized(true);), то GridPane не масштабируется, только сама сцена, поэтому у меня есть полноэкранный фон с панелью 400x300 (с ее маленькими кнопками) в верхнем левом углу экрана.

TL; DR: Код примера: кнопки остаются в верхнем левом углу экрана, а остальное - просто пустое пространство при масштабировании разрешения.

Обновление 2; Забыл код Java.

Parent root = FXMLLoader.load(getClass().getResource("UI.fxml")); 
Scene scene = new Scene(root, java.awt.Toolkit.getDefaultToolkit().getScreenSize().width, 
      java.awt.Toolkit.getDefaultToolkit().getScreenSize().height); 
stage = new Stage(); 
stage.setMaximized(false); 
stage.setScene(scene); 
stage.setTitle("Example Menu"); 
stage.show(); 
+0

Боюсь, что это невозможно, если не увидеть код. Звучит как проблема компоновки, возможно, жестко закодированные позиции или размеры. Вы читали комментарии по связанному вопросу? Кажется, это аналогичная проблема. –

+0

Я ничего не закодировал. Я делал все с помощью «JavaFX SceneBuilder 2», и при просмотре размера все (Min, pref и max) говорит «USE_COMPUTED_SIZE».Я понимаю, что это трудно помочь, не видя кода, но если я поставлю код онлайн, меня могут уволить, и я не хочу этого, извините. Спасибо, что пытались помочь :) – Tuzane

+0

Я вижу, но, может быть, вы можете написать небольшой, самодостаточный пример, который не связан с вашей работой? Просто простой экран с одним или двумя компонентами для имитации проблемы? –

ответ

2

Необходимо установить ограничения привязки привязки на дочерние элементы. в вашем случае gridpane

AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0" 

Это будет продолжаться после

GridPane prefHeight="300.0" prefWidth="400.0" **HERE** 

Это максимизирует компонента ребенка в контейнере, следовательно, 0 0 0 0 пикселей с каждой стороны.

+1

Вы даже не представляете, как сильно я люблю вас сейчас. Это было прекрасно для небольшого примера. – Tuzane

+0

Я предполагаю, что мне нужно добавить этот код к каждой панели в реальном проекте, чтобы все элементы были масштабированы, не так ли? Например, если у меня есть кнопка внутри GridPane, я бы добавил GridPane.leftAnchor = "0,0" ... а остальное - к элементу Button. Это нормально? – Tuzane

+1

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

Смежные вопросы