JavaFX Panes wie "children" anordnen

mugsawaay

Aktives Mitglied
Hallo,

ich habe eine AnchorPane mit Buttons, Labeln etc. gespeichert in einem fxml File.
Setze ich dies in ein BoarderLayout Center funktioniert alles so wie es soll.
Was ich jetzt möchte ist, das ich exakt das gleiche AnchorPane im Boarder Layout Center verdopple. Dies gelingt mir leider nicht.
In Swing hatte ich dieses AncorPane als Klasse geschrieben dann entsprechend 2 mal instanziert und in Center plaziert das hat funktioniert.
Zur Not könnte ich mir mit einer SplitPane behelfen und diese dann in das Center setzen. Was wenn ich aber mehr als 2 Panes benötige?
Am liebsten wäre eine Funktion wie ein Flow Pane wo man die AnchorPanes reinsetzt. Gibt es leider nicht, auch getChuildren ist für panes nicht definiert.
falls mir jemand eine Idee hat....

gruß gü
 

dzim

Top Contributor
Also bietet das FlowPane von JavaFX nicht dass, was du benötigst?
https://docs.oracle.com/javase/8/javafx/api/javafx/scene/layout/FlowPane.html

BorderLayout nimmt halt für Center genau einen Node. Das könnte aber auch eine HBox oder so sein. SplitPane (dem du prinzipiell beliebig viele Elemente zuweisen kannst) müsstest du halt nutzen, wenn du die Grössen verändern möchtest. Vielleicht könnte aber ein GridPane dir weiterhelfen. Hat zwar kein automatisches Layout mit Umbruch bei bestimmter Breite, aber wer weiss...
 

mugsawaay

Aktives Mitglied
Hallo nochmal,

wen es interessiert: habs rausgefunden!
Code:
splitpane.getItems().addAll(anchor1, anchor2);
also nicht getChildren, sondern getItems.

was mir jetzt immer noch Kopfzerbrechen bereitet:

Sei eine Anwendung ancor1 beliebig mit Buttons, Labeln etc. Bestückt.
dann fxml File Anchor1 mit Controller funktioniert! alles gut.

Seie eine weitere Anwendung anchor1 und anchor 2 (mit anchor 2 eine exakte Kopie von Anchor1)
2 fxml Fils 2 Controller funktioniert! alles gut? !

Nicht wirklich, geht das nicht irgendwie intelligenter, wenn z.B. 10 exakt identische anchorPanes da wären bräuchte man 10 Controller + 10 fxml files?????
 

dzim

Top Contributor
Ähm... Also da deine Satzstruktur... sagen wir... seltsam ist, kommt ich nicht raus, was du fragen willst.
Ich vermute du willst das selbe Pane (anchor) X-Mal instantiieren. D.h. du erstellst mit einem FXMLLoader so oft neue Instanzen von zum Beispiel Anchor1.fxml (und dem korrespondierenden Anchor1Controller), bis du fertig bist.
Also nein: Du musst weder das FXML, noch den Controller X-Mal kopieren!
 

dzim

Top Contributor
Java:
for (int i = 0; i < 10; i++) {
    FXMLLoader loader = new FXMLLoader(getClass().getResource("/path/to/Your.fxml")); 
   Pane pane = loader.load(); 
   splitpane.getItems().add(pane);
}
So vielleicht? Wie denn auch sonst?
 

mugsawaay

Aktives Mitglied
wie denn auch sonst? das war ja meine Frage!!!
deine Zeilen hatte ich ja selbst rausgesucht.

ich weiß nicht wie ich es erklären soll!??
wie verbinde ich das mit dem Controller??

nehmen wir an im FXML File existiert ein Button mit der ID "ID1"
den kann ich über den Controller verheiraten.
In deinem Beispiel hätte ich die "ID1" ja 10 mal
also müßte ich den Controller auch 10 mal instanzieren
ich probier mal weiter, irgendwie werde ich das wohl hinbekommen
 

dzim

Top Contributor
Im FXML wird als oberstes Element dein AnchorPane definiert. Korrekt?
Dann wird der Controller jetzt über 'fx:controller="path.to.YourController"' verdrahtet. That's it.

Innerhalb des Controllers hast du dann über die Dependency Injection, um die sich der FXMLLoader kümmert, alle Controls, die mit einer fx:id versehen sind, verdrahtet. Prämisse ist, dass das folgende Schema eingehalten wird: '@FXML <Class> <variable-name-equal-fx:id>'. "ID1" wäre als Name einer Variable dann *aussschliesslich* im Kontext genau dieser einen Instanz des Kontrollers gültig, nicht aber in anderen.
Die Controller-Objekte sind ja nicht die gleichen, nur weil ihr Inhalt der Selbe ist.

