澄清最大与全屏
您在问题中指向的按钮是最大化按钮。全屏模式不同于最大化窗口(在大多数窗口系统中)。
为什么您不想列出最大化属性
您可以使用侦听器来监听窗口的maximum属性,并根据maximum属性值设置所需的字体大小,类似于此处概述:用于最小化,最大化Stage的侦听器等。但是,我对此的测试并不是一个非常可靠的解决方案,因为(使用MacFX的当前JavaFX 8u60实现,在Mac上实现了最大化),当用户按下“最大化”按钮(且最大化属性设置为true)时,将触发监听器),但是如果用户稍后通过窗口边框手动调整窗口大小,则maximated属性保持为true,并且不会触发任何侦听器以指出该窗口不再最大化(这实际上可能是JavaFX 8u60的Mac实现中的错误)。因此,您可以捕获最大化事件,并在最大化时调整UI的大小,但是当不再最大化时,则没有事件可将UI重置为正常(未最大化)视图。
改用root布局边界
一个更健壮的实现似乎实现了一种响应式布局算法,侦听场景的布局边界的当前大小,并根据布局边界的变化执行不同的布局(或字体大小)。尽管实现与基于HTML的网站不同,但这些概念类似于响应式Web设计,因为JavaFX中的CSS和布局与HTML的工作方式不同。
这是此方法的示例:
较小的窗口(小字体)
当窗口大小不是很大时,使用较小的字体。
较大的窗口(包括最大化或全屏)窗口(较大的字体)
当窗口较大时,将使用较大的字体。
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);
}
}
font-responder.css
.root {-fx-font-size:20px; } .maximized-root {-fx-font-size:40px; }
在以下有关问题的答案中,解释了此样本中基于CSS定义的-fx-font-size调整字体和UI组件大小的技术:
关于电磁单元和控制/布局尺寸的注意事项
尽管该示例不包含任何控件,但如果包含,则它们的大小也将增大,以容纳较大的字体,因为所有JavaFX控件均基于em单位进行大小调整。如果您希望其余的UI布局也以相同的方式进行调整,则还应根据em单位(而不是绝对像素)调整其大小。注意,我已经为em单元链接链接了一个基于HTML的资源(JavaFX CSS与HTML CSS有所不同),但是一般的em概念非常相似,因此您应该能够从该链接中的信息中掌握它。
更多资源
对于更强大的解决方案,您可能需要研究:
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句