저는 SceneBuilder와 Java FX의 사용자 정의 컨트롤 처리 방법에 대해 끝내 왔습니다.SceneBuilder 사용자 정의 컨트롤 클래스 경로
fx : root를 사용합니까, 아니면 사용하지 않습니까? 나는 그것을 사용하기로했다. 따라서 컨트롤러의 컨트롤러 + 루트 클래스 내에서, 나는 단지 루트 및 컨트롤러로 설정합니다. 그러나 여전히 "루트는 이 설정되지 않았습니다.로드하기 전에 setRoot() 메서드를 사용하십시오."
사용자 지정 컨트롤이 포함될 상위 FXML 내에서 은 무엇입니까?
올바른 사용자 정의 컨트롤을 SceneBuilder 2.0에 표시 할 수있는 올바른 클래스 경로는 무엇입니까? 나는 "/.../.../.../bin"을 전혀 이해하지 못합니다.
새
<fx:include>
태그가있는 경우<MyCustomControl />
마크 업에서 더 이상 사용할 필요가 있습니까?
지금까지 사용자 정의 컨트롤은 진행률 표시기에 지나지 않았습니다.
<?xml version="1.0" encoding="UTF-8"?>
<?import java.lang.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<?import javafx.scene.layout.HBox?>
<fx:root type="HBox" xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/8">
<children>
<ProgressBar fx:id="progressBar" prefWidth="200.0" progress="0.0" />
</children>
</fx:root>
package application.ctrl;
import java.io.IOException;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.scene.control.ProgressIndicator;
import javafx.scene.layout.HBox;
import application.Main;
자사의 컨트롤러 :
public class ProgressSelector extends HBox {
@FXML
private ProgressIndicator progressBar;
public ProgressSelector() {
FXMLLoader loader = new FXMLLoader(getClass().getResource(
Main.PROGRESS_SELECTOR));
loader.setRoot(this);
loader.setController(this);
loader.setClassLoader(this.getClass().getClassLoader());
try {
loader.load();
} catch (IOException e) {
e.printStackTrace();
}
}
}
부모 FXML :
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.text.*?>
<?import javafx.geometry.*?>
<?import java.lang.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<?import javafx.scene.layout.VBox?>
<?import application.ctrl.ProgressSelector?>
<VBox fx:id="vbox" spacing="5.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="application.ctrl.ObjectiveEditorCtrl">
<children>
<HBox>
<children>
<Button mnemonicParsing="false" onAction="#back" text="<" />
<Label text="Editing Objective:" />
</children>
</HBox>
<TextField fx:id="objectiveName" />
<ProgressSelector />
<HBox>
<children>
<Label text="Planned Start:" />
<Region HBox.hgrow="ALWAYS" />
<DatePicker fx:id="plannedStart" />
</children>
</HBox>
<HBox>
<children>
<Label text="Actual Start:" />
<Region HBox.hgrow="ALWAYS" />
<DatePicker fx:id="actualStart" />
</children>
</HBox>
<HBox>
<children>
<Label text="Planned Finish:" />
<Region HBox.hgrow="ALWAYS" />
<DatePicker fx:id="plannedFinish" />
</children>
</HBox>
<HBox>
<children>
<Label text="Actual Finish:" />
<Region HBox.hgrow="ALWAYS" />
<DatePicker fx:id="actualFinish" />
</children>
</HBox>
<HBox alignment="CENTER_RIGHT">
<children>
<Button mnemonicParsing="false" onAction="#save" text="Save" />
<Button mnemonicParsing="false" onAction="#back" text="Cancel" />
</children>
</HBox>
</children>
<padding>
<Insets bottom="5.0" left="5.0" right="5.0" top="5.0" />
</padding>
</VBox>
자사의 컨트롤러 : 여기
package application.ctrl;
import interfaces.ControlledScreenInterface;
import java.net.URL;
import java.util.ResourceBundle;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.DatePicker;
import javafx.scene.control.TextField;
import javafx.scene.layout.VBox;
import application.ScreenController;
import application.objects.Objective;
public class ObjectiveEditorCtrl implements Initializable,
ControlledScreenInterface {
@FXML
private TextField objectiveName;
@FXML
private ProgressSelector completion;
@FXML
private DatePicker plannedStart;
@FXML
private DatePicker plannedFinish;
@FXML
private DatePicker actualStart;
@FXML
private DatePicker actualFinish;
@FXML
private VBox vbox;
private ScreenController parent;
private Objective current;
@Override
public void initialize(URL location, ResourceBundle resources) {
// TODO Auto-generated method stub
}
public void init(Objective current) {
this.current = current;
objectiveName.setText(current.getName());
// completion.setProgress(current.getCompletion());
plannedStart.setValue(current.getPlannedStart());
actualStart.setValue(current.getActualStart());
plannedFinish.setValue(current.getPlannedFinish());
actualFinish.setValue(current.getActualFinish());
}
public void save() {
// current.setName(objectiveName.getText());
// // current.setCompletion(completion.getProgress());
// current.setPlannedStart(plannedStart.getValue());
// current.setPlannedFinish(plannedFinish.getValue());
// current.setActualStart(actualStart.getValue());
// current.setActualFinish(actualFinish.getValue());
// back();
}
public void back() {
parent.back();
}
@Override
public void setParentScreen(ScreenController parent) {
this.parent = parent;
}
}