私は巨大なJavaFXアプリケーションを持っています。これは主にFXMLファイルを使用してビューを作成していますが、メモリ使用量が高いことに気付きましたが、しばらくそれを無視しています。調査の後、フォームのガベージコレクタを閉じた後でジョブと使用済みメモリが解放されるため、すべての単一ビューが多く消費されていることがわかりました。 たとえば、スクロールすると、テーブルビューをスローします。 780メガバイト,,JavaFX - メモリ消費
から1000の要素[スクリーンショットを添付]、350メガバイトのメモリ使用スパイクがまったく同じではテーブルビューの同じデータを示すリストビューをスロースクロールで発生します:
質問は,,その正常ですか?または私は多分、私が列を生成するために、次のやっているテーブルビューの場合
UPDATE
何か間違ったことをやって:
public static <T> TableColumn<T, T> generateGraphicColumn(String title, Callback<TableColumn<T, T>, TableCell<T, T>> callback) {
TableColumn<T, T> column = generateColumn(title, null);
column.setCellValueFactory(new Callback<TableColumn.CellDataFeatures<T, T>, ObservableValue<T>>() {
@Override
public ObservableValue<T> call(CellDataFeatures<T, T> param) {
SimpleObjectProperty<T> s = new SimpleObjectProperty<>();
s.setValue(param.getValue());
return s;
}
});
column.setCellFactory(callback);
return column;
}
public static <T> TableColumn<T, T> generateGraphicColumn(String title, Callback<TableColumn<T, T>, TableCell<T, T>> callback, double width) {
TableColumn<T, T> column = generateGraphicColumn(title, callback);
column.setMaxWidth(width);
column.setMinWidth(width);
return column;
}
public static <T,S> TableColumn<T, S> generateColumn(String title,
Callback<TableColumn.CellDataFeatures<T, S>, ObservableValue<S>> propertyValueFactory) {
TableColumn<T, S> column;
column = new TableColumn<>();
if (propertyValueFactory != null)
column.setCellValueFactory(propertyValueFactory);
column.setStyle(column.getStyle() + "-fx-alignment: BASELINE_CENTER;");
column.setText(title);
return column;
}
をし、私は次のように上記のコードを使用しています:
{ // status
TableColumn<Visit, Visit> column = TableViewUtilities.generateGraphicColumn(text("General.STATUS"),
new Callback<TableColumn<Visit, Visit>, TableCell<Visit, Visit>>() {
@Override
public TableCell<Visit, Visit> call(final TableColumn<Visit, Visit> param) {
final TableCell<Visit, Visit> cell = new TableCell<Visit, Visit>() {
@Override
public void updateItem(Visit item, boolean empty) {
super.updateItem(item, empty);
if (empty || getIndex() < 0) {
setGraphic(null);
setText(null);
return;
}
item = getTableView().getItems().get(getIndex());
Label label = new Label();
StackPane pane = new StackPane(label);
pane.setAlignment(Pos.CENTER);
label.setMaxWidth(10);
label.setMinWidth(10);
label.setMinHeight(30);
setText(item.getStatus().display());
String background = FXMLConstants .toHexString(ColorUtils.getVisitBackgroundColor(item));
pane.setStyle(String.format("-fx-background-color:%s;;", background));
setGraphic(pane);
setText(item.getStatus().display());
setStyle(getStyle() + "-fx-alignment: CENTER_LEFT;");
}
};
return cell;
}
}, 100);
column.setComparator(VisitCommonHelper.getCompByStatus());
tblVisits.getColumns().add(column);
}
を
これは、テーブルの行のデータ型と表示方法(カスタムセルファクトリ)によって大きく異なります。コンテキストがなくても正常である(つまり、データモデルとして使用されるクラスおよびテーブル上で使用される任意のセルファクトリ)ことは言うまでもありません。 – Itai
@sillyfly親切に更新をチェックして、テーブルの列をどのように作成しているのかの例を追加しました –