Layout von Panes in JFX2

dzim

Top Contributor
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:
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());
				}
			};
		}
	}
 

dzim

Top Contributor
Den Einfall hatte ich auch schon, wenn auch auf der Basis des Editor-Contents (Klasse "PWMMainWindow").
Ich habe es groupTreeView eben auch probiert, aber leider hat es nicht geholfen...
 

dzim

Top Contributor
Hm. Also das Layout-Management finde ich derzeit noch - gelinde gesagt - bescheiden.

Ich habe es jetzt primär auf GridPane umgestellt (kann ich mir besser vorstellen). Wichtig scheint zu sein, dass bei Nodes, die den gesamten Verfügbaren Raum die Hgro oder Vgrow Anweisung an allen notwendigen Stellen auch gesetzt wird.

Hier der modifizierte Code:

In der Application-Klasse aus der VBox ein GridPane gemacht.

In PWMMainWindow die createContent-Methode angepasst:
Java:
	public void createContent() {

		VBox menubarToolbarBox = new VBox(0);

		if (createMenu) {
			MenuBar menubar = new MenuBar();
			menubar.setUseSystemMenuBar(false);
			createMenuBar(menubar);
			menubarToolbarBox.getChildren().add(menubar);
		}

		if (createToolbar) {
			ToolBar toolbar = new ToolBar();
			createToolbar(toolbar);
			menubarToolbarBox.getChildren().add(toolbar);
		}

		if (menubarToolbarBox.getChildren().size() > 0) {
			if (root instanceof GridPane)
				((GridPane) root).add(menubarToolbarBox, 0, 0);
			else
				root.getChildren().add(menubarToolbarBox);
		}

		PWMEditorWindow editor = new PWMEditorWindow();
		Pane editorPane = editor.createContent();
		if (root instanceof GridPane) {
			((GridPane) root).add(editorPane, 0, 1);
			GridPane.setHgrow(editorPane, Priority.ALWAYS);
			GridPane.setVgrow(editorPane, Priority.ALWAYS);
		} else
			root.getChildren().add(editorPane);
	}

In PWMEditorWindow wurden die drei folgenden Methoden verändert:
Java:
	public Pane createContent() {

		GridPane grid = new GridPane();
		grid.setHgap(10);
		grid.setPadding(new Insets(5, 5, 5, 5));

		Pane groupPane = createGroupPane();
		Pane contentPane = createContentPane();

		grid.add(groupPane, 0, 0);
		grid.add(contentPane, 1, 0);

		// GridPane.setHgrow(groupPane, Priority.ALWAYS);
		GridPane.setVgrow(groupPane, Priority.ALWAYS);
		GridPane.setHgrow(contentPane, Priority.ALWAYS);
		GridPane.setVgrow(contentPane, Priority.ALWAYS);

		return grid;
	}

	private Pane createGroupPane() {

		GridPane grid = new GridPane();
		grid.setVgap(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());
		groupTreeView.setMinWidth(100);

		grid.add(label, 0, 0);
		grid.add(groupTreeView, 0, 1);
		GridPane.setHgrow(groupTreeView, Priority.ALWAYS);
		GridPane.setVgrow(groupTreeView, Priority.ALWAYS);

		return grid;
	}

	private Pane createContentPane() {

		VBox vbox = new VBox(5);

		GridPane grid = new GridPane();
		grid.setVgap(5);

		Label label = new Label("Entries");

		TreeView<PWMGroupEntry> contentTreeView = new TreeView<PWMGroupEntry>(
				null);
		contentTreeView.setShowRoot(false);

		grid.add(label, 0, 0);
		grid.add(contentTreeView, 0, 1);
		GridPane.setHgrow(contentTreeView, Priority.ALWAYS);
		GridPane.setVgrow(contentTreeView, Priority.ALWAYS);

		vbox.getChildren().add(grid);
		VBox.setVgrow(grid, Priority.ALWAYS);

		return vbox;
	}

Ich will nicht behaupten, das die Oberfläche schon wirklich "schön" wäre, aber es ist ein Anfang!

Daniel
 

dzim

Top Contributor
Ok, ich muss das Thema noch einmal neu öffnen, da ich gerade etwas verwirrt ob des JavaFX TableViews bin:

ich habe den Quellcode oben soweit abgeändert, dass das Label obsolet wird, indem ich die Trees/Tabellen in ein TitledPane gepackt hab.
Nach einigem Hin und Her habe ich sowohl das Layout dieser Komponenten, als auch - mit CSS - die normale Auswahlfahrbe beseitigt, da dass in diesem Kontext eher bescheiden aus sah.
Ich hab danach begonnen die Tabelle mit Spalten zu füllen und sie dann in der Größe verändert - allerdings Breiter als das TitledPane. Erwartet habe ich Scrollbalken, bekommen habe ich eine zum Teil nicht sichtbare Tabelle und keine Möglichkeit, außer das Fenster zu vergrößern, an die Spalten zu kommen.

Ich dachte mir dann: Ok, ab in ein ScrollPane. Aber jetzt nutzt die Tabelle nicht mehr die volle Höhe und wenn ich das Fenster breiter mache als die Tabelle, dann wird sie auch nicht vergrößert, sondern abgeschnitten...

Allmählich frag ich mich, was Oracle sich dabei gedacht hat... o_O

Könnt ihr mir hier irgendiwe helfen?

Grüße,
Daniel
 

dzim

Top Contributor
Ich warne schon mal vor: Der ist noch sehr - ähm - experimentell... Und unschön...

