在最大化模式下更改字体大小
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.
中的信息中掌握它
更多资源
如需更强大的解决方案,您可能需要查看:
我正在使用 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.
中的信息中掌握它更多资源
如需更强大的解决方案,您可能需要查看: