我正在使用JavaFX实现桌面聊天应用程序。 我正在使用listview来显示联系人。
我按照此链接JavaFX custom cell factory with custom Objects自定义了列表单元格。
当联系人变为在线/离线时,服务器会正确地通知我,因此我需要相应地更改在线图标的颜色。
以下是我的代码......
文件: MainController.java
public class MainController implements Initializable {
@FXML
private ListView<ContactInfo> contactListView;
private ObservableList<ContactInfo> contactList = FXCollections.observableArrayList();
this.contactListView.setCellFactory( listView -> {
return new ContactCell();
}
}
文件: ContactCell.java
public class ContactCell extends ListCell<ContactInfo> {
private final ContactItemController controller = new ContactItemController();
public ContactCell() {
}
@Override
protected void updateItem(ContactInfo item, boolean empty) {
super.updateItem(item, empty);
if (empty) {
setText(null);
setGraphic(null);
} else {
controller.setItem(item);
setGraphic(controller.getView());
}
}
}
文件: ContactItemController.java
public class ContactItemController {
@FXML
private Pane pane;
@FXML
private ImageView contactImage;
@FXML
private Label contactName;
@FXML
private FontAwesomeIconView onlineIcon;
public ContactItemController() {
FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("/fxml/snippets/ContactItem.fxml"));
fxmlLoader.setController(this);
try {
pane = fxmlLoader.load();
} catch (IOException e) {
e.printStackTrace();
}
}
public void setItem(ContactInfo item) {
this.contactName.setText(item.getName());
if(item.getOnline().getOnline())
this.onlineIcon.setFill(Color.LIGHTGREEN);
else
this.onlineIcon.setFill(Color.web("#838383"));
}
public Pane getView() {
return this.pane;
}
}
文件:ContactInfo.java
public class ContactInfo {
private String name;
private BooleanProperty online;
// Getters and setters
..............
..............
}
我尝试在ContactItemController类的setItem()方法中为每个项目的布尔属性添加更改侦听器。
但是听众不止一次被添加...... 这是正确的方法吗?