JavaFX Fenstergrösse automatisch Speichern und Laden

sedu

Neues Mitglied
Guten Tag,
zurzeit arbeite ich an einen Projektarbeit über Notizverwaltung.
Hab schon über Google ect recherchiert, dann kam ich auf euch zu, doch leider nicht den Thema gefunden :oops:.
Meine Frage ist, wie kann ich die Fenstergrösse speichern sobald es kleiner/grösser und verschoben wird?

Java:
package application;
	
import java.io.RandomAccessFile;
import java.nio.channels.FileChannel;
import java.util.prefs.Preferences;

import javafx.application.Application;
import javafx.application.Platform;
import javafx.stage.Stage;
import javafx.scene.Scene;
import javafx.scene.layout.AnchorPane;
import javafx.fxml.FXMLLoader;


public class Main extends Application {
	
	
	private Stage primaryStage;
	
	@Override
	public void start(Stage primaryStage) {
		try {
			AnchorPane root = (AnchorPane)FXMLLoader.load(getClass().getResource("Note.fxml"));
			Scene scene = new Scene(root);
			scene.getStylesheets().add(getClass().getResource("application.css").toExternalForm());
			
		    Preferences userPrefs = Preferences.userNodeForPackage(getClass());
		    // get window location from user preferences: use x=100, y=100, width=400, height=400 as default
		    double x = userPrefs.getDouble("stage.x", 100);
		    double y = userPrefs.getDouble("stage.y", 100);
		    double w = userPrefs.getDouble("stage.width", 1000);
		    double h = userPrefs.getDouble("stage.height", 750);
			
			primaryStage.setScene(scene);
			 primaryStage.setX(x);
			    primaryStage.setY(y);
			    primaryStage.setWidth(w);
			    primaryStage.setHeight(h);
			primaryStage.show();
		
			
		} catch(Exception e) {
			e.printStackTrace();
		}
	}
	
	
	
	
	@Override
	  public void stop() {
	    Preferences userPrefs = Preferences.userNodeForPackage(getClass());
	    userPrefs.putDouble("stage.x", primaryStage.getX());
	    userPrefs.putDouble("stage.y", primaryStage.getY());
	    userPrefs.putDouble("stage.width", primaryStage.getWidth());
	    userPrefs.putDouble("stage.height", primaryStage.getHeight());
	  }
	
	
	public static void main(String[] args) {
		
		try{
		    RandomAccessFile randomFile = new RandomAccessFile("single.class","rw");

		    FileChannel channel = randomFile.getChannel();

		    if(channel.tryLock() != null)
		    	launch(args);
		    else
		    	Platform.exit();
		}catch( Exception e ) { 
		    System.out.println(e.toString());
		}
		
		
	}
}
 
Zuletzt bearbeitet:

wolfgang63

Bekanntes Mitglied
Ich denke mal das sollte kein Problem sein.
Über Stage.getxxx kannst du jederzeit alle relevanten Daten abfragen und z.B. in einer Propertiedatei auf Platte speichern.
Beim nächsten Start liest du die Werte wieder ein und setzt dein Stage mit den neuen werten.
 

Ruzmanz

Top Contributor
Sieht ungefähr so aus (, für die Performance kannst du dir selbst was ausdenken):

Java:
primaryStage.widthProperty().addListener(new ChangeListener<Number>() {
				@Override
				public void changed(ObservableValue<? extends Number> observable, Number oldValue, Number newValue) {
					System.out.println("Speicher die Breite: " + newValue);
				}
			});
 

dzim

Top Contributor
Ich habe das im EventHandler, der auf das Beenden der Anwendung hört, erledigt:
Java:
private class ExitEventHandler implements EventHandler<WindowEvent> {
		
		private final DesktopDAO dao;
		private final Stage primaryStage;
		
		public ExitEventHandler(final DesktopDAO dao, final Stage primaryStage) {
			this.dao = dao;
			this.primaryStage = primaryStage;
		}
		
