在最大化模式下更改fontsize

时间:2015-10-23 12:25:29

标签: layout javafx font-size

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

One Two

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

1 个答案:

答案 0 :(得分:2)

澄清最大化与全屏

您在问题中指向的按钮是最大化按钮。 Full screen modemaximized window不同(在大多数窗口系统中)。

为什么您不想列出最大化属性

您可以成为maximize property of the window的监听者,并根据最大属性值设置字体大小,类似于此处概述的:Listener for a Stage minimizing, maximizing, etc。然而,我对此的测试并不是一个非常强大的解决方案,因为(使用Mac上最大化属性的当前JavaFX 8u60实现),当用户按下最大化按钮时触发器被触发(并且最大化属性设置为true) ),但如果用户稍后通过窗口边框手动调整窗口大小,则最大化属性保持为真,并且不会触发监听器以注意窗口不再最大化(这可能实际上是JavaFX 8u60的Mac实现中的错误) )。因此,您可以捕获最大化事件并在最大化时调整UI大小,但是当不再最大化时,没有事件将UI重置为正常(未最大化)视图。

听取根布局边界

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

以下是此方法的示例:

较小尺寸的窗口(小字体)

当窗口大小不是很大时,使用较小的字体。

smaller size (small font)

更大尺寸(包括最大化或全屏)窗口(更大字体)

当窗口大小较大时,使用较大的字体大小。

Larger size

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

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

关于em单位和控件/布局大小的注意事项

虽然该示例不包含任何控件,但如果它包含任何控件,那么这些控件的大小也会更大以适应更大的字体大小,因为所有JavaFX控件都是基于em单位调整大小的。如果您希望UI布局的其余部分也以相同的方式进行调整,那么还要根据em units而不是绝对像素来调整它的大小。注意我已经为em单元链接链接了基于HTML的资源(而JavaFX CSS与HTML CSS不同),但是一般的em概念足够相似,你应该能够从该链接中的信息中掌握它。

更多资源

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