JavaFX的全屏 - 根据屏幕大小调整内容(JavaFX fullscreen - resizin

2019-09-04 00:48发布

有没有什么办法让全屏(如果可能的话调整大小太)来代替清理一切(实际上它的作用是重新调整大小一样,但整个画面中的元素),以使实际的全屏模式? (如游戏,通常是什么做的是改变屏幕分辨率),使按钮和文本相应增长到屏幕/窗口的大小

此外,我怎么能删除该消息并点击“ESC”键退出全屏模式的影响?

编辑:用这种方式来让调整大小

@Override public void start(Stage stage) throws Exception{
    final int initWidth = 720;      //initial width
    final int initHeight = 1080;    //initial height
    final Pane root = new Pane();   //necessary evil

    Pane controller = new CtrlMainMenu();   //initial view
    controller.setPrefWidth(initWidth);     //if not initialized
    controller.setPrefHeight(initHeight);   //if not initialized
    root.getChildren().add(controller);     //necessary evil

    Scale scale = new Scale(1, 1, 0, 0);
    scale.xProperty().bind(root.widthProperty().divide(initWidth));     //must match with the one in the controller
    scale.yProperty().bind(root.heightProperty().divide(initHeight));   //must match with the one in the controller
    root.getTransforms().add(scale);

    final Scene scene = new Scene(root, initWidth, initHeight);
    stage.setScene(scene);
    stage.setResizable(true);
    stage.show();

    //add listener for the use of scene.setRoot()
    scene.rootProperty().addListener(new ChangeListener<Parent>(){
        @Override public void changed(ObservableValue<? extends Parent> arg0, Parent oldValue, Parent newValue){
            scene.rootProperty().removeListener(this);
            scene.setRoot(root);
            ((Region)newValue).setPrefWidth(initWidth);     //make sure is a Region!
            ((Region)newValue).setPrefHeight(initHeight);   //make sure is a Region!
            root.getChildren().clear();
            root.getChildren().add(newValue);
            scene.rootProperty().addListener(this);
        }
    });
}

Answer 1:

有一对夫妇的方式来调整你的UI。

发展规模字体大小

您可以通过设置缩放所有控件-fx-font-size.root场景的样式表。

例如,如果您应用以下样式表到场景中,然后所有的控件将规模扩大了一倍(因为默认字体大小为13像素)。

.root {-fx-字体大小:26px; }

以上将努力比例控制,这是罚款的事情,这是完全基于控制,但事情是图形和基于形状的不太好。

通过规模改造

应用规模在(0,0)变换旋转到场景的根节点。

Scale scale = new Scale(scaleFactor, scaleFactor);
scale.setPivotX(0);
scale.setPivotY(0);
scene.getRoot().getTransforms().setAll(scale);

要缩放游戏我开发,其中包括图形和各种形状,我使用的信拳击技术,其尺寸游戏窗口,以恒定的高宽比,(类似于字母拳击时看到观看4:在16 3的电视节目:9的屏幕)。

下面的代码SceneSizeChangeListener侦听更改场景大小和规模适当可用的场景大小场景的内容。

import javafx.application.Application;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.fxml.FXMLLoader;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.layout.Pane;
import javafx.scene.transform.Scale;
import javafx.stage.Stage;
import org.jewelsea.games.supersnake.layout.LayoutController;

import java.io.IOException;
import java.util.ResourceBundle;

/* Main JavaFX application class */
public class SuperSnake extends Application {
  public static void main(String[] args) { launch(args); }

  @Override public void start(final Stage stage) throws IOException {
    FXMLLoader loader = new FXMLLoader(
        getClass().getResource("layout/layout.fxml"),
        ResourceBundle.getBundle("org.jewelsea.games.supersnake.layout.text")
    );
    Pane root = (Pane) loader.load();

    GameManager.instance().setLayoutController(loader.<LayoutController>getController());

    Scene scene = new Scene(new Group(root));
    stage.setScene(scene);
    stage.show();

    GameManager.instance().showMenu();

    letterbox(scene, root);
    stage.setFullScreen(true);
  }

  private void letterbox(final Scene scene, final Pane contentPane) {
    final double initWidth  = scene.getWidth();
    final double initHeight = scene.getHeight();
    final double ratio      = initWidth / initHeight;

    SceneSizeChangeListener sizeListener = new SceneSizeChangeListener(scene, ratio, initHeight, initWidth, contentPane);
    scene.widthProperty().addListener(sizeListener);
    scene.heightProperty().addListener(sizeListener);
  }

  private static class SceneSizeChangeListener implements ChangeListener<Number> {
    private final Scene scene;
    private final double ratio;
    private final double initHeight;
    private final double initWidth;
    private final Pane contentPane;

    public SceneSizeChangeListener(Scene scene, double ratio, double initHeight, double initWidth, Pane contentPane) {
      this.scene = scene;
      this.ratio = ratio;
      this.initHeight = initHeight;
      this.initWidth = initWidth;
      this.contentPane = contentPane;
    }

    @Override
    public void changed(ObservableValue<? extends Number> observableValue, Number oldValue, Number newValue) {
      final double newWidth  = scene.getWidth();
      final double newHeight = scene.getHeight();

      double scaleFactor =
          newWidth / newHeight > ratio
              ? newHeight / initHeight
              : newWidth / initWidth;

      if (scaleFactor >= 1) {
        Scale scale = new Scale(scaleFactor, scaleFactor);
        scale.setPivotX(0);
        scale.setPivotY(0);
        scene.getRoot().getTransforms().setAll(scale);

        contentPane.setPrefWidth (newWidth  / scaleFactor);
        contentPane.setPrefHeight(newHeight / scaleFactor);
      } else {
        contentPane.setPrefWidth (Math.max(initWidth,  newWidth));
        contentPane.setPrefHeight(Math.max(initHeight, newHeight));
      }
    }
  }
}

下面是截图,你可以看到加框和缩放生效。 绿色的草地,中间是主要的游戏内容画面和规模上下,以适应可用的屏幕区域。 外绕木材纹理提供了填补了区里的黑色黑边,通常是如果你在不同的宽高比屏幕观看电视节目的可灵活大小的边界。 需要注意的是在下面的截图的背景是在扉页模糊,因为我让它如此,当比赛开始时,模糊效果被移除,无论大小的观点是清晰的。

窗口版本:

缩放全屏版本:

你可能会认为上述调整方法可能使诸事所有块状和像素化,但事实并非如此。 所有字体的和控制规模平稳。 所有标准的绘图和图形命令和CSS样式基于规模顺利,因为它们是基于所有矢量。 即使是位图图像很好地扩展,因为JavaFX的缩放图像时使用相当高品质的过滤器。

一招让上的图像缩放好是提供高分辨率图像,这样,当屏幕比例增加,JavaFX的系统已经更多的原始数据从工作。 例如,如果某个应用的优选的窗口尺寸是屏幕尺寸的四分之一,并且它包含一个64×64的图标,而是使用一个128×128的图标,使得当该应用被放置在全屏和所有元素缩放,缩放器有更多的生像素数据样本,以使用用于内插的值。

缩放也快,因为它是硬件加速。

我怎么能删除该消息并点击“ESC”键退出全屏模式的影响?

这是不可能的JavaFX中取出2.2全屏退出消息,它将在8 JavaFX的可能:

RT-15314允许受信任的应用程序来禁用全屏覆盖警告并禁用“在ESC退出”行为

这将是很好的时候这样做了,因为后来我的游戏将不会有“看我 - 我看起来像一个测试”对他们的感觉。



Answer 2:

“还我怎么能删除该邮件和点击效果‘ESC’键退出全屏模式?”

使用此代码:

stage.setFullScreenExitHint("");

这将改变字符串消息“按Esc退出全屏模式”为空字符串,这样就不会出现。



Answer 3:

您可以cpoy到JavaFXApplication这

Dimension resolution = Toolkit.getDefaultToolkit().getScreenSize();
double width = resolution.getWidth();
double height = resolution.getHeight(); 
double w = width/1280;  //your window width
double h = height/720;  //your window hight
Scale scale = new Scale(w, h, 0, 0);
root.getTransforms().add(scale);


文章来源: JavaFX fullscreen - resizing elements based upon screen size