		@Override
		public void handle(WindowEvent event) {
			if (ApplicationInfo.getEnvironmentType() == Environment.DESKTOP && dao != null) {
				try {
					// TODO add isMaximized back to the saved values, there is no way in java7 to get the maximized state
					// dao.setPreference(WINDOW_MAXIMIZED, primaryStage.isMaximized() ? Boolean.TRUE : Boolean.FALSE);
					dao.setPreference(WINDOW_WIDTH, new Double(primaryStage.getWidth()));
					dao.setPreference(WINDOW_HEIGHT, new Double(primaryStage.getHeight()));
				} catch (DesktopDAOException e) {
					LOGGER.error("A problem occurred while saving the window preferences.", e);
				}
			}
			Platform.exit();
		}
	}

Verwendet wird das auf der primaryStage:
Java:
primaryStage.setOnCloseRequest(new ExitEventHandler(dao, primaryStage));

Das DAO ist mein POJO für die DB Operationen (SQLite).

Und beim Start der Anwendung mache ich folgendes:
- In meiner Main-Klasse habe ich ein paar defaults
Java:
	private static final double WINDOW_DEFAULT_WIDTH = 960;
	private static final double WINDOW_DEFAULT_HEIGHT = 450;
	
	private static final double WINDOW_MIN_WIDTH = 825;
	private static final double WINDOW_MIN_HEIGHT = 450;
	
	private static final String WINDOW_MAXIMIZED = "window.maximized";
	private static final String WINDOW_WIDTH = "window.width";
	private static final String WINDOW_HEIGHT = "window.height";
-Hilfsklasse "WindowSetup" wird aus der DB ausgelesen
Java:
private class WindowSetup {
		
		protected boolean maximized;
		protected double width;
		protected double height;
		
		protected WindowSetup() {
			maximized = false;
			width = WINDOW_DEFAULT_WIDTH;
			height = WINDOW_DEFAULT_HEIGHT;
		}
	}
- die Werte werden ausgelesen und in ein WindowSetup-Objekt geschrieben
Java:
	private void readWindowSetup(DesktopDAO dao, WindowSetup windowSetup) {
		if (dao == null) {
			LOGGER.warn("A problem while creating a DAO occured. It is still not initialized!");
		} else {
			Screen primaryScreen = Screen.getPrimary();
			Rectangle2D visualBounds = primaryScreen.getVisualBounds();
			try {
				Boolean lastMaximized = dao.getPreference(WINDOW_MAXIMIZED);
				Double lastWidth = dao.getPreference(WINDOW_WIDTH);
				if (lastWidth == null) {
					lastWidth = WINDOW_DEFAULT_WIDTH;
				}
				Double lastHeight = dao.getPreference(WINDOW_HEIGHT);
				if (lastHeight == null) {
					lastHeight = WINDOW_DEFAULT_HEIGHT;
				}
				if (visualBounds != null && lastWidth > visualBounds.getWidth() - 100) {
					lastWidth = visualBounds.getWidth() - 100;
				}
				if (visualBounds != null && lastHeight > visualBounds.getHeight() - 100) {
					lastHeight = visualBounds.getHeight() - 100;
				}
				windowSetup.maximized = lastMaximized == null ? false : lastMaximized.booleanValue();
				windowSetup.width = lastWidth == null ? WINDOW_DEFAULT_WIDTH : lastWidth.doubleValue();
				windowSetup.height = lastHeight == null ? WINDOW_DEFAULT_HEIGHT : lastHeight.doubleValue();
			} catch (DesktopDAOException e) {
				LOGGER.error("A problem occurred while reading the window preferences.", e);
			} catch (Exception e) {
				LOGGER.error("An unspecified problem occurred while reading the window preferences.", e);
			}
		}
	}
