JavaFX BorderPane ins Tree einfügen

iso66

Mitglied
Hallo Leute,
Ich habe ein Problem. Den folgenden Tree, muss ich in einem BordePane anzeigen lassen.

Ich brauche eure Hilfe, bitte.



Java:
				// Tree item
				/*private TreeItem<File> createNode(final File f) {
					return new TreeItem<File>(f) {
						private boolean isLeaf;
						private boolean isFirstTimeChildren = true;
						private boolean isFirstTimeLeaf = true;
						
						@Override public ObservableList<TreeItem<File>> getChildren() {
							if(isFirstTimeChildren){
								isFirstTimeChildren = false;
								super.getChildren().setAll(buildChildren(this));
							}
							return super.getChildren();
						}
					
						@Override public boolean isLeaf() {
							if (isFirstTimeLeaf) {
								isFirstTimeLeaf = false;
					            File f = (File) getValue();
					            isLeaf = f.isFile();
							}
							return isLeaf;
						}
						private ObservableList<TreeItem<File>> buildChildren(TreeItem<File> TreeItem) {
				            File f = TreeItem.getValue();
				            if (f != null && f.isDirectory()) {
				                File[] files = f.listFiles();
				                if (files != null) {
				                    ObservableList<TreeItem<File>> children = FXCollections.observableArrayList();

				                    for (File childFile : files) {
				                        children.add(createNode(childFile));
				                    }

				                    return children;
				                }
				            }

				            return FXCollections.emptyObservableList();
				        }
					};
					
				}*/

Vielen Danke
 
Ich seh' einen Haufen von auskommentierten Code, der wohl das Datenmodell deines TreeViews darstellen soll. Wo ist jetzt das Problem?
TreeView<File> in als left|top|right|bottom|center setzen, das Modell in den TreeView einfügen und fertig.

Oder was genau ist hier das Problem? Ich kann auch im Moment die eigentliche Frage (denn so etwas gibt es in deinem Post nicht), nicht erkennen.
 
Java:
public class Tree{


// Tree item
	@SuppressWarnings("unused")
	private TreeItem<File> createNode(final File f) {
		
		return new TreeItem<File>(f) {
		
		private boolean isLeaf;
		private boolean isFirstTimeChildren = true;
		private boolean isFirstTimeLeaf = true;
						
			@Override 
			public ObservableList<TreeItem<File>> getChildren() {
				if(isFirstTimeChildren){
					isFirstTimeChildren = false;
					super.getChildren().setAll(buildChildren(this));
				}
					return super.getChildren();
			}
					
			@Override
			public boolean isLeaf() {
				if (isFirstTimeLeaf) {
					isFirstTimeLeaf = false;
					File f = (File) getValue();
					isLeaf = f.isFile();
				}
				return isLeaf;
			}
			
			private ObservableList<TreeItem<File>> buildChildren(TreeItem<File> TreeItem) {
				File f = TreeItem.getValue();
				if (f != null && f.isDirectory()) {
					File[] files = f.listFiles();
				    	if (files != null) {
				        ObservableList<TreeItem<File>> children = FXCollections.observableArrayList();

				        	for (File childFile : files) {
				        		children.add(createNode(childFile));
				            }

				        	return children;
				    	}
				}

				return FXCollections.emptyObservableList();
			}
					
		};
				
		
	}
}


hier hab ich es schöner.

Ja dizim ich bekomme, den Code nicht hin, dass ist mein Problem 🙁
 
Welchen Code? Den, wie du den TreeView in die BorderPane einfügst? Oder den, der dir das TreeItem baut? Wo gibt es konkrete Probleme? Was klappt genau nicht?
Dein Post besteht nur aus der Bemerkung, das irgendetwas Probleme macht und etwas Code, aber was das konkrete Problem ist, wie du bisher versucht hast dagegen etwas zu unternehmen, wird nicht deutlich! Bitte näher beschreiben!
 
Den Code, mit dem ich den TreeView in den BorderPane einfügen. Das ist mein Problem, ich bekomme es einfach nicht hin. Denn Tree anzeigen zu lassen.
Was vielleicht noch interessant sein könnte, ich habe mit den SceneBuilder 2.0 eine MyView.FXML-Datei erstellt. In dem ich den BorderPane benutze, Pos.Center sollte der Tree angezeigt werden.

Hoffe, dass ich nichts vergessen habe.
 
Zeig mal das FXML her. Pos.CENTER ist eigentlich Blödsinn. Du setzt es als Center-Node

Code:
<BorderPane>
  <center>
    <TreeView [BorderPane.alignment="CENTER"]>...</TreeView> <!-- das in eckigen Klammern [] ist optional -->
    <!-- hier könnte höchstens noch so was wie <BorderPane.margin> oder so kommen -->
  </center>
</BorderPane>
 
Java:
<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.scene.input.*?>
<?import javafx.scene.effect.*?>
<?import javafx.scene.paint.*?>
<?import javafx.scene.text.*?>
<?import javafx.scene.control.*?>
<?import java.lang.*?>
<?import javafx.scene.layout.*?>

<BorderPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1">
   <left>
      <ScrollPane prefHeight="200.0" prefWidth="200.0" BorderPane.alignment="CENTER">
         <content>
            <Label text="Tree Main Fix">
               <font>
                  <Font name="System Bold" size="17.0" />
               </font>
            </Label>
         </content>
      </ScrollPane>
   </left>
   <top>
      <MenuBar BorderPane.alignment="CENTER">
        <menus>
          <Menu mnemonicParsing="false" text="File">
            <items>
              <MenuItem mnemonicParsing="false" onAction="#doNew" text="New" />
                  <MenuItem mnemonicParsing="false" onAction="#doOeffne" text="Open">
                     <accelerator>
                        <KeyCodeCombination alt="UP" code="O" control="DOWN" meta="UP" shift="UP" shortcut="UP" />
                     </accelerator></MenuItem>
                  <MenuItem mnemonicParsing="false" onAction="#doSave" text="Save" />
                  <MenuItem mnemonicParsing="false" onAction="#doSaveAs" text="Save As" />
                  <SeparatorMenuItem mnemonicParsing="false" />
                  <MenuItem mnemonicParsing="false" onAction="#doExit" text="Exit" />
            </items>
          </Menu>
          <Menu mnemonicParsing="false" text="Edit">
            <items>
              <MenuItem mnemonicParsing="false" text="Undo" />
                  <MenuItem mnemonicParsing="false" text="Redo" />
                  <SeparatorMenuItem mnemonicParsing="false" />
                  <MenuItem mnemonicParsing="false" text="Cut" />
                  <MenuItem mnemonicParsing="false" text="Copy" />
                  <MenuItem mnemonicParsing="false" text="Delete" />
                  <MenuItem mnemonicParsing="false" text="Paste" />
                  <SeparatorMenuItem mnemonicParsing="false" />
                  <MenuItem mnemonicParsing="false" text="Select All" />
                  <MenuItem mnemonicParsing="false" text="Unselect All" />
            </items>
          </Menu>
          <Menu mnemonicParsing="false" text="View">
            <items>
                  <CheckMenuItem mnemonicParsing="false" text="Line numbers" />
            </items>
          </Menu>
            <Menu mnemonicParsing="false" text="Search">
               <items>
                  <MenuItem mnemonicParsing="false" onAction="#doFind" text="Find" />
                  <MenuItem mnemonicParsing="false" text="Replace" />
               </items>
            </Menu>
            <Menu mnemonicParsing="false" text="Help">
               <items>
                  <MenuItem mnemonicParsing="false" text="About" />
               </items>
            </Menu>
        </menus>
      </MenuBar>
   </top>
   <center>
      <SplitPane dividerPositions="0.4824120603015075" prefHeight="160.0" prefWidth="200.0" BorderPane.alignment="CENTER">
        <items>
          <AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="160.0" prefWidth="100.0">
               <children>
                  <ScrollPane prefHeight="373.0" prefWidth="189.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
                    <content>
                      <AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="200.0" prefWidth="200.0" />
                    </content>
                  </ScrollPane>
                  <Label text="  Tree Variable">
                     <font>
                        <Font name="System Bold" size="17.0" />
                     </font>
                  </Label>
               </children>
            </AnchorPane>
          <AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="160.0" prefWidth="100.0">
               <children>
                  <SplitPane dividerPositions="0.5" layoutX="22.0" layoutY="87.0" orientation="VERTICAL" prefHeight="373.0" prefWidth="203.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
                    <items>
                      <AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="100.0" prefWidth="160.0">
                           <children>
                              <ScrollPane prefHeight="183.0" prefWidth="201.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0" />
                              <Label alignment="BOTTOM_CENTER" text="  Editor">
                                 <font>
                                    <Font name="System Bold" size="17.0" />
                                 </font>
                              </Label>
                           </children>
                        </AnchorPane>
                        <ScrollPane prefHeight="200.0" prefWidth="200.0">
                           <content>
                              <TextFlow prefHeight="200.0" prefWidth="200.0" />
                           </content>
                        </ScrollPane>
                    </items>
                  </SplitPane>
               </children>
            </AnchorPane>
        </items>
      </SplitPane>
   </center>
</BorderPane>
 
Ja und wo ist da ein TreeView drin? Vielleicht verstehe ich dich schlicht nur nicht, aber ohne TreeView in der FXML (btw: nicht den FXML - klingt irgendwie schräg... Aber vielleicht ist das nur mein stilistisches Empfinden) wird es schwierig einen Tree generell anzuzeigen. Wo soll denn der Tree angezeigt werden? Links, Mitte, Rechts oder Unten?
 
Ok, es stimmt was du meinst, ich hab nicht gewusst, dass im SceneBuilder - (TreeView) zu finden ist. Darum hab ich kein TreeView im FXML Code. Ich Teste es jetzt mal mit dem TreeView.
Vielen Danke, bis später 🙂
 
Java:
<BorderPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1">
 <left>
      <TreeView prefHeight="200.0" prefWidth="200.0" BorderPane.alignment="CENTER" />
   </left>
   <center>
      <TreeView prefHeight="200.0" prefWidth="200.0" BorderPane.alignment="CENTER" />
   </center>
   <right>
      <SplitPane dividerPositions="0.5" orientation="VERTICAL" prefHeight="200.0" prefWidth="160.0" BorderPane.alignment="CENTER">
        <items>
          <AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="100.0" prefWidth="160.0" />
          <AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="100.0" prefWidth="160.0" />
        </items>
      </SplitPane>
   </right>
</BorderPane>

Dzim hab nun die TreeViews , der nächste schritt wäre dann den Code zu schreiben oder nicht?
 
Ja.

Aber:
1) Du brauchst fx:id-Attribute an den notwendigen Nodes, z.B.:
Code:
[...]
<TreeView prefHeight="200.0" prefWidth="200.0" BorderPane.alignment="CENTER" fx:id="treeView" />
[...]
Damit kannst du dann im Controller das Ganze mit
Java:
@FXML private TreeView<File> treeView; // identische Namen!
initialisieren und darauf zugreifen.

2) Du brauchst also auch noch einen Controller, den du mittels fx:controller="my.package.MyController" an dein Root-Element (also die BorderPane) anfügst. Ich denke, dass du das auch über die GUI des SceneBuilder erledigen kannst.
 

Neue Themen


Zurück
Oben