Ist aus dem Code von weiter oben entstanden:
Java:
	private Pane createContentPane() {

		VBox vbox = new VBox(5);

		// content table section

		ScrollPane scrollPane = new ScrollPane();
		scrollPane.setHbarPolicy(ScrollBarPolicy.AS_NEEDED);
		scrollPane.setVbarPolicy(ScrollBarPolicy.AS_NEEDED);

		GridPane grid = new GridPane();
		grid.setVgap(5);

		contentTableView = new TableView<PWMGroupEntry>(null);
		contentTableView.getSelectionModel().setSelectionMode(
				SelectionMode.SINGLE);

		TableColumn<PWMGroupEntry, String> tcTitle = new TableColumn<PWMGroupEntry, String>("Title");
		tcTitle.setMinWidth(200);
		tcTitle.setCellValueFactory(new PropertyValueFactory<PWMGroupEntry, String>("name"));
		TableColumn<PWMGroupEntry, String> tcUser = new TableColumn<PWMGroupEntry, String>("Username");
		tcUser.setMinWidth(200);
		tcUser.setCellValueFactory(new PropertyValueFactory<PWMGroupEntry, String>("username"));
		TableColumn<PWMGroupEntry, String> tcURL = new TableColumn<PWMGroupEntry, String>("URL");
		tcURL.setMinWidth(250);
		tcURL.setCellValueFactory(new PropertyValueFactory<PWMGroupEntry, String>("url"));
		tcURL.setCellFactory(new Callback<TableColumn<PWMGroupEntry, String>, TableCell<PWMGroupEntry, String>>() {
			@Override
			public TableCell<PWMGroupEntry, String> call(
					TableColumn<PWMGroupEntry, String> param) {
				return new PWMGroupEntryHyperlinkCell();
			}
		});
		TableColumn<PWMGroupEntry, String> tcDateAdd = new TableColumn<PWMGroupEntry, String>("Date Added");
		tcDateAdd.setMinWidth(150);
		tcDateAdd.setCellValueFactory(new PropertyValueFactory<PWMGroupEntry, String>("dateAdded"));
		TableColumn<PWMGroupEntry, String> tcDateMod = new TableColumn<PWMGroupEntry, String>("Date Modified");
		tcDateMod.setMinWidth(150);
		tcDateMod.setCellValueFactory(new PropertyValueFactory<PWMGroupEntry, String>("dateModified"));

		contentTableView.getColumns().add(tcTitle);
		contentTableView.getColumns().add(tcUser);
		contentTableView.getColumns().add(tcURL);
		contentTableView.getColumns().add(tcDateAdd);
		contentTableView.getColumns().add(tcDateMod);

		grid.add(contentTableView, 0, 0);

		GridPane.setHgrow(contentTableView, Priority.ALWAYS);
		GridPane.setVgrow(contentTableView, Priority.ALWAYS);

		scrollPane.setContent(grid);

		TitledPane contentPane = new TitledPane();
		contentPane.setText("Entries");
		contentPane.setCollapsible(false);
		contentPane.setExpanded(true);
		contentPane.setMaxHeight(Double.MAX_VALUE);
		contentPane.setMinWidth(300);
		contentPane.setMinHeight(300);
		// contentPane.setContent(grid);
		contentPane.setContent(scrollPane);

		// content overview section

		GridPane grid2 = new GridPane();
		grid2.setPadding(new Insets(5, 5, 0, 5));
		grid2.setHgap(5);
		grid2.setVgap(5);

		Label lTitle = new Label("Title:");
		lTitle.setTextAlignment(TextAlignment.RIGHT);
		lTitle.getStyleClass().add("label");
		Label lUser = new Label("Username:");
		lUser.setTextAlignment(TextAlignment.RIGHT);
		Label lPass = new Label("Password:");
		lPass.setTextAlignment(TextAlignment.RIGHT);
		Label lURL = new Label("URL:");
		lURL.setTextAlignment(TextAlignment.RIGHT);
		Label lDateAdd = new Label("Date Added:");
		lDateAdd.setTextAlignment(TextAlignment.RIGHT);
		Label lDateMod = new Label("Date Modified:");
		lDateMod.setTextAlignment(TextAlignment.RIGHT);
		Label lDateExp = new Label("Expiration Date:");
		lDateExp.setTextAlignment(TextAlignment.RIGHT);
		Label lDesc = new Label("Description:");
		lDesc.setTextAlignment(TextAlignment.RIGHT);

		tTitle = new Text();
		tUser = new Text();
		tPass = new Text();
		hURL = new Hyperlink();
		tDateAdd = new Text();
		tDateMod = new Text();
		tDateExp = new Text();
		taDesc = new TextArea();
		taDesc.setId("ta-description");
		taDesc.setMinHeight(50);
		taDesc.setMaxHeight(50);

		grid2.addColumn(0, lTitle, lUser, lPass, lURL, lDesc);
		grid2.addColumn(1, tTitle, tUser, tPass, hURL, taDesc);
		grid2.addColumn(2, lDateAdd, lDateMod, lDateExp);
		grid2.addColumn(3, tDateAdd, tDateMod, tDateExp);

		GridPane.setHgrow(tTitle, Priority.ALWAYS);
		GridPane.setHgrow(tUser, Priority.ALWAYS);
		GridPane.setHgrow(tPass, Priority.ALWAYS);
		GridPane.setHgrow(hURL, Priority.ALWAYS);
		GridPane.setHgrow(taDesc, Priority.ALWAYS);
		GridPane.setHgrow(tDateAdd, Priority.ALWAYS);
		GridPane.setHgrow(tDateMod, Priority.ALWAYS);
		GridPane.setHgrow(tDateExp, Priority.ALWAYS);
		// GridPane.setVgrow(tfDesc, Priority.ALWAYS);
		GridPane.setColumnSpan(taDesc, 3);

		TitledPane contentOverviewPane = new TitledPane();
		contentOverviewPane.setText("Entry Overview");
		contentOverviewPane.setCollapsible(false);
		contentOverviewPane.setExpanded(true);
		contentOverviewPane.setContent(grid2);
		contentOverviewPane.setMinHeight(175);

		// add to vbox

		vbox.getChildren().add(contentPane);
		vbox.getChildren().add(contentOverviewPane);

		VBox.setVgrow(contentPane, Priority.ALWAYS);

		return vbox;
	}

BTW: Danke ;-)
 

Paddelpirat

