4
ここにTableView
の列にButton
を入れる方法を示すSSCCEがあります。それは動作しますが、不快な動作はほとんどありません。スクロールバーを使用してテーブル行をマウスでまでスクロールすると、新しいレンダリングされたボタンはすぐに表示されません。マウスが離されて移動されたときにのみ表示されます。私は、テーブルの列にボタンを表示し、選択された行に関連する何かをクリックしたときに、もう少しエレガントな方法があると思います。助言がありますか?よりエレガントにテーブルの列にボタンを置く
import javafx.application.Application;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.control.*;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.scene.layout.StackPane;
import javafx.scene.layout.StackPaneBuilder;
import javafx.stage.Stage;
import javafx.util.Callback;
public class ButtonDemo extends Application {
private TableView<Person> personTable = new TableView<>();
private TableColumn<Person, String> nameCol = new TableColumn<>("name");
private TableColumn<Person, Double> salaryCol = new TableColumn<>("salary");
private TableColumn<Person, String> actionCol = new TableColumn<>("action");
@Override
public void start(Stage primaryStage) {
ObservableList<Person> data = FXCollections.observableArrayList();
for (int i = 0; i < 40; i++) {
data.add(new Person("person_" + i, i * 100d));
}
nameCol.setCellValueFactory(new PropertyValueFactory<Person, String>("name"));
salaryCol.setCellValueFactory(new PropertyValueFactory<Person, Double>("salary"));
actionCol.setCellValueFactory(new PropertyValueFactory<Person, String>("name")); // "name" here is for just to render the column
Callback<TableColumn<Person, String>, TableCell<Person, String>> printColumnCellFactory = //
new Callback<TableColumn<Person, String>, TableCell<Person, String>>() {
@Override
public TableCell call(final TableColumn param) {
final TableCell cell = new TableCell() {
@Override
public void updateItem(Object item, boolean empty) {
super.updateItem(item, empty);
if (empty) {
setText(null);
setGraphic(null);
} else {
final Button btnPrint = new Button("print name");
btnPrint.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent event) {
param.getTableView().getSelectionModel().select(getIndex());
Person item = personTable.getSelectionModel().getSelectedItem();
if (item != null) {
System.out.println(item.getName());
}
}
});
setGraphic(btnPrint);
setContentDisplay(ContentDisplay.GRAPHIC_ONLY);
}
}
};
return cell;
}
};
actionCol.setCellFactory(printColumnCellFactory);
personTable.setItems(data);
personTable.getColumns().addAll(nameCol, salaryCol, actionCol);
StackPane root = StackPaneBuilder.create().children(personTable).build();
primaryStage.setScene(new Scene(root, 300, 250));
primaryStage.show();
}
public class Person {
private String name;
private Double salary;
public Person(String name, Double salary) {
this.name = name;
this.salary = salary;
}
public String getName() {
return name;
}
public Double getSalary() {
return salary;
}
}
public static void main(String[] args) {
launch(args);
}
}
FXのどのバージョンを使用していますか? FX 2.1の最新のdevビルドで問題を再現できません - http://www.oracle.com/technetwork/java/javafx/downloads/devpreview-1429449.html –
現在、私はjavaFX 2.0.1を使用しています。マウスの中央ボタンをスクロールに使用すると、列のボタンがすぐに表示されます。問題は、テーブルのスクロールバーをドラッグしてスクロールすると発生します。私が掲示したコード例では、スクロールバーを同時に上下にドラッグすると、すべてのボタンが消えてしまいます。 –
はバグのようであり、コードは正しいです。おそらく2.1devにアップグレードしたいのですか? - マウスでスクロールしているスクロールがそこで動作します。 –