Можно ли добавить Hbox в StackPane?
Как вы можете видеть, я младший разработчик и новичок в сообществе stackOverflow. Поэтому, пожалуйста, не говорите мне, что я глуп (или, по крайней мере, почему:))
Я пишу небольшое приложение на javaFx и сталкиваюсь с небольшой проблемой, над которой я работал весь день.
Итак, у меня есть эта программа с этим классом:
package glintSG.view.mainPane;
import java.awt.Dimension;
import javafx.geometry.Pos;
import javafx.scene.layout.HBox;
import javafx.scene.text.Text;
public class CountDown extends HBox {
private Text countDownLabel;
public CountDown() {
super();
}
public HBox buildCountDown() {
HBox hb = new HBox();
hb.setId("countDownBox");
countDownLabel = new Text();
countDownLabel.setId("countdownlabel-SG");
//position of the count down adapted to the screen size
relocateCountDown();
countDownLabel.getStyleClass().add("countdownlabel-SG");
hb.getChildren().add(countDownLabel);
hb.setAlignment(Pos.BASELINE_LEFT);
return hb;
}
public Text getCountDownLabel() {
return countDownLabel;
}
public void relocateCountDown() {
countDownLabel.setTranslateX(Main.getWindowWidth()/2);
}
}
И теперь, если я называю это, на мой взгляд, это работает:
package glintSG.view;
public class SGView {
private EnterHeadingPane enterHeadingPane;
private CountDown countDown;
@Override
public void preInit() {
countDown = new CountDown();
enterHeadingPane = new EnterHeadingPane();
}
@Override
public void init() {
getRootNode().getChildren().add(countDown.buildCountDown());
getRootNode().getChildren().add(enterHeadingPane.buildEnterCap());
}
}
(Как вы видите, я действительно сократил класс, чтобы вы были более читабельными, не стесняйтесь, если вам нужно больше о классе)
Но если я это сделаю, это сработает. Что я не понимаю, так это когда я не хочу помещать отсчет времени в основное изображение, но на вспомогательной панели стека ничего не отображается. Если я положу свой отсчет в этом классе:
package glintSG.view.mainPane;
public class EnterHeadingPane extends StackPane {
private Group group;
private Button tryButtonCAP;
private TextField inputTextCAP;
private Text textLabel;
private CountDown countDown;
private DifficultyLvlBox diffLvl;
private double textFieldPaddingTop = 7.0;
private double textFieldPaddingBot = 09.0;
private double textFieldPaddingLeft = 10.0;
private double textFieldPaddingRight = 10.0;
private double ButtonPaddingTop = 10.0;
private double ButtonPaddingBot = 10.0;
private double ButtonPaddingLeft = 10.0;
private double ButtonPaddingRight = 10.0;
private CustomTextField capTextField;
private boolean isWarningHere = false;
private Dimension dimension = java.awt.Toolkit.getDefaultToolkit().getScreenSize();
public EnterHeadingPane() {
super();
this.getStyleClass().add("glint-title-window");
}
public StackPane buildEnterCap() {
final StackPane enterCap = new StackPane();
enterCap.setId("enterCapLayer");
textLabel = buildTextLabel();
inputTextCAP = buildTextFieldCap();
tryButtonCAP = buildCapButton();
countDown =buildCountDown();
group = new Group();
group.getChildren().add(tryButtonCAP);
group.getChildren().add(inputTextCAP);
group.getChildren().add(textLabel);
group.getChildren().add(countDown);
group.getChildren().add(diffLvl);
group.setTranslateX(getScreenWidth() -
textLabel.getLayoutBounds().getWidth() - 50);
group.setTranslateY(900);
enterCap.getChildren().add(group);
return enterCap;
}
//well i write the methods buildTextLabel etc.
private CountDown buildCountDown() {
countDown = new CountDown();
countDown.setId("countDown-SG");
countDown.buildCountDown();
countDown.setAlignment(Pos.CENTER);
return countDown;
}
}
И тогда, если я сделаю это, мой отсчет не будет напечатан. Зачем?
Поэтому я думаю, что главный вопрос: можно ли поместить hbox в стек стека, но я думаю, что это так. Так что мне нужно, чтобы вы помогли мне:) Если кто-нибудь знает почему, пожалуйста, помогите мне:)
1 ответ
В вашем первом примере это работает, потому что вы используете
getRootNode().getChildren().add(countDown.buildCountDown());
И когда вы звоните countDown.buildCountDown()
Вы создаете новый HBox и возвращаете его.
В вашем втором примере
private CountDown buildCountDown() {
countDown = new CountDown();
countDown.setId("countDown-SG");
countDown.buildCountDown();
countDown.setAlignment(Pos.CENTER);
return countDown;
}
Это не работает, потому что вы возвращаете свой объект CountDown, который расширяет HBox
но который пуст.
Вы действительно ошиблись с вашим классом CountDown.
public class CountDown extends HBox {
private Text countDownLabel;
public CountDown() {
super();
// Initializes your CountDown.
buildCountDown();
}
public void buildCountDown() {
// Not needed to instantiate a new HBox, your countdown object is extending this kind of Node
this.setId("countDownBox");
countDownLabel = new Text();
countDownLabel.setId("countdownlabel-SG");
//position of the count down adapted to the screen size
relocateCountDown();
countDownLabel.getStyleClass().add("countdownlabel-SG");
// Add the label to your CountDown object.
this.getChildren().add(countDownLabel);
this.setAlignment(Pos.BASELINE_LEFT);
}
public Text getCountDownLabel() {
return countDownLabel;
}
public void relocateCountDown() {
countDownLabel.setTranslateX(Main.getWindowWidth()/2);
}
}
И когда вы создаете экземпляр вашего объекта CountDown, вы можете добавить его в свой Group
или в вашем StackPane
,
public class CountDown {
private Text countDownLabel;
private HBox container;
public CountDown() {
super();
// Initializes your CountDown.
buildCountDown();
}
// Your method
public void buildCountDown() {
container = new HBox();
container.setId("countDownBox");
countDownLabel = new Text();
countDownLabel.setId("countdownlabel-SG");
//position of the count down adapted to the screen size
relocateCountDown();
countDownLabel.getStyleClass().add("countdownlabel-SG");
container.getChildren().add(countDownLabel);
container.setAlignment(Pos.BASELINE_LEFT);
}
// You can access to your HBox here
public HBox getContainer() {
return container;
}
public Text getCountDownLabel() {
return countDownLabel;
}
public void relocateCountDown() {
countDownLabel.setTranslateX(Main.getWindowWidth()/2);
}
}
Hbox
"контейнер" будет инициализирован в то же время, что и ваш объект CountDown как buildCountDown
метод вызывается в конструкторе CountDown. И вы можете получить к нему доступ через геттер CountDown#getContainer()
,