2014-10-05 2 views
3

Я программирую приложение javafx, и я хочу, чтобы мое окно не выходило за пределы экрана, поскольку для этого мало пользы. Так, например, окно не должно быть перетаскивано, так что половина его отключена от экрана.Хранить окно javafx внутри границ экрана

public class ui extends Application{ 
    public static void main (String[] args){ 
     launch(args); 
    } 
    public void start(Stage mainStage){ 
     mainStage.initStyle(StageStyle.DECORATED); 
     Rectangle2D mainScreen = Screen.getPrimary().getVisualBounds(); 
     mainStage.setWidth(mainScreen.getWidth()); 
     mainStage.setHeight(mainScreen.getHeight()); 

     BorderPane mainPane = new BorderPane(background); 

     Scene mainScene = new Scene(mainPane, Color.BLACK); 
     mainStage.setScene(mainScene); 

     mainStage.show(); 
    } 
} 
+0

Если вы можете бросить нам часть своего кода, мы сможем сделать гораздо больше для вас. Прямо сейчас, я могу только догадываться, что у вас есть ... – DreadHeadedDeveloper

+0

@DreadHeadedDeveloper Мне нужно только общее решение, поэтому я не уверен, что это поможет, но я добавлю код. – LilSweden

ответ

4

Есть много причин, чтобы не делать этого: вы должны быть осторожны, чтобы не отключить функции пользователя может ожидать, например, перетаскивание через расширенный рабочий стол (т.е. перетаскивание между несколькими физическими дисплеями) или перемещением окна между виртуальными рабочими столами (например, «Пространства» в Mac OS X или эквивалентные системы в Linux).

Возможно, самое лучшее, что вы можете здесь сделать, это наблюдать за положением окна с прослушивателем и отталкивать его в наилучшее место, если оно находится за пределами желаемых границ. Это, вероятно, немного неудовлетворительное как пользовательский опыт, но достигает функциональность вы хотите:

import javafx.application.Application; 
import javafx.beans.value.ChangeListener; 
import javafx.geometry.BoundingBox; 
import javafx.geometry.Bounds; 
import javafx.geometry.Rectangle2D; 
import javafx.stage.Screen; 
import javafx.stage.Stage; 

public class ConstrainedWindow extends Application { 

    @Override 
    public void start(Stage primaryStage) { 

     Bounds allScreenBounds = computeAllScreenBounds(); 
     ChangeListener<Number> boundsListener = (obs, oldValue, newValue) -> { 
      double x = primaryStage.getX(); 
      double y = primaryStage.getY(); 
      double w = primaryStage.getWidth(); 
      double h = primaryStage.getHeight(); 
      if (x < allScreenBounds.getMinX()) { 
       primaryStage.setX(allScreenBounds.getMinX()); 
      } 
      if (x + w > allScreenBounds.getMaxX()) { 
       primaryStage.setX(allScreenBounds.getMaxX() - w); 
      } 
      if (y < allScreenBounds.getMinY()) { 
       primaryStage.setY(allScreenBounds.getMinY()); 
      } 
      if (y + h > allScreenBounds.getMaxY()) { 
       primaryStage.setY(allScreenBounds.getMaxY() - h); 
      } 
     }; 
     primaryStage.xProperty().addListener(boundsListener); 
     primaryStage.yProperty().addListener(boundsListener); 
     primaryStage.widthProperty().addListener(boundsListener); 
     primaryStage.heightProperty().addListener(boundsListener); 
     primaryStage.show(); 
    } 

    private Bounds computeAllScreenBounds() { 
     double minX = Double.POSITIVE_INFINITY ; 
     double minY = Double.POSITIVE_INFINITY ; 
     double maxX = Double.NEGATIVE_INFINITY ; 
     double maxY = Double.NEGATIVE_INFINITY ; 
     for (Screen screen : Screen.getScreens()) { 
      Rectangle2D screenBounds = screen.getBounds(); 
      if (screenBounds.getMinX() < minX) { 
       minX = screenBounds.getMinX(); 
      } 
      if (screenBounds.getMinY() < minY) { 
       minY = screenBounds.getMinY() ; 
      } 
      if (screenBounds.getMaxX() > maxX) { 
       maxX = screenBounds.getMaxX(); 
      } 
      if (screenBounds.getMaxY() > maxY) { 
       maxY = screenBounds.getMaxY() ; 
      } 
     } 
     return new BoundingBox(minX, minY, maxX-minX, maxY-minY); 
    } 

    public static void main(String[] args) { 
     launch(args); 
    } 
} 
+0

-> лямбда-выражение, верно? – LilSweden

+0

Да ............ –

+0

Почему «....»? – LilSweden

0

Вот несколько идей, которые могут помочь

public final int width = java.awt.Toolkit.getDefaultToolkit().getScreenSize().width; 
public final int height = java.awt.Toolkit.getDefaultToolkit().getScreenSize().height; 

Этих 2 строки коды, позволят вам получить длины и ширины большинства экранов экрана компьютера.

Далее я бы установил метод, который постоянно получает позицию вашего окна или, по крайней мере, изменяет значение в любое время, когда он перемещается, а затем устанавливает ограничения, основываясь на ваших знаниях размера экрана и размера окна. Один из способов сделать это было бы что-то вроде ...

if(yWinPos > (height - wHeight))//wHeight is actual height of the window, not the y pos of window 
{ 

//code that prevents it from moving past the bottom part of screen 

} 

Позвольте мне знать, если это любая помощь, или если он не отвечает на вопрос, и я буду править мой ответ в ответ.

+1

Не смешивайте код AWT с кодом JavaFX, если вам действительно не нужно. –

+0

@James_D Было бы так плохо? Мы используем его только для того, чтобы получить размеры экрана, а затем мы закончили с ним, просто сохраним его в int, а затем переместимся на – DreadHeadedDeveloper

+3

. В этом случае это, наверное, хорошо, но в целом у вас нет реальной гарантии, что даже представляет собой набор инструментов AWT. Иногда вам нужно сделать это предположение, чтобы получить нужную функциональность (например, взаимодействовать с панелью задач), но когда одно и то же можно сделать, используя только один инструментарий, всегда лучше. –

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