#javafx #scenebuilder #pane #hbox
#javafx #scenebuilder #панель #hbox
Вопрос:
Я работаю над проектом, который будет включать добавление панелей (или hboxes, если это работает лучше) в очень широкий HBox. Я довольно легко настроил это в fxml, но мне уже нужно будет сделать несколько из них, и я бы хотел избежать всех операций копирования-вставки. Итак, я решил, что мне следует попробовать использовать цикл for для заполнения HBox, но по какой-то причине это не работает. Я нахожусь в самом начале, поэтому мой код очень прост и понятен.
Это базовый пример, который я пытаюсь воссоздать
<HBox>
<children>
<Pane fx:id="pane0" prefHeight="200.0" prefWidth="200.0">
<children>
<Button layoutX="71.0" layoutY="95.0" mnemonicParsing="false" text="Button" />
</children></Pane>
<Pane fx:id="pane1" prefHeight="200.0" prefWidth="200.0">
<children>
<Button layoutX="71.0" layoutY="95.0" mnemonicParsing="false" text="Button" />
</children></Pane>
<Pane fx:id="pane2" prefHeight="200.0" prefWidth="200.0">
<children>
<Button layoutX="71.0" layoutY="95.0" mnemonicParsing="false" text="Button" />
</children></Pane>
</children>
</HBox>
Итак, чтобы создать его динамически (и для наглядности), я создал класс для HBox и панелей. На данный момент на каждой панели есть только кнопка, но они будут подвергнуты дальнейшей настройке, как только этот код заработает. То же самое с HBox.
Вот HBox
public class HBoxTestClass {
@FXML
HBox hBox = new HBox();
public HBoxTestClass(){
}
@FXML
public void initialize(){
populateHBox();
}
private void populateHBox(){
for (int i = 0; i < 3; i ){
hBox.getChildren().add(new TestPane());
hBox.setSpacing(10);
}
}
}
его fxml
<HBox fx:id="hBox" xmlns="http://javafx.com/javafx"
xmlns:fx="http://javafx.com/fxml"
fx:controller="sample.HBoxTestClass"
prefHeight="400.0" prefWidth="600.0">
</HBox>
Класс pane и его fxml
public class TestPane extends Pane{
@FXML Pane testPane = new Pane();
@FXML Button button = new Button();
public TestPane(){
}
@FXML
private void initialize(){
button.setText("Click Me!");
}
}
<Pane fx:id="testPane" xmlns="http://javafx.com/javafx"
xmlns:fx="http://javafx.com/fxml"
fx:controller="sample.TestPane"
prefHeight="200.0" prefWidth="200.0">
<children>
<Button fx:id="button" layoutX="71.0" layoutY="95.0" mnemonicParsing="false" text="Button" />
</children>
</Pane>
Итак, мой очень простой код выше просто создает пустой широкий экран без панелей на нем. Я помещаю консольную печать в конструктор моего TestPane
класса, поэтому я знаю, что он вызывается, но по-прежнему ничего не отображается. Есть какие-нибудь советы? Спасибо
Комментарии:
1.
HBox hBox = new HBox();
->HBox hBox;
2. @Sedrick Я внес это изменение и аналогичное в
TestPane
классе, но это ничего не изменило3. Я не следую этому коду ->
@FXML public void initialize(){ populateHBox(); }
. Используйте Netbeans и SceneBuilder для настройки и изменения вашего проекта.4. @Sedrick Да, я не знаю, почему я просто не объединил эти методы. Я использовал scenebuilder, но мне просто интересно, есть ли лучший способ добавить панели в hbox в fxml.
5. @Sedrick Я их объединил. тот же результат
Ответ №1:
Я не уверен, что вы делаете в своем коде неправильно. Подобный код @FXML Pane testPane = new Pane();
должен выглядеть как @FXML Pane testPane;
. Я не уверен, как в вашей программе вызывается подобный код @FXML
. Попробуйте следовать этому MCVE.
public void initialize(){
Главная
import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;
/**
*
* @author blj0011
*/
public class JavaFXApplication363 extends Application
{
@Override
public void start(Stage stage) throws Exception
{
Parent root = FXMLLoader.load(getClass().getResource("FXMLDocument.fxml"));
Scene scene = new Scene(root);
stage.setScene(scene);
stage.show();
}
/**
* @param args the command line arguments
*/
public static void main(String[] args)
{
launch(args);
}
}
Контроллер
import java.net.URL;
import java.util.ResourceBundle;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.Label;
import javafx.scene.layout.HBox;
import javafx.scene.layout.StackPane;
/**
*
* @author blj0011
*/
public class FXMLDocumentController implements Initializable
{
@FXML
private HBox hBox;
@Override
public void initialize(URL url, ResourceBundle rb)
{
// TODO
for (int i = 0; i < 5; i ) {
StackPane stackPane = new StackPane(new Label("Label: " i));
hBox.getChildren().add(stackPane);
}
}
}
FXML
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.layout.HBox?>
<HBox fx:id="hBox" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/8.0.141" xmlns:fx="http://javafx.com/fxml/1" fx:controller="javafxapplication363.FXMLDocumentController" />
Комментарии:
1. Я попробовал ваш код, и он выдает HBox, в котором просто label: 0, label: 1 и т.д. напечатаны подряд. imgur.com/a/afSgTld вот как это выглядит
2. Чего вы ожидали?