Bekanntes Mitglied
Was ich gerade noch bei meiner eigenen Anwendung gesehen habe, damit sich die Komponenten (die keine Panes sind) der Größe des Fensters anpassen, ist die Einstellung.

Code:
javafxcomponent.setMaxWidth(Double.MAX_VALUE);
und
Code:
javafxcomponent.setMaxHeight(Double.MAX_VALUE);
.

bringt das etwas?

In deinem Fall müsstest du das wohl für die contentTableView aufrufen.

Edit: Das mit dem experimentellen Code kenne ich *g*. Habe auch gerade erst mal etwas gebraucht bis eine ProgressBar das getan hat was ich wollte.
 
Zuletzt bearbeitet:

dzim

Top Contributor
Ich hab's gerade sowohl an der Table als auch am Grid angehängt und es ändert leider nichts :-(

edit:
hier mal ein Testprogramm (selbes bescheidenes Verhalten) - damit kann man es besser nachstellen...

Java:
public class Test extends Application {

	public static void main(String[] args) {
		launch(args);
	}

	@Override
	public void start(Stage primaryStage) {

		primaryStage.setTitle("");

		StackPane root = new StackPane();

		root.getChildren().add(createContentPane());

		Scene scene = new Scene(root, 1024, 800);
		primaryStage.setScene(scene);
		primaryStage.show();
	}
	
	private Pane createContentPane() {

		VBox vbox = new VBox(5);

		// content table section

		// ScrollPane scrollPane = new ScrollPane();
		// scrollPane.setHbarPolicy(ScrollBarPolicy.AS_NEEDED);
		// scrollPane.setVbarPolicy(ScrollBarPolicy.AS_NEEDED);

		GridPane grid = new GridPane();
		grid.setVgap(5);
		grid.setMaxSize(Double.MAX_VALUE, Double.MAX_VALUE);

		TableView<PWMGroupEntry> contentTableView = new TableView<PWMGroupEntry>(null);
		contentTableView.setMaxSize(Double.MAX_VALUE, Double.MAX_VALUE);
		contentTableView.getSelectionModel().setSelectionMode(
				SelectionMode.SINGLE);

		TableColumn<PWMGroupEntry, String> tcTitle = new TableColumn<PWMGroupEntry, String>(
				"Title");
		tcTitle.setPrefWidth(200);
		tcTitle.setCellValueFactory(new PropertyValueFactory<PWMGroupEntry, String>(
				"name"));
		TableColumn<PWMGroupEntry, String> tcUser = new TableColumn<PWMGroupEntry, String>(
				"Username");
		tcUser.setPrefWidth(200);
		tcUser.setCellValueFactory(new PropertyValueFactory<PWMGroupEntry, String>(
				"username"));
		TableColumn<PWMGroupEntry, String> tcURL = new TableColumn<PWMGroupEntry, String>(
				"URL");
		tcURL.setPrefWidth(250);
		tcURL.setCellValueFactory(new PropertyValueFactory<PWMGroupEntry, String>(
				"url"));
		TableColumn<PWMGroupEntry, String> tcDateAdd = new TableColumn<PWMGroupEntry, String>(
				"Date Added");
		tcDateAdd.setPrefWidth(150);
		tcDateAdd
				.setCellValueFactory(new PropertyValueFactory<PWMGroupEntry, String>(
						"dateAdded"));
		TableColumn<PWMGroupEntry, String> tcDateMod = new TableColumn<PWMGroupEntry, String>(
				"Date Modified");
		tcDateMod.setPrefWidth(150);
		tcDateMod
				.setCellValueFactory(new PropertyValueFactory<PWMGroupEntry, String>(
						"dateModified"));

		contentTableView.getColumns().add(tcTitle);
		contentTableView.getColumns().add(tcUser);
		contentTableView.getColumns().add(tcURL);
		contentTableView.getColumns().add(tcDateAdd);
		contentTableView.getColumns().add(tcDateMod);

		grid.add(contentTableView, 0, 0);

		GridPane.setHgrow(contentTableView, Priority.ALWAYS);
		GridPane.setVgrow(contentTableView, Priority.ALWAYS);

		// scrollPane.setContent(grid);

		TitledPane contentPane = new TitledPane();
		contentPane.setText("Entries");
		contentPane.setCollapsible(false);
		contentPane.setExpanded(true);
		contentPane.setMaxHeight(Double.MAX_VALUE);
		contentPane.setMinWidth(300);
		contentPane.setMinHeight(300);
		contentPane.setContent(grid);
		// contentPane.setContent(scrollPane);

		// content overview section

		GridPane grid2 = new GridPane();
		grid2.setPadding(new Insets(5, 5, 0, 5));
		grid2.setHgap(5);
		grid2.setVgap(5);

		Label lTitle = new Label("Title:");
		lTitle.setTextAlignment(TextAlignment.RIGHT);
		lTitle.getStyleClass().add("label");
		Label lUser = new Label("Username:");
		lUser.setTextAlignment(TextAlignment.RIGHT);
		Label lPass = new Label("Password:");
		lPass.setTextAlignment(TextAlignment.RIGHT);
		Label lURL = new Label("URL:");
		lURL.setTextAlignment(TextAlignment.RIGHT);
		Label lDateAdd = new Label("Date Added:");
		lDateAdd.setTextAlignment(TextAlignment.RIGHT);
		Label lDateMod = new Label("Date Modified:");
		lDateMod.setTextAlignment(TextAlignment.RIGHT);
		Label lDateExp = new Label("Expiration Date:");
		lDateExp.setTextAlignment(TextAlignment.RIGHT);
		Label lDesc = new Label("Description:");
		lDesc.setTextAlignment(TextAlignment.RIGHT);

		Text tTitle = new Text();
		Text tUser = new Text();
		Text tPass = new Text();
		Hyperlink hURL = new Hyperlink();
		Text tDateAdd = new Text();
		Text tDateMod = new Text();
		Text tDateExp = new Text();
		TextArea taDesc = new TextArea();
		taDesc.setId("ta-description");
		taDesc.setMinHeight(50);
		taDesc.setMaxHeight(50);

		grid2.addColumn(0, lTitle, lUser, lPass, lURL, lDesc);
		grid2.addColumn(1, tTitle, tUser, tPass, hURL, taDesc);
		grid2.addColumn(2, lDateAdd, lDateMod, lDateExp);
		grid2.addColumn(3, tDateAdd, tDateMod, tDateExp);

		GridPane.setHgrow(tTitle, Priority.ALWAYS);
		GridPane.setHgrow(tUser, Priority.ALWAYS);
		GridPane.setHgrow(tPass, Priority.ALWAYS);
		GridPane.setHgrow(hURL, Priority.ALWAYS);
		GridPane.setHgrow(taDesc, Priority.ALWAYS);
		GridPane.setHgrow(tDateAdd, Priority.ALWAYS);
		GridPane.setHgrow(tDateMod, Priority.ALWAYS);
		GridPane.setHgrow(tDateExp, Priority.ALWAYS);
		// GridPane.setVgrow(tfDesc, Priority.ALWAYS);
		GridPane.setColumnSpan(taDesc, 3);

		TitledPane contentOverviewPane = new TitledPane();
		contentOverviewPane.setText("Entry Overview");
		contentOverviewPane.setCollapsible(false);
		contentOverviewPane.setExpanded(true);
		contentOverviewPane.setContent(grid2);
		contentOverviewPane.setMinHeight(175);

		// add to vbox

		vbox.getChildren().add(contentPane);
		vbox.getChildren().add(contentOverviewPane);

		VBox.setVgrow(contentPane, Priority.ALWAYS);

		return vbox;
	}
}

