我正在使用JavaFX,当我按下位于'出口附近的右角的最大化按钮时,我希望增加项目中所有元素的字体大小。按钮,可以这样做吗?我的开始项目是800x600,字体大小是18px,我想,当用户按下最大化按钮时,字体大小变为例如24px的。我使用的是Java 7,NetBeans和Scene Builder。 看到图片,我希望文本按钮大小全屏时它比那个小一个大!所以我想覆盖最大化按钮动作!谢谢!
答案 0 :(得分:2)
澄清最大化与全屏
您在问题中指向的按钮是最大化按钮。 Full screen mode与maximized 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的工作方式不同。
以下是此方法的示例:
较小尺寸的窗口(小字体)
当窗口大小不是很大时,使用较小的字体。
更大尺寸(包括最大化或全屏)窗口(更大字体)
当窗口大小较大时,使用较大的字体大小。
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概念足够相似,你应该能够从该链接中的信息中掌握它。
更多资源
对于更强大的解决方案,您可能需要查看: