Guten abend.
Ich unternehme gerade meine ersten Schritte in JavaFX und bin auf ein Problem gestoßen dessen Ursache ich nicht herrausbekomme...
Was ich tun möchte:
Ich möchte eine Art von Desktoppane bauen ähnlich der JDesktoppane in Swing (in FX gibt es sowas ja scheinbar nicht als Standard-Componente)
Dazu habe ich eine Klasse FXDesktopPane erzeugt, die später die Fenster-verwaltung übernehmen soll, Dazu eine Klasse FXWindow die analog zum JInternalFrame funktionieren soll
Das FXWindow - Fenster ist im prinzip so aufgebaut, dasa es einen Bereich für den Fenster-Inhalt (contentpane) hat, und einen Bereich für den Fenstertitel und Fenster-Buttons X / Minimize / Maximize (windowTitlePane). Die Contentpane nimmt immer den gesamten Bereich des Fensters abzüglich der windowTitlePane ein.
Um das ganze zu testen habe ich mir zwei demo-fenster gemacht.
Problem ist, dass er mir den Hintergrund der windowTitlePane für das eine Fenster (Login) anzeigt, für das andere (Something) aber nicht. Wo liegt der Fehler?
FXDesktopPane code:
FXWindow code:
Demo Fenster 1 (LoginFenster)
Demo Fenster 2: Something
und die Main:
Ich unternehme gerade meine ersten Schritte in JavaFX und bin auf ein Problem gestoßen dessen Ursache ich nicht herrausbekomme...
Was ich tun möchte:
Ich möchte eine Art von Desktoppane bauen ähnlich der JDesktoppane in Swing (in FX gibt es sowas ja scheinbar nicht als Standard-Componente)
Dazu habe ich eine Klasse FXDesktopPane erzeugt, die später die Fenster-verwaltung übernehmen soll, Dazu eine Klasse FXWindow die analog zum JInternalFrame funktionieren soll
Das FXWindow - Fenster ist im prinzip so aufgebaut, dasa es einen Bereich für den Fenster-Inhalt (contentpane) hat, und einen Bereich für den Fenstertitel und Fenster-Buttons X / Minimize / Maximize (windowTitlePane). Die Contentpane nimmt immer den gesamten Bereich des Fensters abzüglich der windowTitlePane ein.
Um das ganze zu testen habe ich mir zwei demo-fenster gemacht.
Problem ist, dass er mir den Hintergrund der windowTitlePane für das eine Fenster (Login) anzeigt, für das andere (Something) aber nicht. Wo liegt der Fehler?
FXDesktopPane code:
Java:
package javaFXDemo;
import javafx.scene.layout.Pane;
public class FXDesktopPane extends Pane
{
public FXDesktopPane()
{
super();
this.setStyle("-fx-background: #cccccc;");
}
public void addWindow(FXWindow win)
{
this.getChildren().addAll(win);
}
@Override
public boolean isResizable()
{
return true;
}
}
FXWindow code:
Java:
public class FXWindow extends Region
{
double orgSceneX, orgSceneY;
double orgTranslateX, orgTranslateY;
private Pane contentPane;
private Pane windowTitlePane;
private Label windowTitle;
public FXWindow()
{
super();
contentPane = new Pane();
EventHandler<MouseEvent> circleOnMousePressedEventHandler = new EventHandler<MouseEvent>()
{
@Override
public void handle(MouseEvent t)
{
orgSceneX = t.getSceneX();
orgSceneY = t.getSceneY();
orgTranslateX = ((FXWindow)t.getSource()).getTranslateX();
orgTranslateY = ((FXWindow)t.getSource()).getTranslateY();
}
};
this.addEventHandler(MouseEvent.MOUSE_PRESSED, circleOnMousePressedEventHandler);
this.setOnMouseDragged(new EventHandler<MouseEvent>()
{
public void handle(MouseEvent event)
{
double offsetX = event.getSceneX() - orgSceneX;
double offsetY = event.getSceneY() - orgSceneY;
double newTranslateX = orgTranslateX + offsetX;
double newTranslateY = orgTranslateY + offsetY;
((FXWindow)event.getSource()).setTranslateX(newTranslateX);
((FXWindow)event.getSource()).setTranslateY(newTranslateY);
}
});
windowTitle = new Label("");
windowTitlePane = new HBox(10, windowTitle);
windowTitlePane.setPadding(new Insets(0, 0, 0, 3));
this.setStyle("-fx-background-color: #dddddd; -fx-border-color: #555555; -fx-border-style: solid; -fx-border-width: 3;");
windowTitlePane.setStyle("-fx-background-color: #ffffff;");
this.getChildren().addAll(windowTitlePane);
}
public void setTitle(String title)
{
windowTitle.setText(title);
}
public String getTitle()
{
return windowTitle.getText();
}
@Override
public boolean isResizable()
{
return true;
}
public Pane getContentPane()
{
return contentPane;
}
protected void setContentPane(Pane pane)
{
contentPane = pane;
getChildren().removeAll(contentPane);
getChildren().addAll(contentPane);
}
@Override
protected void layoutChildren()
{
super.layoutChildren();
double titleHeight = calcPrefHeightTitle();
windowTitlePane.resize(this.getWidth(), titleHeight);
contentPane.setTranslateY(titleHeight);
// to avoid display of components out of the viewable space of the contentpane
contentPane.setClip(new Rectangle(this.getWidth(), this.getHeight()-titleHeight));
// resize the content pane to match the window pane size
contentPane.resize(this.getWidth(), this.getHeight()-titleHeight);
}
private double calcPrefHeightTitle()
{
double h = 0;
for (Node n : windowTitlePane.getChildren())
{
System.out.println("child height: " + n.getLayoutBounds().getHeight() + " " + n.getClass());
double h2 = n.getLayoutBounds().getHeight();
if (h<h2) h=h2;
}
return h;
}
Demo Fenster 1 (LoginFenster)
Java:
public class LoginWindow extends FXWindow
{
public LoginWindow()
{
super();
Label userNameLb = new Label("Benutzer:");
Label passwordLb = new Label("Kennwort:");
TextField userNameTxt = new TextField();
PasswordField passwordTxt = new PasswordField();
Button loginBtn = new Button("Anmelden");
loginBtn.setId("loginbtn");
loginBtn.setOnAction(new EventHandler<ActionEvent>()
{
@Override
public void handle(ActionEvent event)
{
}
});
GridPane gp = new GridPane();
gp.setHgap(10);
gp.setVgap(10);
gp.setPadding(new Insets(25, 25, 25, 25));
gp.add(userNameLb, 0, 0);
gp.add(userNameTxt, 1, 0);
GridPane.setHgrow(userNameTxt, Priority.ALWAYS);
gp.add(passwordLb, 0, 1);
gp.add(passwordTxt, 1, 1);
GridPane.setHgrow(passwordTxt, Priority.ALWAYS);
gp.add(loginBtn, 1, 2);
GridPane.setHalignment(loginBtn, HPos.RIGHT);
this.setContentPane(gp);
this.setPrefWidth(350);
this.setPrefHeight(170);
this.setTitle("Login");
}
}
Demo Fenster 2: Something
Java:
package javaFXDemo;
import javafx.geometry.Insets;
import javafx.scene.control.Label;
import javafx.scene.control.TextField;
import javafx.scene.layout.GridPane;
public class SomethingWin extends FXWindow
{
public SomethingWin()
{
super();
GridPane gp = new GridPane();
gp.setHgap(10);
gp.setVgap(10);
gp.setPadding(new Insets(25, 25, 25, 25));
gp.add(new Label("Something"), 0, 0);
this.setContentPane(gp);
this.setPrefWidth(300);
this.setPrefHeight(300);
this.setTitle("Something");
}
}
und die Main:
Java:
package javaFXDemo;
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.stage.Stage;
public class FXDesktopDemo extends Application
{
public static void main(String[] args)
{
launch(args);
}
@Override
public void start(Stage primaryStage) throws Exception
{
FXDesktopPane d = new FXDesktopPane();
Scene sc = new Scene(d, 500, 500);
primaryStage.setScene(sc);
primaryStage.show();
d.addWindow(new SomethingWin());
d.addWindow(new LoginWindow());
}
}
Zuletzt bearbeitet: