保存并设置“未最大化”的窗口大小?
问题描述:
当用户关闭程序时,我想保存一些关于主窗口的信息,所以下次用户打开程序时,窗口具有相同的属性。保存并设置“未最大化”的窗口大小?
这容易使窗口是否最大化的事情:
- 得到: stage.isMaximized()
- 套装: stage.setMaximized(布尔最大化);
这也是很容易做到,如果没有最大化窗口:
- 得到: stage.getX()/ stage.getY()/ stage.getWidth()/ stage.getHeight ();
- 设置: stage.setX()/ stage.setY()/ stage.setWidth()/ stage.setHeight();
但是,如果窗口最大化,这些获取函数会给我们最大化窗口的尺寸和位置。如果我设置这些值并且用户将窗口恢复到非最大化状态,则窗口将保持与其最大化尺寸相似,而不是像用户所期望的那样缩小。
如何保存正在关闭的当前最大化窗口的“窗口化”阶段尺寸和位置,然后在程序重新打开时恢复此信息?
答
你可以使用这个应用程序来解决你的问题。
首先,创建一个名为properties.txt
的文本文件。其次,为这个文本文件添加一些默认值。现在,在舞台关闭时使用setOnCloseRequest
保存Stage
的属性。接下来,如果您有一个关闭舞台的Button
,请在使用Button
的onAction
处理程序按下按钮时保存Stage
的属性。不要忘记在应用程序启动时始终加载这些设置。
的properties.txt:
sceneHeight=300.0
sceneWidth=450.0
fullScreen=false
主营:
import java.io.*;
import java.util.*;
import java.util.logging.*;
import javafx.application.*;
import javafx.event.*;
import javafx.scene.*;
import javafx.scene.control.*;
import javafx.scene.layout.*;
import javafx.stage.*;
/**
*
* @author Sedrick
*/
public class JavaFXApplication56 extends Application {
@Override
public void start(Stage primaryStage)
{
Map<String, String> properties = loadProperties();
Button btn = new Button();
btn.setText("Toggle fullScreen");
btn.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent event)
{
if (properties.get("fullScreen").endsWith("true")) {
properties.put("fullScreen", "false");
primaryStage.setFullScreen(false);
}
else {
properties.put("fullScreen", "true");
primaryStage.setFullScreen(true);
}
}
});
Button btnExit = new Button();
btnExit.setText("Exit");
btnExit.setOnAction((event) -> {
properties.put("fullScreen", Boolean.toString(primaryStage.isFullScreen()));
if (!primaryStage.isFullScreen()) {
properties.put("sceneHeight", Double.toString(primaryStage.getHeight()));
properties.put("sceneWidth", Double.toString(primaryStage.getWidth()));
}
System.out.println("Closing properties:");
properties.forEach((key, value)
-> System.out.println("\t" + key + ":" + value));
System.out.println();
saveProperties(properties);
primaryStage.close();
});
HBox hBox = new HBox();
hBox.getChildren().addAll(btn, btnExit);
BorderPane root = new BorderPane();
root.setBottom(hBox);
if (properties.get("fullScreen").equals("true")) {
primaryStage.setFullScreen(true);
}
else {
primaryStage.setFullScreen(false);
}
double sceneWidth = Double.parseDouble(properties.get("sceneWidth"));
double sceneHeight = Double.parseDouble(properties.get("sceneHeight"));
Scene scene = new Scene(root, sceneWidth, sceneHeight);
primaryStage.setOnCloseRequest((event) -> {
properties.put("fullScreen", Boolean.toString(primaryStage.isFullScreen()));
if (!primaryStage.isFullScreen()) {
properties.put("sceneHeight", Double.toString(primaryStage.getHeight()));
properties.put("sceneWidth", Double.toString(primaryStage.getWidth()));
}
System.out.println("Closing properties:");
properties.forEach((key, value)
-> System.out.println("\t" + key + ":" + value));
System.out.println();
saveProperties(properties);
});
primaryStage.setTitle("Hello World!");
primaryStage.setScene(scene);
primaryStage.show();
}
/**
* @param args the command line arguments
*/
public static void main(String[] args)
{
launch(args);
}
public Map loadProperties()
{
File file = new File("properties.txt");
Map<String, String> properties = new HashMap();
try {
Scanner input = new Scanner(file);
while (input.hasNext()) {
String[] parts = input.nextLine().split("=");
properties.put(parts[0], parts[1]);
}
}
catch (FileNotFoundException ex) {
System.out.println(ex.toString());
}
System.out.println("Loading properties:");
properties.forEach((key, value)
-> System.out.println("\t" + key + ":" + value));
System.out.println();
return properties;
}
public void saveProperties(Map<String, String> properties)
{
StringBuilder stringBuilder = new StringBuilder();
for (String key : properties.keySet()) {
stringBuilder.append(key).append("=").append(properties.get(key)).append("\n");
}
try (BufferedWriter bw = new BufferedWriter(new FileWriter("properties.txt"))) {
bw.write(stringBuilder.toString());
}
catch (IOException ex) {
Logger.getLogger(JavaFXApplication56.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
如果窗口最大化不救的尺寸(您可以在维度保存到0 ,0并且从不使用它们。),只需在加载时保存isMaximized = true并将setMaximized设置为true即可。如果未将最大化集最大化为假并保存尺寸。加载时使用preferredSize()或perferredHeight和preferredWidth()。 – Sedrick
这没有帮助。当窗口最大化时,如果窗口未被最大化,我们需要获得窗口{X,Y,W,H}。 – JoshuaD