Hallo zusammen,
ich habe mich vor kurzen daran gemacht, ein kleines Spaß-Projekt von mir (Passwort Manager) von seiner bestehenden SWT-Implementieren auf JavaFX umzustellen.
Mittels e(fx)clipse möchte ich das gerne in meine Eclipse 3.x basierte Plugin-Platform integrieren (also neben anderen z.B. SWT-Komponenten). Dank e(fx)clipse funktioniert das auch Prinzipiell, aber ich möchte die Anwendung erst einmal rein in JFX schreiben, bevor ich mich daran wage. Ich möchte das Framework erst mal "kennen lernen"...
Mein Problem so weit ist (von einigen kleinen Unbequemlichkeiten wie kein TreeTable-Widget), dass ich mit dem Layout echt Probleme hab.
Parent ist eine VBox, auf die ein Menü und eine Toolbar gelegt werden. Das dritte Element der VBox soll dann das Bearbeitungsfenster werden.
Das Problem ist, das ein TreeView, der im Hauptbereich zu sehen ist, nicht skaliert. Er wird zwar kleiner, wenn das Fenster kleiner als seine Ursprungsgröße wird, aber nie größer als die Ursprungsgröße, skaliert also niemals auf die größe des Fensters (bzw. die Höhe ist es, die mich interessiert)
Ich seh' das Layout vor lauter Panes nicht mehr...
Anbei der Quellcode der bisher drei UI-Klassen. Seht ihr vielleicht, wo da das Problem liegt???
Vielen Dank im Voraus!!!
Daniel
Die Application-Klasse:
Hier wird der Inhalt des Menüs und der Toolbar erstellt:
Hier die Klasse, die für das Hauptfenster zuständig ist. Problem, wie beschrieben: der TreeView skaliert nicht auf die Größe des Fensters.
ich habe mich vor kurzen daran gemacht, ein kleines Spaß-Projekt von mir (Passwort Manager) von seiner bestehenden SWT-Implementieren auf JavaFX umzustellen.
Mittels e(fx)clipse möchte ich das gerne in meine Eclipse 3.x basierte Plugin-Platform integrieren (also neben anderen z.B. SWT-Komponenten). Dank e(fx)clipse funktioniert das auch Prinzipiell, aber ich möchte die Anwendung erst einmal rein in JFX schreiben, bevor ich mich daran wage. Ich möchte das Framework erst mal "kennen lernen"...
Mein Problem so weit ist (von einigen kleinen Unbequemlichkeiten wie kein TreeTable-Widget), dass ich mit dem Layout echt Probleme hab.
Parent ist eine VBox, auf die ein Menü und eine Toolbar gelegt werden. Das dritte Element der VBox soll dann das Bearbeitungsfenster werden.
Das Problem ist, das ein TreeView, der im Hauptbereich zu sehen ist, nicht skaliert. Er wird zwar kleiner, wenn das Fenster kleiner als seine Ursprungsgröße wird, aber nie größer als die Ursprungsgröße, skaliert also niemals auf die größe des Fensters (bzw. die Höhe ist es, die mich interessiert)
Ich seh' das Layout vor lauter Panes nicht mehr...
Anbei der Quellcode der bisher drei UI-Klassen. Seht ihr vielleicht, wo da das Problem liegt???
Vielen Dank im Voraus!!!
Daniel
Die Application-Klasse:
Java:
public class PWMJFXApplication extends Application {
@Override
public void start(Stage primaryStage) {
primaryStage.setTitle("PWM - The Password Manager");
VBox root = new VBox(0);
PWMMainWindow window = new PWMMainWindow(root);
window.setCreateMenu(true);
window.createContent();
Scene scene = new Scene(root, 1024, 800);
primaryStage.setScene(scene);
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}
}
Hier wird der Inhalt des Menüs und der Toolbar erstellt:
Java:
public class PWMMainWindow {
private final Pane root;
private boolean createMenu = true;
private boolean createToolbar = true;
public PWMMainWindow(Pane root) {
this.root = root;
}
public void setCreateMenu(boolean createMenu) {
this.createMenu = createMenu;
}
public boolean isCreateMenu() {
return createMenu;
}
public void setCreateToolbar(boolean createToolbar) {
this.createToolbar = createToolbar;
}
public boolean isCreateToolbar() {
return createToolbar;
}
public void createContent() {
if (createMenu) {
MenuBar menubar = new MenuBar();
menubar.setUseSystemMenuBar(true);
createMenuBar(menubar);
root.getChildren().add(menubar);
}
if (createToolbar) {
ToolBar toolbar = new ToolBar();
createToolbar(toolbar);
root.getChildren().add(toolbar);
}
PWMEditorWindow editor = new PWMEditorWindow();
root.getChildren().add(editor.createContent());
}
private void createMenuBar(MenuBar menubar) {
// file menu
Menu file = new Menu("_File");
MenuItem fileOpenItem = new MenuItem("_Open",
PWMImageResource.getImageView(PWMImageResourceType.OPEN));
MenuItem fileSaveItem = new MenuItem("_Save",
PWMImageResource.getImageView(PWMImageResourceType.SAVE));
MenuItem fileSaveAsItem = new MenuItem("Save As...",
PWMImageResource.getImageView(PWMImageResourceType.SAVE_AS));
MenuItem fileExitItem = new MenuItem("E_xit",
PWMImageResource.getImageView(PWMImageResourceType.EXIT));
fileOpenItem.setAccelerator(KeyCombination.valueOf("Ctrl+O"));
fileSaveItem.setAccelerator(KeyCombination.valueOf("Ctrl+S"));
fileExitItem.setAccelerator(KeyCombination.valueOf("Ctrl+X"));
fileExitItem.setOnAction(new PWMEventHandler(PWMEventHandlerType.EXIT));
file.getItems().addAll(fileOpenItem, new SeparatorMenuItem(),
fileSaveItem, fileSaveAsItem, new SeparatorMenuItem(),
fileExitItem);
[...]
// build global menu
menubar.getMenus().addAll(file);
}
private void createToolbar(ToolBar toolbar) {
Button openButton = new Button(
PWMImageResource.getImage(PWMImageResourceType.OPEN) == null ? "Open"
: "",
PWMImageResource.getImageView(PWMImageResourceType.OPEN));
Button saveButton = new Button(
PWMImageResource.getImage(PWMImageResourceType.OPEN) == null ? "Save"
: "",
PWMImageResource.getImageView(PWMImageResourceType.SAVE));
Button saveAsButton = new Button(
PWMImageResource.getImage(PWMImageResourceType.OPEN) == null ? "Save As..."
: "",
PWMImageResource.getImageView(PWMImageResourceType.SAVE_AS));
[...]
toolbar.getItems().addAll(openButton, new Separator(), saveButton,
saveAsButton, new Separator());
}
Hier die Klasse, die für das Hauptfenster zuständig ist. Problem, wie beschrieben: der TreeView skaliert nicht auf die Größe des Fensters.
Java:
public class PWMEditorWindow {
public PWMEditorWindow() {
}
public Pane createContent() {
BorderPane grid = new BorderPane();
grid.setMaxSize(Control.USE_PREF_SIZE, Control.USE_PREF_SIZE);
grid.setPrefWidth(250);
grid.setPadding(new Insets(10, 10, 10, 10));
grid.setLeft(createGroupPart());
grid.setRight(createContentPart());
return grid;
}
private Pane createGroupPart() {
// GridPane grid = new GridPane();
VBox vbox = new VBox(5);
Label label = new Label("Groups");
PWMContainer container = null;
try {
container = PWMJFXUtils
.loadPWMContainer(new File(
"/home/dzimmermann/temp/workspace-basicplatform/pwm/Test.pwm"));
} catch (Exception e) {
e.printStackTrace();
}
TreeView<PWMContainerGroup> groupTreeView = new TreeView<PWMContainerGroup>(
createNode(container));
groupTreeView.setShowRoot(false);
groupTreeView.setCellFactory(new PWMContainerGroupCallback());
// grid.add(label, 0, 0);
// grid.add(groupTreeView, 0, 1);
vbox.getChildren().addAll(label, groupTreeView);
return vbox;
}
private Pane createContentPart() {
VBox vbox = new VBox();
return vbox;
}
private TreeItem<PWMContainerGroup> createNode(PWMContainer container) {
return createNode(new PWMContainerGroupRoot(container));
}
private TreeItem<PWMContainerGroup> createNode(PWMContainerGroup group) {
return new PWMContainerGroupTreeItem(group);
}
private ObservableList<TreeItem<PWMContainerGroup>> buildChildren(
TreeItem<PWMContainerGroup> treeItem) {
PWMContainerGroup group = treeItem.getValue();
if (group != null && !group.getGroups().isEmpty()) {
ObservableList<TreeItem<PWMContainerGroup>> children = FXCollections
.observableArrayList();
for (PWMContainerGroup childGroup : group.getGroups())
children.add(createNode(childGroup));
return children;
}
return FXCollections.emptyObservableList();
}
/**
* Custom TreeItem for group entries.
*
* @author dzimmermann
*/
private final class PWMContainerGroupTreeItem extends
TreeItem<PWMContainerGroup> {
private boolean isLeaf;
private boolean isFirstTimeChildren = true;
private boolean isFirstTimeLeaf = true;
public PWMContainerGroupTreeItem(PWMContainerGroup group) {
super(group);
}
@Override
public ObservableList<TreeItem<PWMContainerGroup>> getChildren() {
if (isFirstTimeChildren) {
super.getChildren().setAll(buildChildren(this));
isFirstTimeChildren = false;
}
return super.getChildren();
}
@Override
public boolean isLeaf() {
if (isFirstTimeLeaf) {
PWMContainerGroup g = (PWMContainerGroup) getValue();
isLeaf = g.getGroups().isEmpty();
isFirstTimeLeaf = false;
}
return isLeaf;
}
}
/**
* A fake root for the Tree.
*
* @author dzimmermann
*/
private static final class PWMContainerGroupRoot extends PWMContainerGroup {
public PWMContainerGroupRoot(PWMContainer container) {
setName("PWM Groups");
setId(getName());
getGroups().addAll(container.getGroups());
}
}
/**
* Custom callback handler for printing the TreeItems label.
*
* @author dzimmermann
*/
private static final class PWMContainerGroupCallback implements
Callback<TreeView<PWMContainerGroup>, TreeCell<PWMContainerGroup>> {
@Override
public TreeCell<PWMContainerGroup> call(
TreeView<PWMContainerGroup> param) {
return new TreeCell<PWMContainerGroup>() {
@Override
protected void updateItem(PWMContainerGroup item, boolean empty) {
super.updateItem(item, empty);
if (item != null)
setText(item.getName());
}
};
}
}