我想问一下在JavaFX中使用自定义对象创建ListView的最佳方法,我想要一个列表,每个项目如下所示:
我搜索发现大多数人都是用细胞工厂的方法来做的。还有别的办法吗?例如,使用custome fxml?
这是我的fmxl档案
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.control.ListView?>
<?import javafx.scene.control.Menu?>
<?import javafx.scene.control.MenuBar?>
<?import javafx.scene.control.MenuItem?>
<?import javafx.scene.control.SplitPane?>
<?import javafx.scene.layout.AnchorPane?>
<AnchorPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="557.0" prefWidth="1012.0" style="-fx-background-color: #0288D1;" xmlns="http://javafx.com/javafx/9.0.1" xmlns:fx="http://javafx.com/fxml/1" fx:controller="desktop_tasker.FXMLTaskerController">
<children>
<SplitPane dividerPositions="0.5" layoutX="-8.0" layoutY="35.0" prefHeight="529.0" prefWidth="1027.0" style="-fx-background-color: #EEEEEE;" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="28.0">
<items>
<AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="160.0" prefWidth="100.0">
<children>
<ListView fx:id="list_todo" onEditStart="#handleButtonAction" prefHeight="527.0" prefWidth="502.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0" />
</children></AnchorPane>
<AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="527.0" prefWidth="640.0">
<children>
<ListView fx:id="list_done" onEditStart="#handleButtonAction" prefHeight="527.0" prefWidth="502.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0" />
</children></AnchorPane>
</items>
</SplitPane>
<MenuBar prefHeight="30.0" prefWidth="1012.0">
<menus>
<Menu mnemonicParsing="false" text="File">
<items>
<MenuItem mnemonicParsing="false" text="Close" />
</items>
</Menu>
<Menu mnemonicParsing="false" text="Edit">
<items>
<MenuItem mnemonicParsing="false" text="Delete" />
</items>
</Menu>
<Menu mnemonicParsing="false" text="Help">
<items>
<MenuItem mnemonicParsing="false" text="About" />
</items>
</Menu>
</menus>
</MenuBar>
</children>
</AnchorPane>
这是我的对象任务:
import java.text.SimpleDateFormat;
import java.util.Date;
/**
* Created by Usuario on 26/10/2017.
*/
public class Task implements Comparable<Task> {
private String title;
private String attendant;
private String comment;
private String description;
private int priority;
private String creationDate;
private boolean state;
private boolean visible;
public Task(String title, String attendant, String comment, String description, int priority) {
this.title = title;
this.attendant = attendant;
this.comment = comment;
this.description = description;
this.priority = priority;
this.creationDate = setCreationDate();
this.state = false;
this.visible = true;
}
public Task(String title, String attendant, String comment, String description, int priority, String date, boolean state, boolean visible) {
this.title = title;
this.attendant = attendant;
this.comment = comment;
this.description = description;
this.priority = priority;
this.creationDate = date;
this.state = state;
this.visible = visible;
}
private static String setCreationDate() {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Date date = new Date();
return sdf.format(date);
}
public boolean isVisible() {
return visible;
}
public String getTitle() {
return title;
}
public String getAttendant() {
return attendant;
}
public String getComment() {
return comment;
}
public String getDescription() {
return description;
}
public int getPriority() {
return priority;
}
public String getCreationDate() {
return creationDate;
}
public boolean isState() {
return state;
}
@Override
public String toString() {
return "Task{" +
"title='" + title + '\'' +
", attendant='" + attendant + '\'' +
", comment='" + comment + '\'' +
", description='" + description + '\'' +
", priority=" + priority +
", creationDate='" + creationDate + '\'' +
", state=" + state +
'}';
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Task task = (Task) o;
if (priority != task.priority) return false;
if (state != task.state) return false;
if (title != null ? !title.equals(task.title) : task.title != null) return false;
if (attendant != null ? !attendant.equals(task.attendant) : task.attendant != null)
return false;
if (comment != null ? !comment.equals(task.comment) : task.comment != null) return false;
if (description != null ? !description.equals(task.description) : task.description != null)
return false;
return creationDate != null ? creationDate.equals(task.creationDate) : task.creationDate == null;
}
@Override
public int hashCode() {
int result = title != null ? title.hashCode() : 0;
result = 31 * result + (attendant != null ? attendant.hashCode() : 0);
result = 31 * result + (comment != null ? comment.hashCode() : 0);
result = 31 * result + (description != null ? description.hashCode() : 0);
result = 31 * result + priority;
result = 31 * result + (creationDate != null ? creationDate.hashCode() : 0);
result = 31 * result + (state ? 1 : 0);
return result;
}
@Override
public int compareTo( Task task) {
int comparePrior = this.getPriority() - (task.getPriority());
return comparePrior == 0 ? this.getTitle().compareTo(task.getTitle()) : comparePrior;
}
}
我想让物品看起来像单个容器,但我没有找到任何方法。关于使用什么有什么建议吗?最好的方法是什么?
这是使用FXML
创建自定义ListCell
首先,创建一个控制器来继承ListCell
。在该控制器的构造函数中,我们在其视图上加载FXML
语句。
public class TaskCell extends ListCell<Task> {
@FXML
private Label titleLabel;
@FXML
private Label commentLabel;
@FXML
private Label descriptionLabel;
public TaskCell() {
loadFXML();
}
private void loadFXML() {
try {
FXMLLoader loader = new FXMLLoader(getClass().getResource("task_cell.fxml"));
loader.setController(this);
loader.setRoot(this);
loader.load();
}
catch (IOException e) {
throw new RuntimeException(e);
}
}
@Override
protected void updateItem(Task item, boolean empty) {
super.updateItem(item, empty);
if(empty || item == null) {
setText(null);
setContentDisplay(ContentDisplay.TEXT_ONLY);
}
else {
titleLabel.setText(item.getTitle());
commentLabel.setText(item.getComment());
descriptionLabel.setText(item.getDescription());
setContentDisplay(ContentDisplay.GRAPHIC_ONLY);
}
}
}
这是view-task_cell.fxml
<fx:root type="javafx.scene.control.ListCell" xmlns="http://javafx.com/javafx" xmlns:fx="http://javafx.com/fxml">
<graphic>
<VBox>
<children>
<Label fx:id="titleLabel" />
<VBox>
<children>
<Label fx:id="commentLabel" />
<Label fx:id="descriptionLabel"/>
</children>
</VBox>
</children>
</VBox>
</graphic>
</fx:root>
然后,您需要创建一个可以用来创建单元的单元工厂。
public class TaskCellFactory implements Callback<ListView<Task>, ListCell<Task>> {
@Override
public ListCell<Task> call(ListView<Task> param) {
return new TaskCell();
}
}
一旦我们有了工厂,我们就可以使用ListView#setCellFactory()
public class Controller {
@FXML
private ListView<Task> listView;
@FXML
private void initialize() {
listView.setCellFactory(new TaskCellFactory());
}
}
我们可以在包含ListView
控件的视图的FXML
语句中描述它
<GridPane fx:controller="sample.Controller" xmlns:fx="http://javafx.com/fxml" alignment="center" hgap="10" vgap="10">
<ListView fx:id="listView" GridPane.columnIndex="0" GridPane.rowIndex="0">
<cellFactory>
<TaskCellFactory />
</cellFactory>
</ListView>
</GridPane>
在第二个版本中,intellij idea用
我想创建一个自定义控件,在其中我可以设置另一个自定义控件的列表,并且我想能够像在JavaFXTableView中一样使用FXML(请参见列列表): 我只想写这样的东西: 我已经知道如何实现简单的自定义控件,但我还没有找到任何关于以这种方式组合自定义控件的方法。你能给我指个方向吗?
我正在尝试创建一个自定义标签类型,该类型将包含一个“淡出”函数。这用于显示将闪烁然后隐藏的消息。 我正在使用Eclipse、SceneBuilder和Javafx。我不知道该怎么做,也不知道是否可能,但到目前为止,我已经做到了: 这显然行不通。 这是我第一次在一个文件中处理凌乱的代码(因此,我尝试将代码从版本1拉入一个新的“对象”,我可以在多个类中使用它): 如果您有任何建议或帮助,我们将不胜感激
我正在 JavaFX 应用程序中使用。列表中的项需要的不仅仅是一个字符串来显示它们,因此我自定义了 的< code>ListView,当单元格被重用时,我希望接收一个回调,传递要作为参数呈现的新项。然后,我想使用该项作为模型来构建一个视图-控制器对,我获取该视图并将其用作单元格的< code>graphic。该视图中的按钮和其他控件应该可以工作。这在JavaFX中可能吗? 链接问题: ListVi
我试图在JavaFX中创建一个工具栏来使用FXML添加按钮,如下所示: 下面是相应的java类: 当我运行这个项目时,我得到了这个异常: 提前谢谢。
问题内容: 我有简单的日期选择器代码,它可以禁用所有比选定日期更早的日期,但是我还需要能够禁用其他日期(例如:2014年10月17日至2014年10月19日)。以也禁用特定日期的方式更改它吗? 公共类DatePickerSample扩展了Application { } 问题答案: 如果要禁用多个日期范围,则可以创建以下POJO: 现在,您可以定义要在日历中禁用的范围的集合。例如: 最后,您只需要检
我正在尝试为JavaFX创建一个非常简单的自定义。运行应用程序时,