edit2:
Nein. Am TableView bringt's nichts...
 
Zuletzt bearbeitet:

dzim

Top Contributor
Argh...

Entweder Suchen-und-Ersetzen durch String, oder:

Java:
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "entry", propOrder = { "username", "password", "url",
		"description" })
public class PWMGroupEntry {

	@XmlAttribute(name = "id", required = true)
	protected String id;
	@XmlAttribute(name = "name", required = true)
	protected String name;
	@XmlAttribute(name = "date-added", required = true)
	protected Calendar dateAdded;
	@XmlAttribute(name = "date-modified", required = true)
	protected Calendar dateModified;
	@XmlAttribute(name = "date-expiration", required = false)
	protected Calendar dateExpiration;

	@XmlElement(name = "username", required = true)
	protected String username;
	@XmlElement(name = "password", required = false)
	protected String password;
	@XmlElement(name = "url", required = false)
	protected String url;
	@XmlElement(name = "description", required = false)
	protected String description;

	public String getId() {
		return id;
	}

	public void setId(String id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public Calendar getDateAdded() {
		return dateAdded;
	}

	public void setDateAdded(Calendar dateAdded) {
		this.dateAdded = dateAdded;
	}

	public Calendar getDateModified() {
		return dateModified;
	}

	public void setDateModified(Calendar dateModified) {
		this.dateModified = dateModified;
	}

	public Calendar getDateExpiration() {
		return dateExpiration;
	}

	public void setDateExpiration(Calendar dateExpiration) {
		this.dateExpiration = dateExpiration;
	}

	public String getUsername() {
		return username;
	}

	public void setUsername(String username) {
		this.username = username;
	}

	public String getPassword() {
		return password;
	}

	public void setPassword(String password) {
		this.password = password;
	}

	public String getUrl() {
		return url;
	}

	public void setUrl(String url) {
		this.url = url;
	}

	public String getDescription() {
		return description;
	}

	public void setDescription(String description) {
		this.description = description;
	}
}
 

Paddelpirat

Bekanntes Mitglied
Hi,

habe mal ein bisschen was ausprobiert. Ist zwar noch nicht perfekt, aber ich hoffe es ist nun einigermaßen brauchbar:

Java:
public class Test extends Application {
 
    public static void main(String[] args) {
        launch(args);
    }
 
    @Override
    public void start(Stage primaryStage) {
 
        primaryStage.setTitle("");
 
        StackPane root = new StackPane();
 
        root.getChildren().add(createContentPane());
 
        Scene scene = new Scene(root, 1024, 800);
        primaryStage.setScene(scene);
        primaryStage.show();
    }
    
