在JavaFX listview

时间:2018-02-06 13:36:54

标签: java javafx javafx-8

我正在使用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()方法中为每个项目的布尔属性添加更改侦听器。

但是听众不止一次被添加...... 这是正确的方法吗?

0 个答案:

没有答案