Wenn deine Frage dahingehend zielt, wie man *von aussen* auf den Controller zugreift (was aus deinem Text zumindest für mich aber nicht ersichtlich wäre), dann geht das wie folgt:
Java:
for(int i =0; i <10; i++){
   FXMLLoader loader =new FXMLLoader(getClass().getResource("/path/to/Your.fxml"));
   Pane pane = loader.load();
   YourController controller = loader.getController(); // ungetestet, evtl. noch ein Cast notwendig
   // vereinfacht geschrieben, hier musst du dann Methoden aus deinem konkreten Controller verwenden
   controller.callYourMethod();
   splitpane.getItems().add(pane);
}

Btw: Du möchtest Hilfe. Wenn wir etwas nicht verstehen, sei uns ein entsprechender Kommentar etc. gestattet. Kein Grund für dich, pampig zu werden, sonst gibt es einfach keine Antworten mehr.
 

Kababär

Top Contributor
Ich gehe mal davon aus, dass der TE (Threadersteller) die fx:id nicht in der FXML Datei gesetzt hat.
In den xml Tags deiner FXML Datei wird bei deinem Root-Element noch die Angabe über deine Controller-Klasse benötigt. Zeig uns doch mal deine FXML Datei.
 

mugsawaay

Aktives Mitglied
Hallo nochmal,
falls ich mich unglücklich ausgedrückt haben sollte, tut es mir leid, war keine Absicht.
ich pack jetzt mal das komplette (bei mir lauffähige Programm rein)
Frage: woher weiß ich, welcher Button gedrückt wurde, linkes oder rechtes AnchorPane?

main
Code:
package guifxt1;
   
import java.io.IOException;

import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.stage.Stage;
import javafx.scene.Scene;
import javafx.scene.control.SplitPane;
import javafx.scene.layout.AnchorPane;
import javafx.scene.layout.BorderPane;


public class GuiFxT1 extends Application {

    private Stage primaryStage;
    private BorderPane rootLayout;
   
    @Override
    public void start(Stage primaryStage) {
        this.primaryStage = primaryStage;
        this.primaryStage.setTitle("GUI Test");
       
        initRootLayout();

        showAnchors();
    }
   