    private Pane createContentPane() {
 
        VBox vbox = new VBox(5);
 
        // content table section
 
         ScrollPane scrollPane = new ScrollPane();
         scrollPane.setHbarPolicy(ScrollBarPolicy.AS_NEEDED);
         scrollPane.setVbarPolicy(ScrollBarPolicy.AS_NEEDED);
         scrollPane.setMaxSize(Double.MAX_VALUE, Double.MAX_VALUE);
 
 
        
        TableView<Integer> contentTableView = new TableView<Integer>(null);
        contentTableView.setColumnResizePolicy(TableView.CONSTRAINED_RESIZE_POLICY); //Neu
        
        contentTableView.getSelectionModel().setSelectionMode(
                SelectionMode.SINGLE);
 
        TableColumn<Integer, String> tcTitle = new TableColumn<Integer, String>(
                "Title");
        tcTitle.setPrefWidth(200);
        tcTitle.setCellValueFactory(new PropertyValueFactory<Integer, String>(
                "name"));
        TableColumn<Integer, String> tcUser = new TableColumn<Integer, String>(
                "Username");
        tcUser.setPrefWidth(200);
        tcUser.setCellValueFactory(new PropertyValueFactory<Integer, String>(
                "username"));
        TableColumn<Integer, String> tcURL = new TableColumn<Integer, String>(
                "URL");
        tcURL.setPrefWidth(250);
        tcURL.setCellValueFactory(new PropertyValueFactory<Integer, String>(
                "url"));
        TableColumn<Integer, String> tcDateAdd = new TableColumn<Integer, String>(
                "Date Added");
        tcDateAdd.setPrefWidth(150);
        tcDateAdd
                .setCellValueFactory(new PropertyValueFactory<Integer, String>(
                        "dateAdded"));
        TableColumn<Integer, String> tcDateMod = new TableColumn<Integer, String>(
                "Date Modified");
        tcDateMod.setPrefWidth(150);
        tcDateMod
                .setCellValueFactory(new PropertyValueFactory<Integer, String>(
                        "dateModified"));
 
        contentTableView.getColumns().add(tcTitle);
        contentTableView.getColumns().add(tcUser);
        contentTableView.getColumns().add(tcURL);
        contentTableView.getColumns().add(tcDateAdd);
        contentTableView.getColumns().add(tcDateMod);
        
        contentTableView.setMinSize(TableView.USE_PREF_SIZE, TableView.USE_PREF_SIZE); //Neu
        
 
        scrollPane.setContent(contentTableView);
        scrollPane.setFitToWidth(true); //Neu
        scrollPane.setFitToHeight(true); //Neu
 
        TitledPane contentPane = new TitledPane();
        contentPane.setText("Entries");
        contentPane.setCollapsible(false);
        contentPane.setExpanded(true);
        contentPane.setMaxHeight(Double.MAX_VALUE);
        contentPane.setMaxWidth(Double.MAX_VALUE);
        contentPane.setMinWidth(300);
        contentPane.setMinHeight(300);
        contentPane.setContent(scrollPane);
 
        // content overview section
 
        GridPane grid2 = new GridPane();
        grid2.setPadding(new Insets(5, 5, 0, 5));
        grid2.setHgap(5);
        grid2.setVgap(5);
 
        Label lTitle = new Label("Title:");
        lTitle.setTextAlignment(TextAlignment.RIGHT);
        lTitle.getStyleClass().add("label");
        Label lUser = new Label("Username:");
        lUser.setTextAlignment(TextAlignment.RIGHT);
        Label lPass = new Label("Password:");
        lPass.setTextAlignment(TextAlignment.RIGHT);
        Label lURL = new Label("URL:");
        lURL.setTextAlignment(TextAlignment.RIGHT);
        Label lDateAdd = new Label("Date Added:");
        lDateAdd.setTextAlignment(TextAlignment.RIGHT);
        Label lDateMod = new Label("Date Modified:");
        lDateMod.setTextAlignment(TextAlignment.RIGHT);
        Label lDateExp = new Label("Expiration Date:");
        lDateExp.setTextAlignment(TextAlignment.RIGHT);
        Label lDesc = new Label("Description:");
        lDesc.setTextAlignment(TextAlignment.RIGHT);
 
        Text tTitle = new Text();
        Text tUser = new Text();
        Text tPass = new Text();
        Hyperlink hURL = new Hyperlink();
        Text tDateAdd = new Text();
        Text tDateMod = new Text();
        Text tDateExp = new Text();
        TextArea taDesc = new TextArea();
        taDesc.setId("ta-description");
        taDesc.setMinHeight(50);
        taDesc.setMaxHeight(50);
 
        grid2.addColumn(0, lTitle, lUser, lPass, lURL, lDesc);
        grid2.addColumn(1, tTitle, tUser, tPass, hURL, taDesc);
        grid2.addColumn(2, lDateAdd, lDateMod, lDateExp);
        grid2.addColumn(3, tDateAdd, tDateMod, tDateExp);
 
        GridPane.setHgrow(tTitle, Priority.ALWAYS);
        GridPane.setHgrow(tUser, Priority.ALWAYS);
        GridPane.setHgrow(tPass, Priority.ALWAYS);
        GridPane.setHgrow(hURL, Priority.ALWAYS);
        GridPane.setHgrow(taDesc, Priority.ALWAYS);
        GridPane.setHgrow(tDateAdd, Priority.ALWAYS);
        GridPane.setHgrow(tDateMod, Priority.ALWAYS);
        GridPane.setHgrow(tDateExp, Priority.ALWAYS);
        // GridPane.setVgrow(tfDesc, Priority.ALWAYS);
        GridPane.setColumnSpan(taDesc, 3);
 
        TitledPane contentOverviewPane = new TitledPane();
        contentOverviewPane.setText("Entry Overview");
        contentOverviewPane.setCollapsible(false);
        contentOverviewPane.setExpanded(true);
        contentOverviewPane.setContent(grid2);
        contentOverviewPane.setMinHeight(175);
 
        // add to vbox
 
        vbox.getChildren().add(contentPane);
        vbox.getChildren().add(contentOverviewPane);
 
        VBox.setVgrow(contentPane, Priority.ALWAYS);
 
        return vbox;
    }
}
 
Zuletzt bearbeitet:

dzim

Top Contributor
Sieht doch gar nicht so schlecht aus!
Einzig die Performace auf Linux scheint noch etwas unterirdisch zu sein :-/ Das Scollen zieht mitunter ganz schön hinterher...

Danke aber für die Hilfe!!!
 

Paddelpirat

Bekanntes Mitglied
Eventuell mal Grafikkartentreiber aktualisieren? Habe aber selbst noch nicht JavaFX 2 unter Linux ausprobiert. Teste nur immer schön auf meinem Notebook mit zwei Grafikchips. Auf dem Onboard-Chip ruckelt es gerne mal auf der dedizierten Grafikkarte ist alles flüssig. Wobei mein Programm an dem ich da werkel immer gleich ein paar tausend Objekte zeichnet und ich da so Funktionen wie Zoomen und Verschieben benutze. Dass eine einfache Tabelle ruckelt wundert mich schon etwas.
 

dzim

Top Contributor
ich hab nen L520 von Arbeit, auf dem ich herumspielen darf :) Der hat nur nen Intel-Chip - also Performance darf man hier nicht unbedingt erwarten, aber normalerweise reicht es. Da der Treiber für Intel-GraKa im Kernel ist und ich Ubuntu 12.04 verwende, sollte der neu genug sein.

Aber ich denke tatsächlich, das die Entwicklung von JavaFX auf Linux Windows noch mächtig hinterher hinkt. Aber auch Mac... Leider :-/
 

Paddelpirat

