JavaFX 使用自定义列表单元

Ran*_*ord 3 java javafx

我曾试图找出如何使用CustomListCell一个ListViewJavaFX,但没有运气,我抬头一看,所有我能找到的不完整的教程和问题。下面是我的CustomListCellFXML

  <AnchorPane id="AnchorPane" styleClass="backPane" 
       stylesheets="@../css/mainwindow.css" xmlns="http://javafx.com/javafx/8.0.111" xmlns:fx="http://javafx.com/fxml/1">
  <children>
  <HBox alignment="CENTER_LEFT" styleClass="backPane">
     <children>
        <HBox styleClass="card" HBox.hgrow="ALWAYS">
           <children>
              <ImageView fitHeight="150.0" fitWidth="200.0" pickOnBounds="true" preserveRatio="true">
                 <image>
                    <Image url="@../images/picture_placeholder.png" />
                 </image>
              </ImageView>
              <VBox HBox.hgrow="ALWAYS">
                 <children>
                    <Label fx:id="lbTitle" styleClass="fixture-title" stylesheets="@../css/mainwindow.css" text=" Livingston 19:45 Falkirk" />
                    <Label fx:id="lbDescription" styleClass="fixture-description" text="Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin at turpis nisl. Interdum et malesuada fames ac ante ipsum primis in faucibus. Vestibulum laoreet elementum velit. Curabitur tincidunt finibus malesuada. Aliquam dapibus semper scelerisque. Sed tristique tellus eget sem ornare cursus." />
                 </children></VBox>
           </children>
           <HBox.margin>
              <Insets bottom="10.0" left="10.0" right="10.0" top="10.0" />
           </HBox.margin>
        </HBox>
       </children>
      </HBox>
      </children>
    </AnchorPane>
Run Code Online (Sandbox Code Playgroud)

还有我的模特

public class Ticket {


private long id;
private String imageUrl;
private String title;
private String description;

public Ticket(long id, String imageUrl, String title, String description) {
    this.id = id;
    this.imageUrl = imageUrl;
    this.title = title;
    this.description = description;
}

public long getId() {
    return id;
}

public void setId(long id) {
    this.id = id;
}

public String getImageUrl() {
    return imageUrl;
}

public void setImageUrl(String imageUrl) {
    this.imageUrl = imageUrl;
}

public String getTitle() {
    return title;
}

public void setTitle(String title) {
    this.title = title;
}

public String getDescription() {
    return description;
}

public void setDescription(String description) {
    this.description = description;
}

}
Run Code Online (Sandbox Code Playgroud)

而我的不完整 CustomListCell

public class TicketCell <Ticket> extends ListCell<Ticket> { 

private final TicketCellController ticketCellController = new TicketCellController();
private final Node view = ticketCellController.getView();

@Override
protected void updateItem(Ticket item, boolean empty) {
    super.updateItem(item, empty);
    if (empty) {
        setGraphic(null);
    } else {
        ticketCellController.setTicket(item);
        setGraphic(view);
    }
} 
}
Run Code Online (Sandbox Code Playgroud)

还有我的控制器

public class TicketCellController implements Initializable{

private static final String TAG = MainWindowController.class.getSimpleName();
private Logger logger;
private Ticket ticket;
@FXML
private Label lbTitle;
@FXML
private Label lbDescription;
@FXML
private AnchorPane anchorPane;



@Override
public void initialize(URL url, ResourceBundle rb) {
  logger = Logger.getLogger(MainWindowController.class);
    BasicConfigurator.configure();  
} 
Run Code Online (Sandbox Code Playgroud)

请不要ticketCellController.getView()被发现。在这一点上我迷路了,我不知道在我的CustomListCellFXML中更新图像视图和标签的正确方法。任何人都可以提供帮助或提供我可以关注的教程链接,我将不胜感激。

Jam*_*s_D 5

你设置的方式,你实例化控制器并从中获取视图,你的控制器需要加载 fxml 并能够返回它创建的视图。所以像:

public class TicketCellController {

    private Ticket ticket;
    @FXML
    private Label lbTitle;
    @FXML
    private Label lbDescription;

    private AnchorPane anchorPane;

    public TicketCellController() {

        try {
            // assumes FXML file is in same package as this controller
            // (also make sure name of FXML resource is correct)
            FXMLLoader loader = new FXMLLoader(getClass().getResource("CustomListCell.fxml"));
            loader.setController(this);
            anchorPane = loader.load();
        } catch (IOException exc) {
            // pretty much fatal here...
            throw new UncheckedIOException(exc);
        }
    }

    public void setTicket(Ticket ticket) {
        lbTitle.setText(ticket.getTitle());
        lbDescription.setText(ticket.getDescription());
    }

    public Node getView() {
        return anchorPane ;
    }

    // ...

}
Run Code Online (Sandbox Code Playgroud)

这是一个测试类;这适用于上面的控制器类以及您的 FXML、CustomListCell类和模型类(需要注意的是,我从 FXML 中删除了样式表和图像,因为我无法访问这些):

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.ListView;
import javafx.stage.Stage;

public class Test extends Application {

    @Override
    public void start(Stage primaryStage) {
        ListView<Ticket> ticketList = new ListView<Ticket>();
        ticketList.setCellFactory(lv -> new TicketCell());
        for (int i = 1 ; i <= 50 ; i++) {
            ticketList.getItems().add(new Ticket(i, "", "Ticket "+i, "This is a description of ticket "+i));
        }
        primaryStage.setScene(new Scene(ticketList, 600, 400));
        primaryStage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }
}
Run Code Online (Sandbox Code Playgroud)