在最大化模式下更改字体大小

change fontsize in maximize mode

我正在使用 JavaFX,我想在按下 'exit' 按钮附近右角的最大化按钮时增大项目中所有元素的字体大小,有可能这样做吗?我的起始项目是 800x600,字体大小为 18px,我想,当用户按下最大化按钮时,字体大小变为例如24 像素。我正在使用 Java 7、NetBeans 和 Scene Builder。 看图片,我希望全屏时文本按钮的大小比小按钮大!所以我想覆盖最大化按钮操作!谢谢!

编辑: 我想在用户按下此按钮时增加字体大小: 我该怎么做?

最大化与全屏的说明

您在问题中指向的按钮是最大化按钮。 Full screen mode is different from a maximized window(在大多数 windowing 系统中)。

为什么你不想列表最大化属性

您可以成为 maximize property of the window and set the font size as you wish based upon the maximize property value, similar to outlined here: Listener for a Stage minimizing, maximizing, etc 的听众。然而,我对此的测试并不是一个非常可靠的解决方案,因为(在 Mac 上最大化 属性 的当前 JavaFX 8u60 实现),当用户按下最大化按钮时会触发侦听器(并且最大化的 属性 设置为 true),但是如果用户稍后通过 window 边框手动调整 window 的大小,则最大化的 属性 保持为真并且不会触发任何侦听器请注意,window 不再最大化(这实际上可能是 JavaFX 8u60 的 Mac 实现中的错误)。因此,您可以捕获最大化事件并在最大化时调整 UI 的大小,但当不再最大化时,没有事件将您的 UI 重置为正常(未最大化)视图。

改用根布局边界

一个更健壮的实现似乎实现了一种响应式布局算法,监听场景布局边界的当前大小,并根据布局边界的变化进行不同的布局(或字体大小)。这些概念与 responsive web design 类似,尽管实现与基于 HTML 的网站不同,因为 CSS 和 JavaFX 中的布局与 HTML 不同。

这是此方法的示例:

较小的字号window(小字体)

当window尺寸不是很大时,使用较小尺寸的字体。

更大的尺寸(包括最大化或全屏)window(更大的字体)

当window字号较大时,使用较大的字号。

MaximizeFontResponder.java

import javafx.application.Application;
import javafx.collections.ObservableList;
import javafx.geometry.Bounds;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.layout.*;
import javafx.stage.Stage;

public class MaximizeFontResponder extends Application {

    private static final String MAXIMIZED_ROOT_STYLE_CLASS = "maximized-root";
    private static final double FONT_SIZE_WIDTH_ON_THRESHOLD = 800;
    private static final double FONT_SIZE_HEIGHT_ON_THRESHOLD = 400;
    private static final double FONT_SIZE_WIDTH_OFF_THRESHOLD = 780;
    private static final double FONT_SIZE_HEIGHT_OFF_THRESHOLD = 380;

    @Override
    public void start(Stage stage) throws Exception {
        StackPane layout = new StackPane(new Label("Now is the time for all good men\nto come to the aid of the party."));

        Scene scene = new Scene(layout);
        scene.getStylesheets().add(
                MaximizeFontResponder.class.getResource(
                        "font-responder.css"
                ).toURI().toURL().toExternalForm()
        );
        stage.setScene(scene);

        refreshRootFontSize(layout);
        scene.getRoot().layoutBoundsProperty().addListener((observable, oldBounds, newBounds) -> {
            refreshRootFontSize(layout);
        });

        stage.show();
    }

    private void refreshRootFontSize(Pane root) {
        final ObservableList<String> rootStyleClass = root.getStyleClass();
        final Bounds layoutBounds = root.getLayoutBounds();

        if (layoutBounds.getWidth() >= FONT_SIZE_WIDTH_ON_THRESHOLD
                && layoutBounds.getHeight() >= FONT_SIZE_HEIGHT_ON_THRESHOLD
                && !rootStyleClass.contains(MAXIMIZED_ROOT_STYLE_CLASS)) {
            rootStyleClass.add(MAXIMIZED_ROOT_STYLE_CLASS);
        }

        if (layoutBounds.getWidth() <= FONT_SIZE_WIDTH_OFF_THRESHOLD
                || layoutBounds.getHeight() <= FONT_SIZE_HEIGHT_OFF_THRESHOLD) {
            rootStyleClass.remove(MAXIMIZED_ROOT_STYLE_CLASS);
        }
    }

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

字体-responder.css

.root { -fx-font-size: 20px; } .maximized-root { -fx-font-size: 40px; }

此示例中用于调整字体和 UI 组件大小的技术基于 CSS 定义的 -fx-font-size 在以下相关问题的答案中进行了解释:

  • javafx automatic resizing and button padding
  • Bind Font Size in JavaFX?

关于 em 单位和 control/layout 尺寸的注意事项

虽然该示例不包含任何控件,但如果包含,这些控件的大小也会更大以适应更大的字体大小,因为所有 JavaFX 控件的大小都是基于 em 单位的。如果您希望 UI 布局的其余部分也以相同的方式进行调整,那么也可以根据 em units 而不是绝对像素来调整其大小。请注意,我已经 link 为 em 单元 link 编辑了一个基于 HTML 的资源(并且 JavaFX CSS 不同于 HTML CSS),但一般的 em 概念非常相似,您应该能够从 link.

中的信息中掌握它

更多资源

如需更强大的解决方案,您可能需要查看: