当前位置: 首页 > 知识库问答 >
问题:

JavaFx自定义ListCell为空

乐正远
2023-03-14

我正在尝试为JavaFXListview创建一个非常简单的自定义ListCell。运行应用程序时,列表视图中有没有任何内容的项目。它们可以点击,但是是空的。如下图所示:

我使用的是基于JDK12和Maven JFX原型(原型artifactid:javafx原型fxml,groupid:org.openjfx)的设置。我遵循了一个名为“Turais Custom ListCell”的指南。

一个pp.java

public class App extends Application {

private static Scene scene;

@Override
public void start(Stage stage) throws IOException {
    scene = new Scene(loadFXML("primary"));
    stage.setScene(scene);
    stage.show();
}

static void setRoot(String fxml) throws IOException {
    scene.setRoot(loadFXML(fxml));
}

private static Parent loadFXML(String fxml) throws IOException {
    FXMLLoader fxmlLoader = new FXMLLoader(App.class.getResource(fxml + ".fxml"));
    return fxmlLoader.load();
}

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

}

主要ontroller.java

public class PrimaryController implements Initializable {

ObservableList<Student> students;

@FXML
private ListView<Student> listView1;

@FXML
private void switchToSecondary() throws IOException {
    App.setRoot("secondary");
}

public PrimaryController(){
    super();
    students = FXCollections.observableArrayList();
   students.add(new Student());

}

@Override
public void initialize(URL url, ResourceBundle resourceBundle) {
    listView1.setItems(students);
    listView1.setCellFactory(new Callback<ListView<Student>, ListCell<Student>>() {
        @Override
        public ListCell<Student> call(ListView<Student> listView) {
            return new StudentListViewCell();
        }
    });
}

}

Primary.fxml

<VBox alignment="CENTER" prefHeight="257.0" prefWidth="230.0" spacing="20.0" xmlns="http://javafx.com/javafx/8.0.172-ea" xmlns:fx="http://javafx.com/fxml/1" fx:controller="com.test.PrimaryController">    
   <children>
      <Label text="Primary View" />
      <Button fx:id="primaryButton" onAction="#switchToSecondary" text="Switch to Secondary View" />    
      <ListView fx:id="listView1" prefHeight="200.0" prefWidth="200.0" />
   </children>
   <padding>
      <Insets bottom="20.0" left="20.0" right="20.0" top="20.0" />
   </padding>
   </VBox>    

ListCell.fxml

<AnchorPane prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/8.0.172-ea" xmlns:fx="http://javafx.com/fxml/1">
   <children>
      <Label  fx:id="label1" layoutX="293.0" layoutY="190.0" text="Label" />
   </children>
</AnchorPane>    

StudentListViewCell.java

public class StudentListViewCell extends ListCell<Student> {

@FXML
private Label label1;

@FXML
private AnchorPane anchorPane;

private FXMLLoader mLLoader;

@Override
protected void updateItem(Student student, boolean empty) {
    super.updateItem(student, empty);

    if(empty || student == null) {

        setText(null);
        setGraphic(null);

    } else {
        if (mLLoader == null) {
            mLLoader = new FXMLLoader(getClass().getResource("ListCell.fxml"));
            mLLoader.setController(this);

            try {
                mLLoader.load();
            } catch (IOException e) {
                e.printStackTrace();
            }

        }

        label1.setText("rightText");


        setText(null);
        setGraphic(anchorPane);
    }

}

}

Student.java

public class Student {
private String name;



public Student(String name){
    this.name = name;

}

}

我期待一个单一的<代码> ListCys,中间有一个标签,上面写着“右TeleTXT”。但我的自定义listcell似乎甚至没有呈现。有什么建议吗?


共有1个答案

马祺
2023-03-14

除了您的实现看起来比需要的复杂得多之外,您的实际问题非常简单。

您的ListCell.fxml文件未将fx:id分配给您的AnchorPane。因此,当您在StudentListViewCell.java类中定义它时,您实际上是在创建一个新的主播,并且它不包含标签

只需更改您的ListCell.fxml文件并分配id即可解决该问题:

<AnchorPane fx:id="anchorPane" prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/8.0.172-ea"
            xmlns:fx="http://javafx.com/fxml/1">
    <children>
        <Label fx:id="label1" layoutX="293.0" layoutY="190.0" text="Label"/>
    </children>
</AnchorPane>
 类似资料:
  • 我试图找出如何使用一个与一个在,但没有运气,我已经查了,我能找到的都是不完整的教程和问题。下面是我的FXML 还有我的模特 和我不完整的 还有我的控制器 请不要告诉我找不到。我现在迷路了,我不知道在我的FXML中更新图像视图和标签的正确方法。任何人来帮助或与一个教程的链接,我可以遵循,我将不胜感激。

  • 我创建了一个自定义IntegerRapper类来实现一个属性提取器方法,如下所示: 我还创建了一个名为“PortCell”的类,它扩展了ListCell以设计我喜欢的单元格,如下所示: 当用户右键单击ListView中的端口号并单击“开始监听”时,我希望红十字会变成一个绿色的勾号,这一切正常,但当我移除带有绿色勾号的端口上方的端口时,绿色勾号下方显示的端口似乎继承了勾号?绿色勾号仅在传递给upda

  • 问题内容: 我尝试使用自定义ListCell在ListView中查看自定义对象。为了说明这个问题,我选择了一个例子。同样出于演示目的,我在渲染时直接禁用了ListCell。这些项目是由线程模拟的外部过程添加的。一切看起来都很不错,直到我为禁用的ListCell应用CSS着色为止。现在看来,有些虚幻项与创建它们的ListCell一起被禁用。 我该如何解决? App.java app.css 问题答案

  • 问题的核心是,我不能刷新或更改一个场景的节点的内容(这里是TablesMain)从另一个类(这里是NamePriceCell)。 我正在使用主StackPane(TableMainController扩展StackPane)构建和应用程序,其中包含其他节点,其中一些节点是ListView。在一个特定的ListView(比如“readitemslistview”)中,我创建了一个自定义ListCel

  • 好吧,这变得有点复杂,涉及到所有不同的节点。如有可能,请随时提供简化建议。 我试图用自定义对象填充JavaFXListView,并用自定义节点格式化。 我有一个名为Contact的自定义对象,它的定义如下: 下面是我希望ListView中的每个联系人显示为的示例。 此自定义节点(ContactCell)由一个VBox根节点(顶部有一个用于联系人姓名的标签)和一个用于堆叠两部电话的VBox以及一个用

  • 我正在尝试创建一个自定义标签类型,该类型将包含一个“淡出”函数。这用于显示将闪烁然后隐藏的消息。 我正在使用Eclipse、SceneBuilder和Javafx。我不知道该怎么做,也不知道是否可能,但到目前为止,我已经做到了: 这显然行不通。 这是我第一次在一个文件中处理凌乱的代码(因此,我尝试将代码从版本1拉入一个新的“对象”,我可以在多个类中使用它): 如果您有任何建议或帮助,我们将不胜感激