Jak przenieść obiekty między .java a .fxml

0

Witam, mam problem taki że mam button w fxml-u przeniesiony do kontrolera z onClickiem() i chcę żeby w tym onlicku się otwierał dialog user tam wpisywał itd. tam szło to to wiem jak zrobić tylko potem te informacje co user wpisze chce przerobić na layout z buttonami i labelai i wsadzić do scrollarea w fxmlu i tego właśnie nie wiem jak zrobić... W sensie jak miałbym to robić to robiłbym to przez kod javy a wiem że powinienem przez fxmla :/

1
  1. Po onClick otwierasz sobie okno dialogowe z formatką do wpisywania i masz dwie opcje: albo wysyłasz przy tworzeniu dialogu model do modyfikacji przez konstruktor lub robisz jakieś obejścia i modyfikujesz model danych z jakiegoś singletona, tworzysz jakiegoś handlera. Musisz mieć jakiś obiekt przechowujący dane wprowadzane w dialogu.
  2. Jak masz kontroler z powiązanym FXML'em to możesz mieć pole powiązane:
    @FXML
    ScrollPane pane
    wtedy gdy masz już model danych z formatki możesz sobie wygenerować jakiegoś GridPane z etykietkami przyciskami i dodać go do ScrollPane'a przez jakiś addNode nie pamiętam już konkretnie.
  3. Jakbyś miał kod aplikacji to mógłbym zerknąć na to bardziej konkretnie.
0

Aha czyli mając ten scrollpanel z id w fxmlu i wpisując go do javy one się jakby połączą i jak w javie coś do niego dodam to to się wpisze do kodu fxmla?

PACKAGE: HABIT

package Habit;

import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.layout.HBox;
import javafx.scene.text.TextAlignment;

import java.util.Calendar;
import java.util.Date;
import java.util.Vector;


public class Habit {
    String name, notes;
    int currentScore, maxScore;

    ///gui
    Button statusBtn;
    Label namelbl;
    HBox lay;
    ///

    Habit(String name, String notes) {
        this.name = name;
        this.notes = notes;

        namelbl = new Label(name);

        statusBtn = new Button("...");
        statusBtn.setPrefSize(16, 16);
        statusBtn.setVisible(true);
        statusBtn.setOnAction(e -> System.out.println(notes));

        lay = new HBox();
        lay.setSpacing(10);
        lay.setAlignment(Pos.BASELINE_LEFT);
        lay.getChildren().addAll(statusBtn, namelbl);


        Calendar cal = Calendar.getInstance();
        Date dat = cal.getTime();
        cal.setTime(dat);
        int dayOfWeek = cal.get(Calendar.DAY_OF_WEEK);
        int day = cal.get(Calendar.DAY_OF_MONTH);
        System.out.println(dayOfWeek);
        int monday = day - ((dayOfWeek + 5) % 7);

        Vector<Button> buttons = new Vector<>();

        for (int i = 0; i < 7; i++) {
            Button btnxd = new Button();
            btnxd.setText(String.valueOf(monday + i));
            btnxd.setPadding(new Insets(5, 5, 5, 5));
            btnxd.setPrefSize(32, 32);
            if (i <= dayOfWeek-2) setStatus(status.UNKNOWN, btnxd);
            buttons.add(btnxd);
            lay.getChildren().add(btnxd);
        }


    }

    public enum status {
        UNKNOWN, COMPLETED, SKIPPED, FAILED
    }

    public void setStatus(status stat, Button but) {
        if (stat == status.UNKNOWN) {
            but.setStyle("-fx-background-color: gray;");
            but.setText("?");
            but.setOnAction(e -> setStatus(status.COMPLETED, but));
        } else if (stat == status.COMPLETED) {
            but.setStyle("-fx-background-color: green;");
            but.setText("✔");
            but.setOnAction(e -> setStatus(status.SKIPPED, but));
            currentScore+=1;
            if(currentScore>maxScore) maxScore = currentScore;
        } else if (stat == status.SKIPPED) {
            but.setStyle("-fx-background-color: blue;");
            but.setText("▬");
            but.setOnAction(e -> setStatus(status.FAILED, but));
        } else if (stat == status.FAILED) {
            but.setStyle("-fx-background-color: red;");
            but.setText("✖");
            but.setOnAction(e -> setStatus(status.UNKNOWN, but));
            currentScore=0;
        }
    }

    public String getName() {
        return name;
    }

    public HBox getLay() {
        return lay;
    }

}

package Habit;

import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.scene.control.Button;

public class HabitController {
    @FXML
    private Button btnMonday, btnTuesday, btnWednesday, btnThursday, btnFriday, btnSaturday, btnSunday;
@FXML
public void onAnyWeekBtnClicked(ActionEvent e){
    Object o = e.getSource();
    String senderName = o.toString();
    switch (senderName)
    {
        case "btnMonday": btnMonday.setStyle("-fx-background-color: #363636");
        case "btnTuesday": btnTuesday.setStyle("-fx-background-color: #363636");
        case "btnWednesday": btnWednesday.setStyle("-fx-background-color: #363636");
        case "btnThursday": btnThursday.setStyle("-fx-background-color: #363636");
        case "btnFriday": btnFriday.setStyle("-fx-background-color: #363636");
        case "btnSaturday": btnSaturday.setStyle("-fx-background-color: #363636");
        case "btnSunday": btnSunday.setStyle("-fx-background-color: #363636");
    }


}

}

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