Bekanntes Mitglied
Hatte gerade nochmal eine Idee wie man das Ergebnis für die Table verbessern könnte. Das Resultat gefällt mir eigentlich, allerdings gefällt mir die Art und Weise "wie" ich das erreicht habe noch nicht ganz. Aber vielleicht hast du da noch eine bessere Lösung für. Die Hauptänderung ist die Benutzung eines MapChangeListener und natürlich der default ColumnResizePolicy.

Java:
public class Test extends Application {
 
    public static void main(String[] args) {
        launch(args);
    }
 
    @Override
    public void start(Stage primaryStage) {
 
        primaryStage.setTitle("");
 
        StackPane root = new StackPane();
 
        root.getChildren().add(createContentPane());
 
        Scene scene = new Scene(root, 1024, 800);
        primaryStage.setScene(scene);
        primaryStage.show();
    }
    
    private Pane createContentPane() {
 
        VBox vbox = new VBox(5);
 
        // content table section
 
         ScrollPane scrollPane = new ScrollPane();
         scrollPane.setHbarPolicy(ScrollBarPolicy.AS_NEEDED);
         scrollPane.setVbarPolicy(ScrollBarPolicy.AS_NEEDED);
         scrollPane.setMaxSize(Double.MAX_VALUE, Double.MAX_VALUE);
 
 
        
        final TableView<Integer> contentTableView = new TableView<Integer>(null);
        
        //contentTableView.setColumnResizePolicy(TableView.CONSTRAINED_RESIZE_POLICY); //Neu
        
        contentTableView.getSelectionModel().setSelectionMode(
                SelectionMode.SINGLE);
 
        final TableColumn<Integer, String> tcTitle = new TableColumn<Integer, String>(
                "Title");
        tcTitle.setPrefWidth(200);
        tcTitle.setCellValueFactory(new PropertyValueFactory<Integer, String>(
                "name"));
        TableColumn<Integer, String> tcUser = new TableColumn<Integer, String>(
                "Username");
        tcUser.setPrefWidth(200);
        tcUser.setCellValueFactory(new PropertyValueFactory<Integer, String>(
                "username"));
        TableColumn<Integer, String> tcURL = new TableColumn<Integer, String>(
                "URL");
        tcURL.setPrefWidth(250);
        tcURL.setCellValueFactory(new PropertyValueFactory<Integer, String>(
                "url"));
        final TableColumn<Integer, String> tcDateAdd = new TableColumn<Integer, String>(
                "Date Added");
        tcDateAdd.setPrefWidth(150);
        tcDateAdd
                .setCellValueFactory(new PropertyValueFactory<Integer, String>(
                        "dateAdded"));
        TableColumn<Integer, String> tcDateMod = new TableColumn<Integer, String>(
                "Date Modified");
        tcDateMod.setPrefWidth(150);
        tcDateMod
                .setCellValueFactory(new PropertyValueFactory<Integer, String>(
                        "dateModified"));

        contentTableView.getProperties().addListener(new MapChangeListener() {

            @Override
            public void onChanged(Change arg0) {
                double width = 0;
                for(int i=0; i<contentTableView.getColumns().size(); i++) {
                    width += ((TableColumn)contentTableView.getColumns().get(i)).getWidth();
                }
                
                contentTableView.setPrefWidth(width);
                //System.out.println(width);
            }
            
        });
 
        contentTableView.getColumns().add(tcTitle);
        contentTableView.getColumns().add(tcUser);
        contentTableView.getColumns().add(tcURL);
        contentTableView.getColumns().add(tcDateAdd);
        contentTableView.getColumns().add(tcDateMod);
        
        contentTableView.setMinSize(TableView.USE_PREF_SIZE, TableView.USE_PREF_SIZE); //Neu
        
 
        scrollPane.setContent(contentTableView);
        scrollPane.setFitToWidth(true); //Neu
        scrollPane.setFitToHeight(true); //Neu
 
        TitledPane contentPane = new TitledPane();
        contentPane.setText("Entries");
        contentPane.setCollapsible(false);
        contentPane.setExpanded(true);
        contentPane.setMaxHeight(Double.MAX_VALUE);
        contentPane.setMaxWidth(Double.MAX_VALUE);
        contentPane.setMinWidth(300);
        contentPane.setMinHeight(300);
        contentPane.setContent(scrollPane);
 
        // content overview section
 
        GridPane grid2 = new GridPane();
        grid2.setPadding(new Insets(5, 5, 0, 5));
        grid2.setHgap(5);
        grid2.setVgap(5);
 
        Label lTitle = new Label("Title:");
        lTitle.setTextAlignment(TextAlignment.RIGHT);
        lTitle.getStyleClass().add("label");
        Label lUser = new Label("Username:");
        lUser.setTextAlignment(TextAlignment.RIGHT);
        Label lPass = new Label("Password:");
        lPass.setTextAlignment(TextAlignment.RIGHT);
        Label lURL = new Label("URL:");
        lURL.setTextAlignment(TextAlignment.RIGHT);
        Label lDateAdd = new Label("Date Added:");
        lDateAdd.setTextAlignment(TextAlignment.RIGHT);
        Label lDateMod = new Label("Date Modified:");
        lDateMod.setTextAlignment(TextAlignment.RIGHT);
        Label lDateExp = new Label("Expiration Date:");
        lDateExp.setTextAlignment(TextAlignment.RIGHT);
        Label lDesc = new Label("Description:");
        lDesc.setTextAlignment(TextAlignment.RIGHT);
 
        Text tTitle = new Text();
        Text tUser = new Text();
        Text tPass = new Text();
        Hyperlink hURL = new Hyperlink();
        Text tDateAdd = new Text();
        Text tDateMod = new Text();
        Text tDateExp = new Text();
        TextArea taDesc = new TextArea();
        taDesc.setId("ta-description");
        taDesc.setMinHeight(50);
        taDesc.setMaxHeight(50);
 
        grid2.addColumn(0, lTitle, lUser, lPass, lURL, lDesc);
        grid2.addColumn(1, tTitle, tUser, tPass, hURL, taDesc);
        grid2.addColumn(2, lDateAdd, lDateMod, lDateExp);
        grid2.addColumn(3, tDateAdd, tDateMod, tDateExp);
 
        GridPane.setHgrow(tTitle, Priority.ALWAYS);
        GridPane.setHgrow(tUser, Priority.ALWAYS);
        GridPane.setHgrow(tPass, Priority.ALWAYS);
        GridPane.setHgrow(hURL, Priority.ALWAYS);
        GridPane.setHgrow(taDesc, Priority.ALWAYS);
        GridPane.setHgrow(tDateAdd, Priority.ALWAYS);
        GridPane.setHgrow(tDateMod, Priority.ALWAYS);
        GridPane.setHgrow(tDateExp, Priority.ALWAYS);
        // GridPane.setVgrow(tfDesc, Priority.ALWAYS);
        GridPane.setColumnSpan(taDesc, 3);
 
        TitledPane contentOverviewPane = new TitledPane();
        contentOverviewPane.setText("Entry Overview");
        contentOverviewPane.setCollapsible(false);
        contentOverviewPane.setExpanded(true);
        contentOverviewPane.setContent(grid2);
        contentOverviewPane.setMinHeight(175);
 
        // add to vbox
 
        vbox.getChildren().add(contentPane);
        vbox.getChildren().add(contentOverviewPane);
 
        VBox.setVgrow(contentPane, Priority.ALWAYS);
 
        return vbox;
    }
}
 

