Я строю приложение чата в Javafx, используя ListView с пользовательскими ячеек для отображения сообщений. Затем он изменяется до правильной высоты.private final ObservableList messages = FXCollections.observableArrayList();
private String name;
@FXML
public void initialize() {
messageListView.setItems(messages);
messageListView.setCellFactory(listView -> new ListCell() {
private FXMLLoader loader;
private MessageCellController cellController;
private Node root;
@Override
protected void updateItem(Message item, boolean empty) {
super.updateItem(item, empty);
if (empty || item == null) {
setGraphic(null);
setText(null);
} else {
String fxml = item.getUser().getName().equals(name)
? "message_outgoing.fxml"
: "message_incoming.fxml";
if (loader == null || !loader.getLocation().toExternalForm().endsWith(fxml)) {
try {
loader = new FXMLLoader(getClass().getResource(fxml));
root = loader.load();
cellController = loader.getController();
} catch (Exception e) {
e.printStackTrace();
}
}
if (cellController != null) {
cellController.setData(item.getUser().getName(), item.getText());
setGraphic(root);
} else {
setText(item.getUser().getName() + ": " + item.getText());
}
}
}
});
// Handling new messages
clientSocket = new ClientSocket("localhost", 5000, name);
clientSocket.addListener(new MessageListener() {
@Override
public void onMessageReceived(Message message) {
Platform.runLater(() -> {
messages.add(message);
messageListView.scrollTo(messages.size() - 1);
});
}
@Override public void onError(Exception ex) {}
@Override public void onConnectionClosed() {}
});
}
< /code>
messagecellcontroller.java:
@FXML public Label usernameLabel;
@FXML public Label messageLabel;
@FXML private VBox bubbleVBox;
@FXML
public void initialize() {
messageLabel.setWrapText(true);
// Limit width of the bubble to 60% of parent width
bubbleVBox.maxWidthProperty().bind(
((Region) bubbleVBox.getParent()).widthProperty().multiply(0.6)
);
}
public void setData(String username, String message) {
usernameLabel.setText(username);
messageLabel.setText(message);
}
< /code>
Примечания: < /p>
Однажды я щелкнул ячейку или прокрутку, сама сама макет. Вопрос: < /p>
Существует ли надежный способ немедленно принудить правильный макет
после добавления сообщения? /> < /ol>
Любые советы или обходные пути будут высоко оценены. Спасибо!
Подробнее здесь: https://stackoverflow.com/questions/797 ... l-or-click