<?import javafx.scene.control.Button?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.control.TextField?>
<?import javafx.scene.control.ToolBar?>
<?import javafx.scene.layout.AnchorPane?>
<?import javafx.scene.layout.VBox?>


<AnchorPane prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/11.0.1"
            xmlns:fx="http://javafx.com/fxml/1" fx:controller="Habit.HabitController">
   <children>
      <VBox layoutX="15.0" layoutY="14.0">
         <children>
            <Label prefHeight="17.0" prefWidth="149.0" text="Habit name:" />
            <TextField />
         </children>
      </VBox>
      <VBox layoutX="15.0" layoutY="82.0">
         <children>
            <Label prefHeight="17.0" prefWidth="150.0" text="Notes, comments:" />
            <TextField prefHeight="150.0" prefWidth="148.0" />
         </children>
      </VBox>
      <Label layoutX="34.0" layoutY="273.0" text="Schedule" />
      <ToolBar layoutX="14.0" layoutY="312.0" prefHeight="40.0" prefWidth="200.0">
        <items>
          <Button mnemonicParsing="false" text="Monday" fx:id="btnMonday" onAction="#onAnyWeekBtnClicked"/>
            <Button mnemonicParsing="false" text="Tuesday" fx:id="btnTuesday"/>
            <Button mnemonicParsing="false" text="Wednesday" fx:id="btnWednesday" />
            <Button mnemonicParsing="false" text="Thursday" fx:id="btnThursday"/>
            <Button mnemonicParsing="false" text="Friday" fx:id="btnFriday"/>
            <Button mnemonicParsing="false" text="Saturday" fx:id="btnSaturday"/>
            <Button mnemonicParsing="false" text="Sunday" fx:id="btnSunday"/>
        </items>
      </ToolBar>
   </children>
</AnchorPane>

I PACKAGE SAMPLE

package sample;

import Habit.Habit;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.stage.Stage;
import Habit.*;

public class Controller {
    @FXML Button btnAdd, btnDelete, btnEdit;
    Habit habit;
    @FXML
    public void onBtnAddClick(){

}
}

package sample;

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 primaryStage) throws Exception{
        Parent root = FXMLLoader.load(getClass().getResource("sample.fxml"));
        primaryStage.setTitle("Hello World");
        primaryStage.setScene(new Scene(root, 300, 275));
        primaryStage.show();
    }


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

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

<?import javafx.geometry.Insets?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.control.Menu?>
<?import javafx.scene.control.MenuBar?>
<?import javafx.scene.control.MenuItem?>
<?import javafx.scene.control.ScrollPane?>
<?import javafx.scene.control.ToolBar?>
<?import javafx.scene.layout.AnchorPane?>
<?import javafx.scene.layout.BorderPane?>
<?import javafx.scene.layout.HBox?>
<?import javafx.scene.layout.VBox?>


<BorderPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity"
            minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0"
            xmlns="http://javafx.com/javafx/11.0.1" xmlns:fx="http://javafx.com/fxml/1" fx:controller="sample.Controller">
   <top>
      <VBox BorderPane.alignment="CENTER">
         <children>
            <MenuBar>
              <menus>
                <Menu mnemonicParsing="false" text="File">
                  <items>
                    <MenuItem mnemonicParsing="false" text="Close" />
                  </items>
                </Menu>
                <Menu mnemonicParsing="false" text="Edit">
                  <items>
                    <MenuItem mnemonicParsing="false" text="Delete" />
                  </items>
                </Menu>
                <Menu mnemonicParsing="false" text="Help">
                  <items>
                    <MenuItem mnemonicParsing="false" text="About" />
                  </items>
                </Menu>
              </menus>
            </MenuBar>
            <ToolBar prefHeight="40.0" prefWidth="200.0">
              <items>
                <Button mnemonicParsing="false" text="Habits" />
              </items>
            </ToolBar>
            <ToolBar prefHeight="40.0" prefWidth="200.0">
               <items>
                  <HBox spacing="15.0">
                     <children>
                        <Button mnemonicParsing="false" text="Add" fx:id="btnAdd"/>
                        <Button mnemonicParsing="false" text="Edit" fx:id="btnEdit" />
                        <Button mnemonicParsing="false" text="Delete"  fx:id="btnDelete"/>
                     </children>
                     <padding>
                        <Insets bottom="5.0" left="5.0" right="5.0" top="5.0" />
                     </padding>
                  </HBox>
               </items>
            </ToolBar>
         </children>
      </VBox>
   </top>
   <center>
      <ScrollPane hbarPolicy="NEVER" BorderPane.alignment="CENTER">
        <content>
          <AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="200.0" prefWidth="200.0" />
        </content>
      </ScrollPane>
   </center>
</BorderPane>

0

Dobra poddaje się, proszę o pomoc :D
Wysypuje mi się po stworzeniu stage w HabitController
https://github.com/Xezolpl/Habit-tracker.git

1 użytkowników online, w tym zalogowanych: 0, gości: 1