dzim

Top Contributor
Hehe, ist doch cool! ;-)

Ich bin selbst noch nie auf den Gedanken gekommen, das per Listener zu machen, hab aber mal vor kurzem ne Implementierung einer Auto-Resize-Funktion für TableColumns in nem Blog gesehen. Da war das auch so gelöst.
Wenn's funktioniert, hat es doch seine Daseinsberechtigung, oder? :-D

Prinzipiell aber bin ich soweit erst einmal zufrieden. Ich werde vermutlich nur irgendwann das ganze auf FXML umstellen, da ich den deklarativen Ansatz etwas cleverer finde.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
S Welches Java Layout sollte ich verwenden? AWT, Swing, JavaFX & SWT 3
S Layout - Problem AWT, Swing, JavaFX & SWT 1
D Layout einer scene mit ListView Elementen und Zwei Textfeldern AWT, Swing, JavaFX & SWT 1
H Swing , GridLayout, Größenbestimmung der Komponenten im Layout AWT, Swing, JavaFX & SWT 8
melaniemueller Layout wechseln über RadioButtons AWT, Swing, JavaFX & SWT 4
E LayoutManager Welcher Layout-Mix löst mein Problem? AWT, Swing, JavaFX & SWT 3
J Swing Hilfe bei Layout AWT, Swing, JavaFX & SWT 2
R Layered Layout AWT, Swing, JavaFX & SWT 1
E showAndWait is not allowed during animation or layout processing Memory FX AWT, Swing, JavaFX & SWT 2
newJavaGeek Grid-Layout problem AWT, Swing, JavaFX & SWT 7
E Swing Layout während der Laufzeit anpassen AWT, Swing, JavaFX & SWT 3
P JavaFX Zugriff auf Fenster/Layout-Container in eigenen Klassen AWT, Swing, JavaFX & SWT 5
R Layout Manager null und Component wird nicht hinzugefügt AWT, Swing, JavaFX & SWT 3
S Kann javafx.scene.layout.VBoxBuilder nicht importieren AWT, Swing, JavaFX & SWT 3
OSchriever Layout über Radiobuttons ändern AWT, Swing, JavaFX & SWT 4
B Swing Probleme mit dem Layout AWT, Swing, JavaFX & SWT 1
Hatsi09 JButton text layout AWT, Swing, JavaFX & SWT 9
I JavaFX - festes Layout AWT, Swing, JavaFX & SWT 1
S JavaFX TableView einzelne Zelle Layout zuweisen AWT, Swing, JavaFX & SWT 3
DaCrazyJavaExpert Swing Zwei gleichgroße Panels in einem Scrollpane mit Layout AWT, Swing, JavaFX & SWT 9
Neumi5694 Swing Card-Layout, Fokus AWT, Swing, JavaFX & SWT 2
kilopack15 Interface mit Layout verknüpfen AWT, Swing, JavaFX & SWT 2
Y Layout/Ausrichtungsprobleme AWT, Swing, JavaFX & SWT 4
T JavaFX Custom Layout AWT, Swing, JavaFX & SWT 5
A GUI Layout AWT, Swing, JavaFX & SWT 11
A Layout-Manager, JScrollPane, ... Chaos AWT, Swing, JavaFX & SWT 5
L wie Layout-Grid in JXPanel anzeigen? AWT, Swing, JavaFX & SWT 5
L Eigene Component Layout AWT, Swing, JavaFX & SWT 4
Soloeco LayoutManager Wie und welches Layout nutze ich am Besten? AWT, Swing, JavaFX & SWT 13
M LayoutManager Modalen JDialog ein Layout zuweisen AWT, Swing, JavaFX & SWT 3
M LayoutManager Layout reagiert nicht auf Constraints AWT, Swing, JavaFX & SWT 4
IsSchoGuat LayoutManager Layout-Containergrösse AWT, Swing, JavaFX & SWT 4
F GridBag Layout AWT, Swing, JavaFX & SWT 1
Z Absolutes Layout / Kontrolle über Anordnung AWT, Swing, JavaFX & SWT 3
M Mehrere Jpanel in einem JScrollPane (Layout) AWT, Swing, JavaFX & SWT 2
M Layout-Probleme unter Swing AWT, Swing, JavaFX & SWT 5
D LayoutManager GUI skalieren und deren Komponenten mit Grid(Bag)Layout-Manager. AWT, Swing, JavaFX & SWT 5
J ComboBoxModel addElement verändert Layout AWT, Swing, JavaFX & SWT 8
E Probelm mit Layout AWT, Swing, JavaFX & SWT 1
B Hilfe welches Layout brauch ich AWT, Swing, JavaFX & SWT 4
P Tipps für GUI-Layout AWT, Swing, JavaFX & SWT 2
M Passender Layout-Manager AWT, Swing, JavaFX & SWT 3
M LayoutManager Layout zur Laufzeit ändern AWT, Swing, JavaFX & SWT 8
N Swing Zweifarbiges Layout für den Filechooser AWT, Swing, JavaFX & SWT 12
B LayoutManager Card Layout AWT, Swing, JavaFX & SWT 2
E Angehängtes Layout, aber wie? AWT, Swing, JavaFX & SWT 12
1 Eigenes Layout schreiben AWT, Swing, JavaFX & SWT 4
B SWT layout invalidieren in SWT? AWT, Swing, JavaFX & SWT 4
R Welchen Layout Manager/ Wie strukturieren? AWT, Swing, JavaFX & SWT 14
J Layout: oben 20% unten 80% AWT, Swing, JavaFX & SWT 12
T Layout für Listendarstellung AWT, Swing, JavaFX & SWT 3
F LayoutManager Null-Layout unter Linux im TreeCellEditor AWT, Swing, JavaFX & SWT 3
K Eclipse Layout (Gimp Layout, Tiled Layout...) AWT, Swing, JavaFX & SWT 4
C LayoutManager Passendes Layout gesucht AWT, Swing, JavaFX & SWT 2
M Layout funktioniert nicht AWT, Swing, JavaFX & SWT 3
H Layout Idee AWT, Swing, JavaFX & SWT 8
M Swing Dynamisches Layout AWT, Swing, JavaFX & SWT 10
P Swing welchen Layout Manager verwenden AWT, Swing, JavaFX & SWT 9
J LayoutManager Komponentenaustausch zerschießt Layout AWT, Swing, JavaFX & SWT 4
F Layout-Problem AWT, Swing, JavaFX & SWT 2
K Gui Layout Frage AWT, Swing, JavaFX & SWT 5
B Anderen Layout-Manager verwenden AWT, Swing, JavaFX & SWT 17
E Null-Layout - Wie geht es ohne? AWT, Swing, JavaFX & SWT 19
Furtano AWT mehrere Bilder in einen Frame zeichnen + Layout Manager AWT, Swing, JavaFX & SWT 10
L Swing dynamisches Image-Panel in Layout einbinden AWT, Swing, JavaFX & SWT 10
D Bild in JPanel verschiebt Layout. Wie fixieren? AWT, Swing, JavaFX & SWT 9
GUI-Programmer Wieder ne Layout Frage AWT, Swing, JavaFX & SWT 11
GUI-Programmer LayoutManager Kurze Layout Frage - eine komponente mittig? AWT, Swing, JavaFX & SWT 5
D Problem mit 3-Spalten Layout AWT, Swing, JavaFX & SWT 17
ARadauer Wenig Material zum Thema: Design, Layout, Usability von Swing Anwendungen AWT, Swing, JavaFX & SWT 11
S LayoutManager Welcher LayoutManager für dieses zweispaltige Layout? AWT, Swing, JavaFX & SWT 13
G LayoutManager Layout welches von Links nach rechts anordnet mit TOP Alignment! AWT, Swing, JavaFX & SWT 5
A Best practice für konkretes Layout AWT, Swing, JavaFX & SWT 10
G LayoutManager Layout für Spalten AWT, Swing, JavaFX & SWT 8
A Layout/JPanelgröße AWT, Swing, JavaFX & SWT 6
S pack() bei null-Layout AWT, Swing, JavaFX & SWT 10
C SWT Tabellen-Layout in StyledText? AWT, Swing, JavaFX & SWT 6
J LayoutManager Welchen Layout/Design-Manager? AWT, Swing, JavaFX & SWT 4
R Swing Layout setzen AWT, Swing, JavaFX & SWT 3
L Layout automatische Anpassung umgehen? AWT, Swing, JavaFX & SWT 5
A Problem mit Layout-Manager AWT, Swing, JavaFX & SWT 11
J Button Layout anpassen AWT, Swing, JavaFX & SWT 22
H LayoutManager Layout mit GridBagLayout machbar? AWT, Swing, JavaFX & SWT 6
B Buttongröße im Layout AWT, Swing, JavaFX & SWT 4
B LayoutManager Layout Problem AWT, Swing, JavaFX & SWT 14
O LayoutManager Layout entwerfen AWT, Swing, JavaFX & SWT 3
A diverse Layout-Fragen AWT, Swing, JavaFX & SWT 4
F LayoutManager Eigenes Layout die Lösung?! AWT, Swing, JavaFX & SWT 4
dzim SWT Layout mit Sections aus Eclipse Forms AWT, Swing, JavaFX & SWT 17
F JScrollPane verwirft Layout von JPanel AWT, Swing, JavaFX & SWT 2
C LayoutManager Layout und vergrößern des Frames AWT, Swing, JavaFX & SWT 5
E Swing Runde Buttons / Position eines Obj. im Layout AWT, Swing, JavaFX & SWT 7
S Swing UI-Elemente ordnen sich ungewollt in einer Reihe (ohne Layout) AWT, Swing, JavaFX & SWT 5
A Ungewollte Layout änderungen AWT, Swing, JavaFX & SWT 3
A Suche: Eclipse-GUI-Layout AWT, Swing, JavaFX & SWT 5
E JPanel mit Null Layout entfernt Buttons AWT, Swing, JavaFX & SWT 11
N Swing Layout positionieren AWT, Swing, JavaFX & SWT 2
B Methode setzt nicht das Layout in einer if-Abfrage AWT, Swing, JavaFX & SWT 13
H LayoutManager Dynamisches Layout AWT, Swing, JavaFX & SWT 3
M SWT Breite von Textfeld nur ohne Layout änderbar AWT, Swing, JavaFX & SWT 2

Ähnliche Java Themen

Neue Themen


Oben