Можно ли добавить 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.

  • Либо вы должны использовать свой класс обратного отсчета в качестве HBox следующим образом:

    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,

  • Или вы можете использовать свой объект для инициализации атрибута HBox и получить его с помощью метода получения:

    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(),

  • Другие вопросы по тегам