gpt4 book ai didi

JavaFX TableView : open detail information between rows on click

转载 作者:行者123 更新时间:2023-12-02 17:25:14 25 4
gpt4 key购买 nike

我正在尝试在 TableView 中显示旅行连接。到目前为止,这就像一个魅力。现在我有点卡住了,试图获取要在表行之间显示的连接的详细信息。这应该在选择表格项目时发生。

问题是,详细信息的格式与我显示的连接不同。所以我需要在两个表格行之间放置一个面板。这有可能吗?

最佳答案

执行此操作的“正确”方法是为 TableRow 创建自定义皮肤并使用 rowFactory在返回 TableRow 的表上安装了自定义皮肤。然而,由于皮肤类在撰写本文时不是公共(public) API(请注意,尽管它们将在 Java 9 中),这意味着完全从头开始实现皮肤类(布置表格单元格等),这将是非常好的困难。

一种不太“官方”的方法,但也更容易一些,就是覆盖 TableRow 中的各种布局方法。直接挂接到父类(super class)实现中。

这可行,但感觉有点脆弱:

import java.util.Random;
import java.util.function.Function;

import javafx.application.Application;
import javafx.beans.property.IntegerProperty;
import javafx.beans.property.ObjectProperty;
import javafx.beans.property.SimpleIntegerProperty;
import javafx.beans.property.SimpleStringProperty;
import javafx.beans.property.StringProperty;
import javafx.beans.value.ObservableValue;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Node;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableRow;
import javafx.scene.control.TableView;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;

public class TableWithCustomRow extends Application {

@Override
public void start(Stage primaryStage) {
TableView<Item> table = new TableView<>();

table.setRowFactory(tv -> new TableRow<Item>() {
Node detailsPane ;
{
selectedProperty().addListener((obs, wasSelected, isNowSelected) -> {
if (isNowSelected) {
getChildren().add(detailsPane);
} else {
getChildren().remove(detailsPane);
}
this.requestLayout();
});
detailsPane = createDetailsPane(itemProperty());
}

@Override
protected double computePrefHeight(double width) {
if (isSelected()) {
return super.computePrefHeight(width)+detailsPane.prefHeight(getWidth());
} else {
return super.computePrefHeight(width);
}
}

@Override
protected void layoutChildren() {
super.layoutChildren();
if (isSelected()) {
double width = getWidth();
double paneHeight = detailsPane.prefHeight(width);
detailsPane.resizeRelocate(0, getHeight()-paneHeight, width, paneHeight);
}
}
});

Random random = new Random();
for (int i = 1 ; i <= 100 ; i++) {
table.getItems().add(new Item("Item "+i, random.nextInt(100)));
}
table.getColumns().add(column("Item", Item::nameProperty));
table.getColumns().add(column("Value", Item::valueProperty));

Scene scene = new Scene(table, 800, 600);
primaryStage.setScene(scene);
primaryStage.show();

}

private Node createDetailsPane(ObjectProperty<Item> item) {
BorderPane detailsPane = new BorderPane();
Label detailsLabel = new Label();
VBox labels = new VBox(5, new Label("These are the"), detailsLabel);
labels.setAlignment(Pos.CENTER_LEFT);
labels.setPadding(new Insets(2, 2, 2, 16));
detailsPane.setCenter(labels);

Label icon = new Label("Icon");
icon.setStyle("-fx-background-color: aqua; -fx-text-fill: darkgreen; -fx-font-size:18;");
BorderPane.setMargin(icon, new Insets(6));
icon.setMinSize(40, 40);
detailsPane.setLeft(icon);

detailsPane.setStyle("-fx-background-color: -fx-background; -fx-background: skyblue;");

item.addListener((obs, oldItem, newItem) -> {
if (newItem == null) {
detailsLabel.setText("");
} else {
detailsLabel.setText("details for "+newItem.getName());
}
});


return detailsPane ;
}

private static <S,T> TableColumn<S,T> column(String title, Function<S, ObservableValue<T>> property) {
TableColumn<S,T> col = new TableColumn<>(title);
col.setCellValueFactory(cellData -> property.apply(cellData.getValue()));
col.setPrefWidth(150);
return col ;
}

public static class Item {
private final StringProperty name = new SimpleStringProperty() ;
private final IntegerProperty value = new SimpleIntegerProperty() ;

public Item(String name, int value) {
setName(name);
setValue(value);
}

public final StringProperty nameProperty() {
return this.name;
}


public final java.lang.String getName() {
return this.nameProperty().get();
}


public final void setName(final java.lang.String name) {
this.nameProperty().set(name);
}


public final IntegerProperty valueProperty() {
return this.value;
}


public final int getValue() {
return this.valueProperty().get();
}


public final void setValue(final int value) {
this.valueProperty().set(value);
}



}

public static void main(String[] args) {
launch(args);
}
}

这给出了以下内容:

enter image description here

关于JavaFX TableView : open detail information between rows on click,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39110036/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com