- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想到的设计是这样的:有一个TreeView<E>
,其中E
是一个包装类,其实现可能如下所示:
public class E {
private int key;
private String value;
public E(int key, String value) {
this.key = key;
this.value = value;
}
public int getKey(){
return key;
}
public String getValue() {
return value;
}
public String toString(){
return value;
}
}
所以TreeView<E>
将包含一堆 TreeItem<E>
实例。还有toString()
方法E
显示该值。
当你按下任何树项目时,我想要一个 TableView<ObservableList<String>>
将显示在所选TreeItem<E>
下方包含连接到 TreeItem<E>
的键值的数据库中的所有行.
这可能吗?我知道TreeTableView
是一个不错的选择,但我不想显示任何列,除非我确实按下了树项目之一。我想要每个 TreeItem<E>
拥有自己的 table 。不过,根据记录,所有表都将具有相同的列,只是行数不同。
更新:在@Uluk Biy 的帮助下,我成功实现了一个解决方案,但它包含一个错误。
问题是,当我在 TreeView 中按下 TreeItem 时,被选中的节点是第一个节点下方两步的节点,当我按下 TreeItem 时,该节点在滚动 Pane 中不可见(TreeView 自动包含滚动 Pane )。因此,如果我拉伸(stretch)窗口以隐藏少于 3 个树项目,则不会显示任何内容。这并不是 TableView 显示在错误的位置,问题是没有选择正确的树项(我知道这一点是因为我已经打印出了键值。
这是显示此错误的 SSCCE。在表中选择包装器 1,包装器 6 将被选中。如果更改 TreeView 的大小,隐藏的 TreeItem 少于三个,则不会选择任何内容。
import javafx.application.Application;
import javafx.beans.property.SimpleStringProperty;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.control.TreeCell;
import javafx.scene.control.TreeItem;
import javafx.scene.control.TreeView;
import javafx.scene.layout.AnchorPane;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
import javafx.util.Callback;
public class SSCCE extends Application {
private Stage primaryStage;
private AnchorPane rootLayout;
private TreeView<Wrapper> overview;
public void start(Stage primaryStage) {
this.primaryStage = primaryStage;
this.primaryStage.setTitle("SSCCE");
initRootLayout();
showTreeView();
}
public void initRootLayout() {
rootLayout = new AnchorPane();
rootLayout.setPrefSize(300, 200);
Scene scene = new Scene(rootLayout);
primaryStage.setScene(scene);
primaryStage.show();
}
ObservableList<String> columns = FXCollections.observableArrayList();
ObservableList<ObservableList<String>> data = FXCollections.observableArrayList();
ObservableList<Wrapper> items = FXCollections.observableArrayList();
private void showTreeView() {
// Dummy values
columns.addAll("key", "text");
data.add(FXCollections.observableArrayList("1", "test"));
data.add(FXCollections.observableArrayList("1", "test2"));
data.add(FXCollections.observableArrayList("2", "test3"));
data.add(FXCollections.observableArrayList("2", "test4"));
data.add(FXCollections.observableArrayList("3", "test5"));
data.add(FXCollections.observableArrayList("3", "test6"));
data.add(FXCollections.observableArrayList("4", "test7"));
data.add(FXCollections.observableArrayList("4", "test8"));
data.add(FXCollections.observableArrayList("5", "test9"));
data.add(FXCollections.observableArrayList("5", "test10"));
data.add(FXCollections.observableArrayList("6", "test11"));
data.add(FXCollections.observableArrayList("6", "test12"));
items.addAll(new Wrapper(1, "wrapper 1"), new Wrapper(2, "wrapper 2"), new Wrapper(3, "wrapper 3"), new Wrapper(4, "wrapper 4"), new Wrapper(5, "wrapper 5"), new Wrapper(6, "wrapper 6"));
TreeItem<Wrapper> root = new TreeItem<Wrapper>();
overview = new TreeView<Wrapper>(root);
overview.setPrefHeight(75);
overview.setCellFactory(new Callback<TreeView<Wrapper>, TreeCell<Wrapper>>() {
@Override
public TreeCell<Wrapper> call(TreeView<Wrapper> stringTreeView) {
TreeCell<Wrapper> treeCell = new TreeCell<Wrapper>() {
@Override
protected void updateItem(Wrapper item, boolean empty) {
super.updateItem(item, empty);
if (empty || item == null) {
setText(null);
setGraphic(null);
} else {
if (getTreeItem().isLeaf() && isSelected()) {
setText(null);
// A debug text that proves that the wrong item is being selected.
System.out.println("Selected wrapper: " + item);
TableView<ObservableList<String>> table = new TableView<ObservableList<String>>();
for (int i = 0; i < columns.size(); i++) {
final int j = i;
TableColumn<ObservableList<String>, String> column = new TableColumn<ObservableList<String>, String>(
columns.get(i));
column.setCellValueFactory((
TableColumn.CellDataFeatures<ObservableList<String>, String> param) -> new SimpleStringProperty(
param.getValue().get(j)
.toString()));
table.getColumns()
.add(column);
}
ObservableList<ObservableList<String>> selected_data = FXCollections
.observableArrayList();
for(int i = 0; i < data.size(); i++) {
if(Integer.parseInt(data.get(i).get(0)) == item.getKey()) {
selected_data.add(data.get(i));
}
}
table.setItems(selected_data);
VBox vbox = new VBox(new Label(item
.getValue()), table);
setGraphic(vbox);
} else {
setText(item.getValue());
setGraphic(null);
}
}
}
};
return treeCell;
}
});
for (int i = 0; i < items.size(); i++) {
TreeItem<Wrapper> target = new TreeItem<Wrapper>(items.get(i));
root.getChildren().add(target);
}
overview.setShowRoot(false);
rootLayout.getChildren().add(overview);
}
public static void main(String[] args) {
launch(args);
}
}
class Wrapper {
private int key;
private String value;
Wrapper(int key, String value) {
this.key = key;
this.value = value;
}
int getKey() {
return key;
}
String getValue() {
return value;
}
public String toString() {
return "Wrapper " + key;
}
}
最佳答案
设置自定义单元工厂不是一种可行的方法。因为单元格被重用来渲染多个项目,所以如果最初所有单元格在 TreeView 的视口(viewport)中都可见,则仅默认选择一个项目将不会触发单元格的重用,因此不会调用 updateItem()。另一方面,如果视口(viewport)之外还有其他项目,并且用户向下滚动到它们,则上方不可见项目的单元格将被重用以渲染新进入视口(viewport)的项目下方。这在我看来是对下面评论中描述的行为的解释。简而言之,定义自定义 TreeCell
不是正确的方法,相反,我们可以观察项目选择的变化并在其中设置图形:
treeView.getSelectionModel().selectedItemProperty().addListener( ( ObservableValue<? extends TreeItem<Wrapper>> observable,
TreeItem<Wrapper> oldValue, TreeItem<Wrapper> newValue ) ->
{
System.out.println( "Selected newValue: " + newValue );
if ( oldValue != null )
{
// hide graphic of previous selected item
oldValue.setGraphic( null );
}
if ( newValue != null )
{
TableView<ObservableList<String>> table = new TableView<>();
for ( int i = 0; i < columns.size(); i++ )
{
final int j = i;
TableColumn<ObservableList<String>, String> column = new TableColumn<>(
columns.get( i ) );
column.setCellValueFactory( (
TableColumn.CellDataFeatures<ObservableList<String>, String> param ) ->
new SimpleStringProperty( param.getValue().get( j ) ) );
table.getColumns().add( column );
}
ObservableList<ObservableList<String>> selected_data = FXCollections
.observableArrayList();
for ( int i = 0; i < data.size(); i++ )
{
if ( Integer.parseInt( data.get( i ).get( 0 ) ) == newValue.getValue().getKey() )
{
selected_data.add( data.get( i ) );
}
}
table.setItems( selected_data );
VBox vbox = new VBox( new Label( newValue.getValue().getValue() ), table );
newValue.setGraphic( vbox );
}
} );
并且不设置treeView.setCellFactory(...)
。现在的问题是如何隐藏项目的文本。
关于java - 在 TreeView<E> 内显示 TableView<ObservableList<String>>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30568580/
我正在编写一个具有以下签名的 Java 方法。 void Logger(Method method, Object[] args); 如果一个方法(例如 ABC() )调用此方法 Logger,它应该
我是 Java 新手。 我的问题是我的 Java 程序找不到我试图用作的图像文件一个 JButton。 (目前这段代码什么也没做,因为我只是得到了想要的外观第一的)。这是我的主课 代码: packag
好的,今天我在接受采访,我已经编写 Java 代码多年了。采访中说“Java 垃圾收集是一个棘手的问题,我有几个 friend 一直在努力弄清楚。你在这方面做得怎么样?”。她是想骗我吗?还是我的一生都
我的 friend 给了我一个谜语让我解开。它是这样的: There are 100 people. Each one of them, in his turn, does the following
如果我将使用 Java 5 代码的应用程序编译成字节码,生成的 .class 文件是否能够在 Java 1.4 下运行? 如果后者可以工作并且我正在尝试在我的 Java 1.4 应用程序中使用 Jav
有关于why Java doesn't support unsigned types的问题以及一些关于处理无符号类型的问题。我做了一些搜索,似乎 Scala 也不支持无符号数据类型。限制是Java和S
我只是想知道在一个 java 版本中生成的字节码是否可以在其他 java 版本上运行 最佳答案 通常,字节码无需修改即可在 较新 版本的 Java 上运行。它不会在旧版本上运行,除非您使用特殊参数 (
我有一个关于在命令提示符下执行 java 程序的基本问题。 在某些机器上我们需要指定 -cp 。 (类路径)同时执行java程序 (test为java文件名与.class文件存在于同一目录下) jav
我已经阅读 StackOverflow 有一段时间了,现在我才鼓起勇气提出问题。我今年 20 岁,目前在我的家乡(罗马尼亚克卢日-纳波卡)就读 IT 大学。足以介绍:D。 基本上,我有一家提供簿记应用
我有 public JSONObject parseXML(String xml) { JSONObject jsonObject = XML.toJSONObject(xml); r
我已经在 Java 中实现了带有动态类型的简单解释语言。不幸的是我遇到了以下问题。测试时如下代码: def main() { def ks = Map[[1, 2]].keySet()
一直提示输入 1 到 10 的数字 - 结果应将 st、rd、th 和 nd 添加到数字中。编写一个程序,提示用户输入 1 到 10 之间的任意整数,然后以序数形式显示该整数并附加后缀。 public
我有这个 DownloadFile.java 并按预期下载该文件: import java.io.*; import java.net.URL; public class DownloadFile {
我想在 GUI 上添加延迟。我放置了 2 个 for 循环,然后重新绘制了一个标签,但这 2 个 for 循环一个接一个地执行,并且标签被重新绘制到最后一个。 我能做什么? for(int i=0;
我正在对对象 Student 的列表项进行一些测试,但是我更喜欢在 java 类对象中创建硬编码列表,然后从那里提取数据,而不是连接到数据库并在结果集中选择记录。然而,自从我这样做以来已经很长时间了,
我知道对象创建分为三个部分: 声明 实例化 初始化 classA{} classB extends classA{} classA obj = new classB(1,1); 实例化 它必须使用
我有兴趣使用 GPRS 构建车辆跟踪系统。但是,我有一些问题要问以前做过此操作的人: GPRS 是最好的技术吗?人们意识到任何问题吗? 我计划使用 Java/Java EE - 有更好的技术吗? 如果
我可以通过递归方法反转数组,例如:数组={1,2,3,4,5} 数组结果={5,4,3,2,1}但我的结果是相同的数组,我不知道为什么,请帮助我。 public class Recursion { p
有这样的标准方式吗? 包括 Java源代码-测试代码- Ant 或 Maven联合单元持续集成(可能是巡航控制)ClearCase 版本控制工具部署到应用服务器 最后我希望有一个自动构建和集成环境。
我什至不知道这是否可能,我非常怀疑它是否可能,但如果可以,您能告诉我怎么做吗?我只是想知道如何从打印机打印一些文本。 有什么想法吗? 最佳答案 这里有更简单的事情。 import javax.swin
我是一名优秀的程序员,十分优秀!