Вы правы, что Java является передачей по значению , но ошибочно указываете, какое "значение" передается. В Java это ссылка на объект, который копируется, но эта новая ссылка все еще указывает на тот же объект экземпляр . Это объясняется более подробно многими замечательными ответами на следующий вопрос:
Если вы не хотите поддерживать два разных экземпляра Pane
, один из вариантов - просто установить свойства в зависимости от того, в каком режиме вы находитесь. Я не совсем уверен, как вы хотите, чтобы ваш код выглядел в конец, но это может выглядеть примерно так:
import java.util.Map;
import java.util.HashMap;
import javafx.geometry.Dimension2D;
import javafx.scene.Scene;
import javafx.scene.layout.Pane;
import javafx.scene.transform.Scale;
public class ScreenController {
private final Map<String, Foo> map = new HashMap<>();
private final Scene scene;
public ScreenController(Scene scene) {
this.scene = scene;
}
public void register(String name, Pane pane) {
map.put(name, pane);
}
public void activate(String name) {
scene.setRoot(map.get(name).pane);
}
private static class Foo {
private final Pane pane;
private final Dimension2D normalSize;
private final Dimension2D fullScreenSize;
private final Scale scale;
private Foo(Pane pane) {
this.pane = pane;
// set the other fields...
}
private void enterFullScreenMode() {
pane.setPrefSize(fullScreenSize.getWidth(), fullScreenSize.getHeight());
pane.getTransforms().add(scale);
}
private void exitFullScreenMode() {
pane.setPrefSize(normalSize.getWidth(), normalSize.getHeight());
pane.getTransforms().remove(scale);
}
}
}
Примечание: я не включил ни одного параметра или проверки состояния.
Имейте в виду, однако, что корень Scene
имеет размер, отличный от "обычных" узлов в графе сцены. Установка предпочтительного размера, скорее всего, не будет иметь никакого эффекта. Из документации .
Приложение должно указать корень Node
для графа сцены, установив свойство root
. Если в качестве корня используется Group
, содержимое графа сцены будет обрезано по ширине и высоте сцены, и изменение размера сцены (если пользователь изменяет размер сцены) не изменит макет графа сцены. Если в качестве корня установлен узел с изменяемым размером (макет Region
или Control
), то размер корня будет отслеживать размер сцены, вызывая при необходимости ретрансляцию содержимого.
Если у вас есть только заданное количество экранов, рассмотрите возможность использования enum
в качестве клавиши Map
вместо String
. Также взгляните на java.util.EnumMap
.