テーブルセル内のJava FX8 TreeView
質問
これは、テーブルセルのTreeViewに基づくフォローアップ質問です。Java FX 8
クリック時にTreeViewをポップアップしなければならないテーブルを持っています。
次のように表列のCellFactoryを定義しています
col4.setCellFactory(new Callback<TableColumn<User,DepartmentTree>, TableCell<User,DepartmentTree>>() {
@Override
public TableCell<User, DepartmentTree> call(
TableColumn<User,DepartmentTree> param)
{
TableCell<User, DepartmentTree> deptCombo = new TableCell<User,DepartmentTree>()
{
@Override
public void startEdit()
{
setGraphic(testtree);
}
@Override
public void cancelEdit()
{
setGraphic(null);
setText("");
}
@Override
public void updateItem(DepartmentTree item, boolean empty)
{
super.updateItem(item, empty);
setText(item.nameProperty().get());
}
};
return deptCombo;
}
});
.
これは、最初の画像に従ってセルの内側に表示されるツリービューをもたらします。ただし、ツリービューは2番目の画像のようにセルのポウアを出すことをお願いします(2番目の画像は、コンボボックス内のツリービューを使用した誤った実装です)
ポップアウトは単なるスタイリングによって現れるか、またはコードを変更する必要がありますか?
どんなガイダンスも役立ちます。
解決
私はこれを行うために私自身のクラスのTreeViewPopuptableCellを作成しました。基本的にあなたが取得するものは、テーブルセルを左クリックすると(最初に行を選択すると、2番目に選択するとセルが選択されます)あなたはそれにロードされたツリービューを持つポップアップを取得します。
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.event.EventHandler;
import javafx.scene.Node;
import javafx.scene.control.PopupControl;
import javafx.scene.control.Skin;
import javafx.scene.control.Skinnable;
import javafx.scene.control.TableCell;
import javafx.scene.control.TreeItem;
import javafx.scene.input.KeyCode;
import javafx.scene.input.KeyEvent;
import javafx.scene.input.MouseEvent;
public class TreeViewPopupTableCell<S, T extends HierarchyData<T>> extends
TableCell<S, T>
{
private static final String DEFAULT_STYLE_CLASS = "combo-box-popup";
private PopupControl popup;
private TreeViewWithSetItems<T> treeviewSetItems;
private static final Logger log = Logger.getLogger(TreeViewPopup.class);
private ObservableList<T> treeList;
private double popupXlocation = 0.0;
private double popupYlocation = 0.0;
public TreeViewPopupTableCell(T hierarchyObj)
{
treeviewSetItems = new TreeViewWithSetItems<>(new TreeItem<T>());
treeList = FXCollections.observableArrayList();
treeList.add(hierarchyObj);
treeviewSetItems.setShowRoot(false);
treeviewSetItems.setItems(treeList);
treeviewSetItems.getStyleClass().add(DEFAULT_STYLE_CLASS);
this.addEventHandler(MouseEvent.MOUSE_CLICKED,
new EventHandler<MouseEvent>() {
@Override
public void handle(MouseEvent event)
{
popupXlocation = event.getScreenX();
popupYlocation = event.getScreenY();
}
});
treeviewSetItems.addEventHandler(KeyEvent.KEY_PRESSED,
new EventHandler<KeyEvent>() {
@Override
public void handle(KeyEvent event)
{
if (event.getCode().equals(KeyCode.ESCAPE))
{
popup.hide();
}
}
});
treeviewSetItems.getSelectionModel().selectedItemProperty()
.addListener(new ChangeListener<TreeItem<T>>() {
@Override
public void changed(
ObservableValue<? extends TreeItem<T>> observable,
TreeItem<T> oldValue, TreeItem<T> newValue)
{
if (oldValue == null)
return;
log.debug("Value changed");
popup.hide();
commitEdit(newValue.getValue());
}
});
}
@Override
public void startEdit()
{
T ChosenObject = this.getTableColumn().getCellData(
this.getTableRow().getIndex());
treeviewSetItems.getSelectionModel().select(
treeviewSetItems.getindexofItem(ChosenObject));
popup = new PopupControl();
popup.getStyleClass().add(DEFAULT_STYLE_CLASS);
popup.setAutoHide(true);
popup.setAutoFix(true);
popup.setHideOnEscape(true);
popup.setX(popupXlocation);
popup.setY(popupYlocation);
popup.setSkin(new Skin<Skinnable>() {
@Override
public Skinnable getSkinnable()
{
return null;
}
@Override
public Node getNode()
{
return treeviewSetItems;
}
@Override
public void dispose()
{
}
});
popup.show(this.getScene().getWindow());
}
@Override
public void cancelEdit()
{
log.debug("Cancel edit is being called");
}
@Override
public void updateItem(T item, boolean empty)
{
super.updateItem(item, empty);
setText(item.nameProperty().get());
}
}
public interface HierarchyData<T extends HierarchyData> {
/**
* The children collection, which represents the recursive nature of the hierarchy.
* Each child is again a {@link HierarchyData}.
*
* @return A list of children.
*/
ObservableList<T> getChildren();
StringProperty nameProperty();
}
.
このセルを使用するには、TableViewでは、次のようにCELLFATORYを設定します。
col4.setCellFactory(new Callback<TableColumn<S,T>, TableCell<S,T>>() {
@Override
public TableCell<S, T> call(
TableColumn<S,T> param)
{
return new TreeViewPopupTableCell<S, T>(T obj);
}
}
. 所属していません StackOverflow