2015-11-16 2 views
0

Я не могу получить это, чтобы изменить размер, он всегда подходит для предпочтительного размера для каждого экрана. Это не идеально подходит для полноэкранного приложения. Это Bascially просто становится немного окно в верхнем левом углу = (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; 
} 

Stack панель для хорошего макета:

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); 
} 

Второй класс контроллера, чтобы убедиться, что stackpane работы (есть файл 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; 
    } 



} 

ответ

0

Вы не должны использовать primaryStage.setFullScreen(true); для res izable приложений. В любом случае, не в этом контексте. После удаления этой строки приложение начнет с его предпочтительного размера, но затем пользователь сможет перетащить углы окна, чтобы изменить размер приложения.

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