我试图创建一个JavaFX树视图,其中有复选框树项。我要求所有有孩子的节点都应该被禁用。但是这些节点的所有子节点都应该是可单击的。
基本上,如果树项目是一个叶子,它应该被启用和点击。
这是我使用过的当前代码。它禁用了带有子节点的节点,但问题是,由于禁用了它,我无法访问父节点内部的代码。
public class App extends Application
{
public static void main( String[] args )
{
launch(args);
}
private List<Dependant> myList = new ArrayList();
@SuppressWarnings("unchecked")
@Override
public void start(Stage primaryStage) {
CheckBoxTreeItem<String> rootItem = new CheckBoxTreeItem("Root");
final List<CheckBoxTreeItem<String>> treeItems = new ArrayList(6);
for (int i = 0; i < 6; i++) {
CheckBoxTreeItem<String> item = new CheckBoxTreeItem("L0"+i+"");
item.setIndependent(true);
treeItems.add(item);
myList.add(new Dependant("0"+i+"", "type1"));
}
rootItem.getChildren().addAll(treeItems);
rootItem.setExpanded(true);
rootItem.setIndependent(true);
CheckBoxTreeItem<String> rootItem2 = new CheckBoxTreeItem("folder");
final List<CheckBoxTreeItem<String>> treeItems2 = new ArrayList(6);
for (int i = 0; i < 6; i++) {
CheckBoxTreeItem<String> item = new CheckBoxTreeItem("L1"+i+"");
item.setIndependent(true);
treeItems2.add(item);
myList.add(new Dependant("0"+i+"", "type2"));
}
rootItem2.getChildren().addAll(treeItems2);
rootItem2.setIndependent(true);
rootItem.getChildren().set(2,rootItem2);
TreeView tree = new TreeView(rootItem);
tree.setCellFactory((Object item) -> {
final CheckBoxTreeCell<String> cell = new CheckBoxTreeCell();
cell.itemProperty().addListener((obs,s,s1)->{
cell.disableProperty().unbind();
if(s1!=null && !s1.isEmpty()){
BooleanProperty prop = new SimpleBooleanProperty();
prop.set((s1.equals("folder")));
cell.disableProperty().bind(prop);
}
});
return cell;
});
tree.setRoot(rootItem);
StackPane root = new StackPane();
root.getChildren().add(tree);
primaryStage.setScene(new Scene(root, 300, 250));
primaryStage.show();
}
}
虽然这个问题是一个典型的XY问题(要求解决一个试图以错误的方式解决实际需求而引入的问题),但这个实际问题足够有趣,可以快速尝试一下:)
我理解的真正要求是:
public class TreeSingleSelectedCheckboxWithToggle extends Application {
/**
* A custom CheckBoxTreeItem that implements Toggle.
*
* To control which/how many items can be selected at any
* time, add them to one or several ToggleGroups.
*
* @author Jeanette Winzenburg, Berlin
*/
public static class ToggleTreeItem<T> extends CheckBoxTreeItem<T>
implements Toggle {
public ToggleTreeItem() {
super();
init();
}
public ToggleTreeItem(T value) {
super(value);
init();
}
private void init() {
// basically c&p from ToggleButton
selectedProperty().addListener(ov -> {
final boolean selected = isSelected();
final ToggleGroup tg = getToggleGroup();
// Note: these changes need to be done before selectToggle/clearSelectedToggle since
// those operations change properties and can execute user code, possibly modifying selected property again
if (tg != null) {
if (selected) {
tg.selectToggle(ToggleTreeItem.this);
} else if (tg.getSelectedToggle() == ToggleTreeItem.this) {
// reflective access to package-private api - use your own utility method
FXUtils.invokeMethod(ToggleGroup.class, tg, "clearSelectedToggle");
// tg.clearSelectedToggle();
}
}
});
}
/**
* The {@link ToggleGroup} to which this {@code ToggleButton} belongs. A
* {@code ToggleButton} can only be in one group at any one time. If the
* group is changed, then the button is removed from the old group prior to
* being added to the new group.
*/
private ObjectProperty<ToggleGroup> toggleGroup;
@Override
public final void setToggleGroup(ToggleGroup value) {
toggleGroupProperty().set(value);
}
@Override
public final ToggleGroup getToggleGroup() {
return toggleGroup == null ? null : toggleGroup.get();
}
@Override
public final ObjectProperty<ToggleGroup> toggleGroupProperty() {
if (toggleGroup == null) {
toggleGroup = new ObjectPropertyBase<ToggleGroup>() {
private ToggleGroup old;
@Override protected void invalidated() {
final ToggleGroup tg = get();
if (tg != null && !tg.getToggles().contains(ToggleTreeItem.this)) {
if (old != null) {
old.getToggles().remove(ToggleTreeItem.this);
}
tg.getToggles().add(ToggleTreeItem.this);
} else if (tg == null) {
old.getToggles().remove(ToggleTreeItem.this);
}
old = tg;
}
@Override
public Object getBean() {
return ToggleTreeItem.this;
}
@Override
public String getName() {
return "toggleGroup";
}
};
}
return toggleGroup;
}
@Override
public Object getUserData() {
// TODO Auto-generated method stub
return null;
}
@Override
public void setUserData(Object value) {
// TODO Auto-generated method stub
}
@Override
public ObservableMap<Object, Object> getProperties() {
// TODO Auto-generated method stub
return null;
}
}
@SuppressWarnings("unchecked")
@Override
public void start(Stage primaryStage) {
ToggleGroup toggleGroup = new ToggleGroup();
ToggleTreeItem<String> rootItem = new ToggleTreeItem<>("Root");
toggleGroup.getToggles().add(rootItem);
final List<ToggleTreeItem<String>> treeItems = new ArrayList<>(6);
for (int i = 0; i < 6; i++) {
ToggleTreeItem<String> item = new ToggleTreeItem<>("L0" + i + "");
item.setIndependent(true);
treeItems.add(item);
toggleGroup.getToggles().add(item);
myList.add(new Dependant("0" + i + "", "type1"));
}
rootItem.getChildren().addAll(treeItems);
rootItem.setExpanded(true);
rootItem.setIndependent(true);
ToggleTreeItem<String> rootItem2 = new ToggleTreeItem<>("folder");
toggleGroup.getToggles().add(rootItem2);
final List<ToggleTreeItem<String>> treeItems2 = new ArrayList<>(6);
for (int i = 0; i < 6; i++) {
ToggleTreeItem<String> item = new ToggleTreeItem<>("L1" + i + "");
item.setIndependent(true);
treeItems2.add(item);
toggleGroup.getToggles().add(item);
myList.add(new Dependant("0" + i + "", "type2"));
}
rootItem2.getChildren().addAll(treeItems2);
rootItem2.setIndependent(true);
rootItem.getChildren().set(2, rootItem2);
TreeView tree = new TreeView<>(rootItem);
tree.setCellFactory(CheckBoxTreeCell.forTreeView());
tree.setRoot(rootItem);
StackPane root = new StackPane();
root.getChildren().add(tree);
primaryStage.setScene(new Scene(root, 300, 250));
primaryStage.show();
}
public static class Dependant {
String one;
String two;
public Dependant(String one, String two) {
this.one = one;
this.two = two;
}
}
private List<Dependant> myList = new ArrayList();
public static void main(String[] args) {
launch(args);
}
}
问题内容: 在C#中,我发现了一种非常可爱的方法,该方法使您可以从指定控件中获取所有后代和所有THEIR后代。 我正在寻找JavaFX的类似方法。 我看到了我要使用的类,因为它是派生所有带有孩子的Node类的类。 到目前为止,这是我所拥有的(并且我还没有在Google上通过“ JavaFX从场景中获取所有节点”之类的搜索真正找到任何东西): 那么,如何确定N是否是父母(或从父母继承)呢?我说的对吗
在C#中,我发现了一个非常可爱的方法,它允许您从指定的控件中获取所有后代及其所有后代。 我正在寻找一种类似的JavaFX方法。 我看到<code>Parent</code>类是我想要使用的,因为它是派生所有节点类的子类。 这就是我到目前为止所拥有的(我还没有在谷歌上找到任何像“JavaFX从场景中获取所有节点”这样的搜索): 那么,如何判断N是否是父级(或从父级扩展)?我这样做对吗?它似乎不起作用
你们这些家伙,我有这样一个HTML: 这是将上述所有选项放入列表的代码: 实际上它不起作用。我不知道我错在哪里。请帮帮我。非常感谢。
问题内容: 关闭。 此问题不符合堆栈溢出准则。它当前不接受答案。 想改善这个问题吗? 更新问题,使其成为Stack Overflow 的主题。 6年前关闭。 我的mySQL数据库中有如下表: 对于谓词,它将具有如下树视图: 我想创建一个可以选择起始节点并为此获得所有父节点的表单。例如,通过选择我想要获得: 步骤2: 有什么方法可以使用以下简单文本来打印此节点: 问题答案: 您的数据可以在RDF中表
我已经实现了一个TreeModel来调整存量数据模型,以便将其可视化为JTree。我遇到了一个问题,节点有多个相同的子(叶)节点。例如,考虑一个JTree,它的叶节点是Strings。每当父节点包含具有相同String值的子节点时,就会出现问题。这些叶节点的TreePath是相同的,作为Strings,equals()返回true。留档明确地调用这个: JTree及其相关类广泛使用TreePath
我在运行时无法将节点添加回。 我想做的是,当用户点击一个按钮时,当前节点存储在