    /**
     * Initializes the root layout.
     */
    public void initRootLayout() {
        try {
            // Load root layout from fxml file.
            FXMLLoader loader = new FXMLLoader();
            loader.setLocation(GuiFxT1.class.getResource("RootLayout.fxml"));
            rootLayout = (BorderPane) loader.load();

            // Show the scene containing the root layout.
            Scene scene = new Scene(rootLayout);
            primaryStage.setScene(scene);
            primaryStage.show();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
   
   
    public void showAnchors() {
        try {
           
            // Load Split.
            FXMLLoader loadersp = new FXMLLoader();
            loadersp.setLocation(GuiFxT1.class.getResource("SplitPane.fxml"));
            SplitPane splitpane = (SplitPane) loadersp.load();
           
            // Load Anchor1.
            FXMLLoader loader1 = new FXMLLoader();
            loader1.setLocation(GuiFxT1.class.getResource("APwithButton.fxml"));
            AnchorPane anchor1 = (AnchorPane) loader1.load();
           
            // Load Anchor2.
            loader1 = new FXMLLoader();
            loader1.setLocation(GuiFxT1.class.getResource("APwithButton.fxml"));
            AnchorPane anchor2 = (AnchorPane) loader1.load();
           
            splitpane.getItems().addAll(anchor1, anchor2);

            // Set splitpane into the center of root layout.
            rootLayout.setCenter(splitpane);
           
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
   
    public static void main(String[] args) {
        launch(args);
    }

Contoller
}
Code:
package guifxt1;

import javafx.fxml.FXML;

public class GuiFxT1Controller {
   
    @FXML
    private void initialize() {
    }
   
    @FXML
    private void testButton() {
        System.out.println("Button gedrueckt ");
    }
}

RootLayout
Code:
<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.scene.control.*?>
<?import java.lang.*?>
<?import javafx.scene.layout.*?>
<?import javafx.scene.layout.BorderPane?>

<BorderPane prefHeight="600.0" prefWidth="800.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" />

SplitPane
Code:
<?xml version="1.0" encoding="UTF-8"?>

<?import java.lang.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.AnchorPane?>


<SplitPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="305.0" prefWidth="446.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" />

AnchorPane with Button
Code:
<?xml version="1.0" encoding="UTF-8"?>

<?import java.lang.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<?import javafx.scene.layout.AnchorPane?>

<AnchorPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="261.0" prefWidth="199.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="guifxt1.GuiFxT1Controller">
   <children>
      <Button fx:id="button1_und_2" layoutX="74.0" layoutY="118.0" mnemonicParsing="false" onAction="#testButton" text="Button" />
   </children>
</AnchorPane>

Vielen Dank
 

dzim

Top Contributor
Ich glaube, dass man dir leider nicht anders als mit einem KSEB helfen kann...

Main
Java:
package application;

import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;

public class Main extends Application {
   
    @Override
    public void start(Stage stage) throws Exception {
        FXMLLoader loader = new FXMLLoader(getClass().getResource("MultiInstanceTestRoot.fxml"));
        Parent root = loader.load();
        Scene scene = new Scene(root, 1200, 800);
        stage.setScene(scene);
        stage.show();
    }
   
    public static void main(String[] args) {
        launch(args);
    }
}

Root-FXML (ich finde es albern, das SplitPane vom BorderLayout zu trennen):
HTML:
<?xml version="1.0" encoding="UTF-8"?>

<?import java.lang.*?>
<?import javafx.scene.control.SplitPane?>
<?import javafx.scene.layout.BorderPane?>

<BorderPane xmlns:fx="http://javafx.com/fxml" fx:id="rootPane" fx:controller="application.MultiInstanceTestRootController">
    <center>
        <SplitPane fx:id="contentPane"/>
    </center>
</BorderPane>
Der Controller zum Root:
Java:
package application;

import java.io.IOException;

import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.scene.control.SplitPane;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.Pane;

public class MultiInstanceTestRootController {
    @FXML
    private BorderPane rootPane;
    @FXML
    private SplitPane contentPane;
    @FXML
    protected void initialize() {
        for (int i = 0; i < 5; i++) {
            try {
                FXMLLoader loader = new FXMLLoader(getClass().getResource("./MultiInstanceTestPane.fxml"));
                Pane pane = loader.load();
                ((MultiInstanceTestPaneController) loader.getController()).updateIDAndHeader("[" + (i + 1) + "]", "Pane " + (i + 1));
                contentPane.getItems().add(pane);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

Layout des zu wiederholenden Contents:
HTML:
<?xml version="1.0" encoding="UTF-8"?>

<?import java.lang.*?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.layout.VBox?>

<VBox xmlns:fx="http://javafx.com/fxml" fx:id="test" fx:controller="application.MultiInstanceTestPaneController" minHeight="250" minWidth="100" spacing="5">
    <Label fx:id="header" text="[placeholder]"/>
    <Button fx:id="button1" text="Hit me!" onAction="#handleButton1"/>
</VBox>
Der Controller dazu:
Code:
package application;

import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.scene.control.Button;
import javafx.scene.layout.VBox;
import javafx.scene.control.Label;

public class MultiInstanceTestPaneController {
    @FXML
    private VBox test;
    @FXML
    private Label header;
    @FXML
    private Button button1;
    private String id;
    @FXML
    protected void initialize() {
   
    }
    public void updateIDAndHeader(String id, String text) {
        this.id = id;
        header.setText(text);
    }
    @FXML
    public void handleButton1(ActionEvent event) {
        System.err.println("I was pressed on Pane with ID " + id);
    }
}

Das UI ist nicht "hübsch" und ich verwende keine AnchorPanes (ich verstehe den sinn dieser quasi-fixen Teile nicht!).
Aber: Es erstellt dir im Root-Controller 5 Child-Nodes für das SplitPane und zeigt sie an.
Mittels Methode am Controller werden Daten in den jeweiligen Controller gesetzt. Dort gibt es einen primitiven Handler für den Button.

Das ist mein vorerst letzter Versuch dazu, dir zu helfen. Ich hoffe du wirst schlau draus, ansonsten müssen dir die anderen von hier aus weiterhelfen.

Grüsse
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
Z JavaFX Pane für wechselnde Sub-Panes mit Auto-Resize AWT, Swing, JavaFX & SWT 2
J JavaFX Rectangle innerhalb eines Rectangle oder Panes positionieren? AWT, Swing, JavaFX & SWT 1
S Swing Inhalte von Scroll-Panes werden nicht gezeichnet AWT, Swing, JavaFX & SWT 9
dzim Layout von Panes in JFX2 AWT, Swing, JavaFX & SWT 17
darekkay Tabbed Panes ohne Tab-Titel? AWT, Swing, JavaFX & SWT 2
G Exception javafx Thread -> caused by removing children while in EventHandler AWT, Swing, JavaFX & SWT 28
B Minimum x und y von Children-JPanels ermitteln AWT, Swing, JavaFX & SWT 3
B Größe der Parent-Component dynamisch an children anpassen AWT, Swing, JavaFX & SWT 30
L JavaFX VBox oder HBox children filtern? AWT, Swing, JavaFX & SWT 14
P JavaFX Szenegraph - Koordinaten von Children einer Group AWT, Swing, JavaFX & SWT 0
G JavaFX Children AWT, Swing, JavaFX & SWT 1
V JTree Children Ausgabe Problem AWT, Swing, JavaFX & SWT 2
M Elemente statisch anordnen AWT, Swing, JavaFX & SWT 4
G LayoutManager Panels anordnen über Schleifenvariablen AWT, Swing, JavaFX & SWT 7
DaCrazyJavaExpert Swing Komponenten genauer anordnen. AWT, Swing, JavaFX & SWT 13
B JTabbedPane Tabs anordnen AWT, Swing, JavaFX & SWT 2
T LayoutManager Anordnen der Elemente im GridBagLayout AWT, Swing, JavaFX & SWT 11
L Eigene Component anordnen AWT, Swing, JavaFX & SWT 7
S JLabel anordnen AWT, Swing, JavaFX & SWT 2
V Fenster in einem Fenster anordnen AWT, Swing, JavaFX & SWT 7
D Wie kann ich Buttons und Labels besser anordnen AWT, Swing, JavaFX & SWT 4
W JRadioButton sauber untereinander anordnen AWT, Swing, JavaFX & SWT 3
D AWT Knoten für Graphen kreisförmig anordnen AWT, Swing, JavaFX & SWT 5
W LayoutManager GridBag richtig nutzen - Komponenten richtig anordnen und automatisch vergrößern AWT, Swing, JavaFX & SWT 5
D Mit GridBayLayout Komponenten anordnen AWT, Swing, JavaFX & SWT 6
H LayoutManager Auf gleicher Höhe anordnen AWT, Swing, JavaFX & SWT 4
H Bilder in Array zufällig anordnen AWT, Swing, JavaFX & SWT 4
Ollek JDialog Koponenten neu anordnen AWT, Swing, JavaFX & SWT 3
L JPanel Formen paralell anordnen AWT, Swing, JavaFX & SWT 9
S Anordnen von Buttons im BorderLayout AWT, Swing, JavaFX & SWT 6
A Gridlayout Vertikal anordnen AWT, Swing, JavaFX & SWT 6
J SWT 4 Objekte auf einem Composite anordnen AWT, Swing, JavaFX & SWT 5
P Buttons anordnen AWT, Swing, JavaFX & SWT 8
W Panels vertikal anordnen AWT, Swing, JavaFX & SWT 10
chik Button beschriften und Farbe zufällig anordnen AWT, Swing, JavaFX & SWT 2
K Zwei Panels zentriert anordnen AWT, Swing, JavaFX & SWT 3
M Fenster Windows-Like anordnen AWT, Swing, JavaFX & SWT 2
0 Bilder auf einem Grid anordnen? AWT, Swing, JavaFX & SWT 9
GilbertGrape Wie Panel anordnen? Welches Layout? AWT, Swing, JavaFX & SWT 7
T Komponenten im JPanel linksbündig anordnen? AWT, Swing, JavaFX & SWT 5
W Zeilenweises Anordnen von Komponenten AWT, Swing, JavaFX & SWT 3
T Frage zum Komponenten anordnen AWT, Swing, JavaFX & SWT 4
K Icon und Text auf JButton anordnen AWT, Swing, JavaFX & SWT 2
G Inhalt von JTable mittig anordnen AWT, Swing, JavaFX & SWT 6
G Sinnvoll Swingkomponenten anordnen AWT, Swing, JavaFX & SWT 3
P GridbagLayout: Komponenten anordnen mit Freiraum AWT, Swing, JavaFX & SWT 6
S JPanel anordnen AWT, Swing, JavaFX & SWT 18
E jtree, icon oben anordnen AWT, Swing, JavaFX & SWT 2
W JSpinner: Button vertikal anordnen AWT, Swing, JavaFX & SWT 2
H Komponenten übereinander anordnen, I/O-Konsole AWT, Swing, JavaFX & SWT 3
S Komponenten übereinander anordnen? AWT, Swing, JavaFX & SWT 5
H TextFields anordnen AWT, Swing, JavaFX & SWT 8
T Swing: frei Objekte anordnen AWT, Swing, JavaFX & SWT 9

Ähnliche Java Themen


Oben