我明白你的问题。在 a 中设置项目主要有两种方式Listview
:
1.用( )创建ObservableList
和设置 的项目。ListView
ObservableList
listView.setItems(observableList)
2.使用类的setCellFactory()
方法ListView
。
您更喜欢使用该setCellFactory()
方法,因为这种方法简化了流程,并且有助于分离业务逻辑和 UI (FXML)。
这里有一个更详细的解释:
1.创建一个新的 FXML 文件,其名称listview.fxml
包含ListView
,并将ListViewController
类设置为其控制器:
文件:listview.fxml:
<?import javafx.scene.layout.GridPane?>
<?import javafx.scene.control.ListView?>
<?import demo.ListViewController?>
<GridPane xmlns:fx="http://javafx.com/fxml" alignment="CENTER">
<ListView fx:id="listView"/>
</GridPane>
2.创建控制器并命名ListViewController
。
控制器可以加载listview.fxml
文件并访问listview
.
文件:ListViewController.java:
package demo;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.scene.*;
import javafx.scene.control.*;
import javafx.util.Callback;
import java.io.IOException;
import java.util.Set;
public class ListViewController
{
@FXML
private ListView listView;
private Set<String> stringSet;
ObservableList observableList = FXCollections.observableArrayList();
public ListViewController()
{
FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("/fxml/listview.fxml"));
fxmlLoader.setController(this);
try
{
Parent parent = (Parent)fxmlLoader.load();
Scene scene = new Scene(parent, 400.0 ,500.0);
}
catch (IOException e)
{
throw new RuntimeException(e);
}
}
public void setListView()
{
stringSet.add("String 1");
stringSet.add("String 2");
stringSet.add("String 3");
stringSet.add("String 4");
observableList.setAll(stringSet);
listView.setItems(observableList);
listView.setCellFactory(new Callback<ListView<String>, javafx.scene.control.ListCell<String>>()
{
@Override
public ListCell<String> call(ListView<String> listView)
{
return new ListViewCell();
}
});
}
}
3.首先你需要设置的值ObservableList
。这个非常重要。
然后,使用 设置列表项ObservableList
并调用 上的setCellFactory()
方法ListView
。在给定的示例中,我只是将String
值添加到String
集合中(the Set<String> stringSet
)。
4.当在setCellFactory()
上调用该方法时ListView
,它会返回ListCell
。因此,为了简单起见,我添加了一个扩展 的类ListCell
,并且该setGraphic()
方法存在于ListCell()
并且将设置 的项目ListCell
。
文件:ListViewCell.java:
package demo;
import javafx.scene.control.ListCell;
public class ListViewCell extends ListCell<String>
{
@Override
public void updateItem(String string, boolean empty)
{
super.updateItem(string,empty);
if(string != null)
{
Data data = new Data();
data.setInfo(string);
setGraphic(data.getBox());
}
}
}
5.我刚刚添加了一个类,它将加载listCellItem.fxml
并返回HBox
,它将包含其他组件作为子组件。
然后HBox
将 设置为ListCell
。
文件:listCellItem.fxml:
<?import demo.Data?>
<?import javafx.scene.layout.HBox?>
<?import javafx.scene.control.Label?>
<HBox xmlns:fx="http://javafx.com/fxml" fx:id="hBox">
<children>
<Label fx:id="label1"/>
<Label fx:id="label2"/>
</children>
</HBox>
文件:Data.java:
package demo;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.scene.control.Label;
import javafx.scene.layout.HBox;
import java.io.IOException;
public class Data
{
@FXML
private HBox hBox;
@FXML
private Label label1;
@FXML
private Label label2;
public Data()
{
FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("/fxml/listCellItem.fxml"));
fxmlLoader.setController(this);
try
{
fxmlLoader.load();
}
catch (IOException e)
{
throw new RuntimeException(e);
}
}
public void setInfo(String string)
{
label1.setText(string);
label2.setText(string);
}
public HBox getBox()
{
return hBox;
}
}
使用这种方式,您可以使用该setCellFactory()
方法将业务逻辑和 FXML 分开。
希望这会有所帮助。