- während der Initilaisierung wird also folgendes gemacht
Java:
WindowSetup windowSetup = new WindowSetup();
readWindowSetup(dao, windowSetup);

Scene scene = new Scene(root, windowSetup.width, windowSetup.height);

Grüsse
dzim


Anmerkung: Die "Preferences" beziehen sich auf eine Key-Value-Tabelle in der DB, daher frage ich sie immer über den Key ab - das ist eher der banale Teil der DB, aber ich wollte nicht DB für Daten und Dateien für Config haben (eher geringe Grösse und Prefs waren ein "Abfallprodukt").
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
ruutaiokwu Swing windowStateChanged macht exakt das Gegenteil beim Verändern der Fenstergrösse AWT, Swing, JavaFX & SWT 3
ZH1896ZH JavaFX Wie kann ich die Fenstergrösse entsprechend dem Inhalt vergrössern/verkleinern AWT, Swing, JavaFX & SWT 2
A JFrame Fenstergrösse: Resizable vs. nicht Resizable AWT, Swing, JavaFX & SWT 3
P Swing Fenstergrösse festsetzen ? AWT, Swing, JavaFX & SWT 3
M Fenstergrösse an Bild anpassen AWT, Swing, JavaFX & SWT 13
S Swing Swing maximale Fenstergrösse ermitteln AWT, Swing, JavaFX & SWT 5
I Swing Bild wird erst bei manueller Änderung der Fenstergrösse gezeichnet AWT, Swing, JavaFX & SWT 3
A Fenstergrösse soll sich konstant verändern AWT, Swing, JavaFX & SWT 8
P Änderung der Fenstergrösse abragen und reagieren. AWT, Swing, JavaFX & SWT 3
G Fenstergrösse AWT, Swing, JavaFX & SWT 2
H Fenstergrösse fixieren AWT, Swing, JavaFX & SWT 7
JavaSchmecktLecker JavaFX JavaFX Ordner automatisch verlinken AWT, Swing, JavaFX & SWT 2
berserkerdq2 Skalieren sich javafx objekte automatisch auf die Bildschirmgröße AWT, Swing, JavaFX & SWT 6
berserkerdq2 Wie füge ich ein Bild in javafx mit dem Scenebuilder ein, das automatisch mitgezogen wird, wenn das Fenster vergrößert wird oder Vollbildmodus AWT, Swing, JavaFX & SWT 6
_user_q Gibt es eine Möglichkeit, in Java alle möglichen Zeichen automatisch tippen zu lassen? AWT, Swing, JavaFX & SWT 13
G JavaFX Wert aus DB lesen, wenn erfolgreich automatisch eine fxml laden, möglich? AWT, Swing, JavaFX & SWT 2
B JavaFX TableView-Zellen sollen automatisch so groß wie der größte Inhalt sein AWT, Swing, JavaFX & SWT 6
F JavaFX textField Ausgabe automatisch kopieren AWT, Swing, JavaFX & SWT 7
J Gridpane Breite in Scrollpane automatisch anpassen AWT, Swing, JavaFX & SWT 2
L ComboBox Wert automatisch auswählen AWT, Swing, JavaFX & SWT 6
L Swing Größe automatisch anpassen AWT, Swing, JavaFX & SWT 14
I CSS - backgroundImage - Größe automatisch an den Container anpassen AWT, Swing, JavaFX & SWT 1
P TreeView automatisch an große von Inhalt anpassen AWT, Swing, JavaFX & SWT 3
L Java FX Scrollpane automatisch resizen AWT, Swing, JavaFX & SWT 3
S Swing Bedienelemente ordnen sich automatisch neu an AWT, Swing, JavaFX & SWT 2
J JTextfield automatisch aus zweiter Klasse aktualisieren AWT, Swing, JavaFX & SWT 5
S Buttons und TextField automatisch vergrößern AWT, Swing, JavaFX & SWT 8
KilledByCheese 2D-Grafik Feld automatisch bewegen, in zeitabständen AWT, Swing, JavaFX & SWT 7
C AWT Textfelder werden nicht automatisch angezeigt AWT, Swing, JavaFX & SWT 2
G Properties automatisch laden AWT, Swing, JavaFX & SWT 10
W Bei Programmstart jRadioButton automatisch auswählen AWT, Swing, JavaFX & SWT 2
2 Zeit Differenz automatisch aktualisieren AWT, Swing, JavaFX & SWT 1
C Geloest: JTextfield: Titel automatisch entfernen, sobald Text eingegeben wird AWT, Swing, JavaFX & SWT 1
H AWT Fenster- und JLabel-Größe automatisch anpassen AWT, Swing, JavaFX & SWT 2
S Swing Automatisch 2px Rahmen in Windows 8 AWT, Swing, JavaFX & SWT 0
G Swing ComboBoxItem automatisch wählen AWT, Swing, JavaFX & SWT 4
B Swing Form undecorated: Beim Bewegen geht die Maus immer automatisch zur linken Seite. AWT, Swing, JavaFX & SWT 7
I JTable Spalten automatisch dem Inhalt anpassen! AWT, Swing, JavaFX & SWT 6
0 JTable Spaltenbreite automatisch an Inhalt anpassne geht nicht AWT, Swing, JavaFX & SWT 3
A combobox automatisch in ein textfeld wechseln AWT, Swing, JavaFX & SWT 3
K JSpinner in passender Breite erstellen oder automatisch anpassen AWT, Swing, JavaFX & SWT 2
C TextFeld in Verbindung zur ComboBox automatisch aktualisieren AWT, Swing, JavaFX & SWT 7
D JTable width automatisch anpassen AWT, Swing, JavaFX & SWT 4
R Swing Wie kann man Internal Frames automatisch ausrichten lassen? AWT, Swing, JavaFX & SWT 3
E JToggleButton automatisch nach drücken loslassen AWT, Swing, JavaFX & SWT 3
R Größe/Anordnung der Gui-Elemente automatisch? AWT, Swing, JavaFX & SWT 6
W Bildgröße automatisch an Komponenten anpassen AWT, Swing, JavaFX & SWT 3
B JScrollPane scrollt nicht immer automatisch AWT, Swing, JavaFX & SWT 2
C SWT-Elemente an View-Fenster angleichen und automatisch resizen AWT, Swing, JavaFX & SWT 3
B Fenstergröße automatisch skalieren AWT, Swing, JavaFX & SWT 7
C Textfeld automatisch befüllen AWT, Swing, JavaFX & SWT 6
R JTable: Spaltenbreite automatisch anpassen AWT, Swing, JavaFX & SWT 3
J SWT Dialog in Dialog automatisch öffnen AWT, Swing, JavaFX & SWT 19
W LayoutManager GridBag richtig nutzen - Komponenten richtig anordnen und automatisch vergrößern AWT, Swing, JavaFX & SWT 5
X JEditorPane Größe in JDialog automatisch anpassen AWT, Swing, JavaFX & SWT 2
U JComboBox automatisch zuklappen AWT, Swing, JavaFX & SWT 7
Y JCheckBoxen automatisch anlegen AWT, Swing, JavaFX & SWT 6
M Swing Eingabe auf JTextField automatisch ausgeben auf JLabel AWT, Swing, JavaFX & SWT 2
J Swing JList: Neue Zeilen mit fireIntervalAdded sind automatisch selektiert AWT, Swing, JavaFX & SWT 2
M LayoutManager JTextfield vergrößern sich automatisch AWT, Swing, JavaFX & SWT 4
T Swing Dialoginhalt automatisch anpassen während Größenänderung AWT, Swing, JavaFX & SWT 2
N ActionListener automatisch selektieren AWT, Swing, JavaFX & SWT 6
N JFrame mit Elementen an die Bildschirmgröße automatisch anpassen AWT, Swing, JavaFX & SWT 3
aze JTable automatisch vergrößern wenn das zugehörige JFrame vergrößert wird AWT, Swing, JavaFX & SWT 13
F Button soll automatisch geklickt werden AWT, Swing, JavaFX & SWT 3
R JSplitPane automatisch ausblenden AWT, Swing, JavaFX & SWT 13
H Schriftgröße automatisch an JLabel anpassen AWT, Swing, JavaFX & SWT 6
S JTable Float Column fuegt automatisch Punkt hinzu wenn man Zahlen eingibt. AWT, Swing, JavaFX & SWT 21
G SWT - TextFeld automatisch aktualisieren AWT, Swing, JavaFX & SWT 15
G JSplitPane unf JTable automatisch anpassen AWT, Swing, JavaFX & SWT 2
K JFrame + 2 Bildschirme -> automatisch auf einem Bildschir AWT, Swing, JavaFX & SWT 5
A Programm automatisch in den Vordergrund AWT, Swing, JavaFX & SWT 5
G jTable, spezille Zelle automatisch füllen AWT, Swing, JavaFX & SWT 13
S JList automatisch scrollen AWT, Swing, JavaFX & SWT 8
J JScrollPane soll automatisch zu einem punkt scrollen AWT, Swing, JavaFX & SWT 4
G Textarea soll automatisch mitrollen AWT, Swing, JavaFX & SWT 2
Z JTable automatisch zu einer Zeile scrollen AWT, Swing, JavaFX & SWT 4
S Frame grösse automatisch anpassen? AWT, Swing, JavaFX & SWT 1
K Automatisch einen Dialog schliessen AWT, Swing, JavaFX & SWT 15
J resize eines Bildes automatisch berechnen lassen? AWT, Swing, JavaFX & SWT 2
G Größe von SWT-Label automatisch anpassen AWT, Swing, JavaFX & SWT 5
D JTree - Knoten einfügen und automatisch in den Editiermodus AWT, Swing, JavaFX & SWT 2
S JScrollPane > JPanel - automatisch scrollen AWT, Swing, JavaFX & SWT 2
Z Java Applet Fenster automatisch an Bildschirmgröße anpassen AWT, Swing, JavaFX & SWT 4
T Datum in Textfeld automatisch formatieren AWT, Swing, JavaFX & SWT 8
R Tree automatisch öffnen AWT, Swing, JavaFX & SWT 7
N Tree automatisch öffnen AWT, Swing, JavaFX & SWT 2
G Wie schließen Fenster automatisch? AWT, Swing, JavaFX & SWT 12
S JCOntentPane ist automatisch groß? AWT, Swing, JavaFX & SWT 6
R JTable zu einem bestimmten Eintrag automatisch scrollen? AWT, Swing, JavaFX & SWT 2
S Namen von automatisch erzeugten JTextFields herausfinden… AWT, Swing, JavaFX & SWT 4
Z Column Breite in JTable automatisch an Inhalt anpassen AWT, Swing, JavaFX & SWT 3
R JTable, automatisch im Edit Modus AWT, Swing, JavaFX & SWT 2
thE_29 JFrame automatisch maximiert darstellen AWT, Swing, JavaFX & SWT 7
M JScrollPane soll automatisch scrollen AWT, Swing, JavaFX & SWT 5
V Ein JPEG-Bild in einem Label automatisch anpassen AWT, Swing, JavaFX & SWT 6
A JButton automatisch akivieren? AWT, Swing, JavaFX & SWT 7
T jComboBox automatisch ausklappen AWT, Swing, JavaFX & SWT 5
Z JTextArea in JScrollPane automatisch scrollen AWT, Swing, JavaFX & SWT 2
G JTable: Spaltenbreite automatisch setzen AWT, Swing, JavaFX & SWT 4

Ähnliche Java Themen

Neue Themen


Oben