JavaFX StackPane/group не позволяет мне изменять размер экрана
Я не могу заставить это изменить размер, это всегда идет для предпочтительного размера для каждого экрана. Это не идеально для полноэкранного приложения. Это просто становится маленькой коробочкой в верхнем левом углу =(
Я потратил несколько дней на это сейчас, но не могу заставить его работать.
Кто-нибудь может сказать мне, что я делаю не так? Спасибо
Основной класс:
public class Main extends Application {
public static final String MAIN_SCREEN = "main";
public static final String MAIN_SCREEN_FXML = "../gui/main.fxml";
public static final String CUSTOMER_SCREEN = "customer_main";
public static final String CUSTOMER_SCREEN_FXML = "../gui/customer_main.fxml";
@Override
public void start(Stage primaryStage) {
primaryStage.setFullScreen(true);
primaryStage.centerOnScreen();
ScreensController mainContainer = new ScreensController();
mainContainer.loadScreen(Main.MAIN_SCREEN,
Main.MAIN_SCREEN_FXML);
mainContainer.loadScreen(Main.CUSTOMER_SCREEN,
Main.CUSTOMER_SCREEN_FXML);
mainContainer.setScreen(Main.MAIN_SCREEN);
Group root = new Group();
root.getChildren().addAll(mainContainer);
Scene scene = new Scene(root);
primaryStage.setScene(scene);
primaryStage.show();
mainContainer.requestLayout();
}
public static void main(String[] args) {
launch(args);
}
Первый класс контроллера экрана (имеет файл FXML):
public class MainScreenController implements ControlledScreen, Initializable{
ScreensController myController;
@FXML
private VBox mainScreen;
@FXML
private void mainScreenClicked(){
myController.setScreen(Main.CUSTOMER_SCREEN);
}
@Override
public void initialize(URL arg0, ResourceBundle arg1) {
}
@Override
public void setScreenParent(ScreensController screenParent) {
myController = screenParent;
}
Панель стека для хорошего макета:
public class ScreensController extends StackPane {
public ScreensController(){
}
private HashMap<String, Node> screens = new HashMap<>();
public void addScreen(String name, Node screen) {
screens.put(name, screen);
}
public boolean loadScreen(String name, String resource) {
try {
FXMLLoader myLoader = new FXMLLoader(getClass().getResource(resource));
Parent loadScreen = (Parent) myLoader.load();
ControlledScreen myScreenControler =
((ControlledScreen) myLoader.getController());
myScreenControler.setScreenParent(this);
addScreen(name, loadScreen);
return true;
}catch(Exception e) {
System.out.println(e.getMessage());
e.printStackTrace();
return false;
}
}
public boolean setScreen(final String name) {
if(screens.get(name) != null) { //screen loaded
final DoubleProperty opacity = opacityProperty();
//Is there is more than one screen
if(!getChildren().isEmpty()){
Timeline fade = new Timeline(
new KeyFrame(Duration.ZERO,
new KeyValue(opacity,1.0)),
new KeyFrame(new Duration(1000),
new EventHandler() {
@Override
public void handle(Event t) {
//remove displayed screen
getChildren().remove(0);
//add new screen
getChildren().add(0, screens.get(name));
Timeline fadeIn = new Timeline(
new KeyFrame(Duration.ZERO,
new KeyValue(opacity, 0.0)),
new KeyFrame(new Duration(800),
new KeyValue(opacity, 1.0)));
fadeIn.play();
}
}, new KeyValue(opacity, 0.0)));
fade.play();
} else {
//no one else been displayed, then just show
setOpacity(0.0);
getChildren().add(screens.get(name));
Timeline fadeIn = new Timeline(
new KeyFrame(Duration.ZERO,
new KeyValue(opacity, 0.0)),
new KeyFrame(new Duration(2500),
new KeyValue(opacity, 1.0)));
fadeIn.play();
}
return true;
} else {
System.out.println("screen hasn't been loaded!\n");
return false;
}
}
public boolean unloadScreen(String name) {
if(screens.remove(name) == null) {
System.out.println("Screen didn't exist");
return false;
} else {
return true;
}
}
}
интерфейс, чтобы каждый экран знал своего родителя:
public interface ControlledScreen {
public void setScreenParent(ScreensController screenPage);
}
Второй класс контроллера, чтобы проверить, работает ли стек (имеет файл FXML):
public class CustomerMenuController implements ControlledScreen, Initializable {
ScreensController myController;
@FXML
private FlowPane customerMenuFlow;
@Override
public void initialize(URL location, ResourceBundle resources) {
for (int i = 0; i < 3;i++){
new Customer();
}
Button [] menuButtons = new Button[Customer.customers.size()];
for (int i = 0; i < Customer.customers.size();i++){
menuButtons[i] = new Button("Customer " + i);
customerMenuFlow.getChildren().add(menuButtons[i]);
}
}
@Override
public void setScreenParent(ScreensController screenParent) {
myController = screenParent;
}
}
1 ответ
Вы не должны использовать primaryStage.setFullScreen(true);
для приложений изменяемого размера. Во всяком случае, не в этом контексте. Как только вы удалите эту строку, приложение запустится с предпочитаемым размером, но затем пользователь сможет перетаскивать углы окна, чтобы изменить размер приложения.