JavaFX - dwa okna w fullscreen

0

Witam

W jaki sposób mogę wyświetlić dwa okna w trybie pełnoekranowym naraz? Chodzi o to, że mam główną ramkę i po wciśnięciu przycisku pojawia się nowe okienko z komunikatem. Sęk w tym, że jeśli główna ramka jest w trybie pełnoekranowym , to druga pojawia się albo jako okno zwykłe (bez opcji setFullscreen(true), albo w osobnej instancji trybu pełnoekranowego. Czy można je wyświetlić jednocześnie?

0

Fullscreen działa bez problemu. Za bardzo nie wiem o co Ci chodzi.

package test;

import javafx.application.Application;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.BorderPane;
import javafx.stage.Stage;

public class FullScreenExample extends Application {
	 
	public Parent createContent() {
		
		/* layout */
		BorderPane layout = new BorderPane();
		
		/* layout -> center */
		Button button = new Button("Click Me <3");
		button.setOnAction((actionEvent) -> {
			Stage stage = new Stage();
			stage.setScene(new Scene(new BorderPane()));
			stage.setTitle("Stage no. 2");
			stage.setFullScreen(true);
			stage.show();
		});
		
		/* return layout */
		layout.setCenter(button);
		return layout;
	}
	
	@Override
	public void start(Stage stage) throws Exception {
		stage.setScene(new Scene(createContent()));
		stage.setTitle("Stage no. 1");
		stage.setFullScreen(true);
		stage.show();
	}
	
	public static void main(String[] args) {
		launch(args);
	}
}

Jeżeli myślisz o tym, żeby np. dwa okna były widoczne jednocześnie, wykorzystując jednak całą dostępną przestrzeń, tylko podzieloną równo na dwa (horyzontalnie, czy wertykalnie), to musisz pobrać informacje o danym wyświetlaczu, na którym wyświetlasz swoje obiekty i odpowiednio ustawić lokalizację wyświetlanych okien.

0

Coś takiego?

public class Window extends Application {
	public Parent createContent() {
		BorderPane layout = new BorderPane();
		Button button = new Button("Button");
		button.setOnAction((actionEvent)->{
			DialogWindow dw = new DialogWindow();
			dw.show();
		});
		layout.setCenter(button);
		return layout;
	}
	
	@Override
	public void start(Stage stage) throws Exception {
		stage.setScene(new Scene(createContent()));
		stage.setFullScreen(true);
		stage.show();
	}
	
	public static void main(String[] args) {
		launch(args);
	}
	
	private class DialogWindow extends Stage {
		public Parent createContent() {
			BorderPane layout = new BorderPane();
			Button button = new Button("OK");
			button.setOnAction((actionEvent) -> {
				close();
			});
			layout.setCenter(button);
			return layout;
		}
		
		DialogWindow() {
			this.setScene(new Scene(createContent()));
			this.setWidth(200);
			this.setHeight(200);
			this.initModality(Modality.APPLICATION_MODAL);
		}
	}
}
0

Zainteresuj się metodą initOwner dla drugiego obiektu stage. Dla drugiego stage-a ten pierwszy pełnoekranowy powinien być właścicielem.

0

Może najprościej przedstawie to na rysunku. Wyobraźmy sobie że siedzimy przed komputerem i patrzymy na ekran. Widzimy moją aplikację w trybie pełnoekranowym tak, jak na obrazku
Obraz1.png
po wciśnięciu przycisku tworzy się to, co widzimy na to:
Obraz2.png

0
import javafx.application.Application;
import javafx.geometry.Pos;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;

public class TestApp extends Application {

	private BorderPane layout;
	
	private BorderPane paneOne;
	private BorderPane paneTwo;
	private BorderPane paneThree;
	
	public Parent createContent() {
		
		/* layout */
		layout = new BorderPane();
		
		/* layout -> west */
		VBox vBox = new VBox(10);
		
		Button buttonOne = new Button("Button 1");
		buttonOne.setOnAction((actionEvent) -> {
			layout.setCenter(paneOne);
		});
		
		Button buttonTwo = new Button("Button 2");
		buttonTwo.setOnAction((actionEvent) -> {
			layout.setCenter(paneTwo);
		});
		
		Button buttonThree = new Button("Button 3");
		buttonThree.setOnAction((actionEvent) -> {
			layout.setCenter(paneThree);
		});
		
		/* layout -> west (ADD ITEMS) */
		vBox.getChildren().addAll(buttonOne, buttonTwo, buttonThree);
		vBox.setAlignment(Pos.CENTER);
		
		/* layout -> center */
		paneOne = new BorderPane();
		paneOne.setStyle("-fx-background-color: #ff000a;");
		
		paneTwo = new BorderPane();
		paneTwo.setStyle("-fx-background-color: #0042ff;");
		
		paneThree = new BorderPane();
		paneThree.setStyle("-fx-background-color: #00b834;");
		
		/* return layout */
		layout.setLeft(vBox);
		return layout;
	}
	
	@Override
	public void start(Stage stage) throws Exception {
		stage.setScene(new Scene(createContent()));
		stage.setFullScreen(true);
		stage.show();
	}
	
	public static void main(String[] args) {
		launch(args);
	}
}
0

No właśnie nie o to chodziło, pod tą wyskakującą ramką są jeszcze jakieś inne elementy, które tylko tymczasowo są zasłonięte przez wyskakującą ramkę

0

Podejrzewam że chodzi ci o takiego jakby Popup-a, który wyskakuje w głównym oknie. Jeśli chcesz go zrealizować za pomocą nowego okna to w momencie jego wywołania focus/kontekst jest przełączany na nowe okno a to główne które było w full screenie przechodzi do trybu okna. Żeby tak się nie stało musisz przypisać właściciela popup-a, w tym przypadku będzie to główne okno. Już pisałem jak to zrobić wcześniej.
Tutaj masz na stackoverflow przykład :
http://stackoverflow.com/a/15626204

1 użytkowników online, w tym zalogowanych: 0, gości: 1