我的 UI 中有一个 TableView,它显示数据库中的用户列表。该表的一列是可编辑的,当启用编辑时,该特定列的单元格将变成树形视图,列出可以选择的各种选项。
只是为了澄清,我试图在表格单元格上实现类似日期选择器或颜色选择器的功能,但使用我自己的项目列表作为树。
该表是这样定义的
private TableView<User> userTable;
Run Code Online (Sandbox Code Playgroud)
显示树视图的特定列定义如下
private TableColumn<User, TreeView> col4;
Run Code Online (Sandbox Code Playgroud)
我设置了像这样的 setcellFactory 方法来显示树
col4.setCellFactory(new Callback<TableColumn<User,TreeView>, TableCell<User,TreeView>>() {
@Override
public TableCell<User, TreeView> call(
TableColumn<User, TreeView> param)
{
returns a comboboxtablecell which is filled with a tree
}
});
Run Code Online (Sandbox Code Playgroud)
在表中的相应列中,当我单击单元格时,该单元格显示一个组合框,打开时的组合框显示树值。
但是,当单元格处于不可编辑状态时,我不确定应该如何使用字符串值设置 setcellValuefactory
col4.setCellValueFactory(new Callback<TableColumn.CellDataFeatures<User,TreeView>, ObservableValue<TreeView>>() {
@Override
public ObservableValue<TreeView> call(
CellDataFeatures< User,TreeView> param)
{
}
}
Run Code Online (Sandbox Code Playgroud)
当单元格处于不可编辑状态时,我想将树视图内的值显示为字符串。我不知道如何根据方法签名返回树视图类型的可观察值并仍然显示字符串。
我有一些Task执行可能挂起的 I/O 阻塞操作(从 中获取文件URL)
task = new Task<List<WSDLOperation>>() {
@Override
protected List<WSDLOperation> call() {
List<WSDLOperation> services = new ArrayList<>();
try {
services = WSDLService.createService(wsdlURL).getOperations();
} catch (Exception ex) {
LOG.log(Level.WARNING, "Can't reach {0}", wsdlURL);
}
return services;
}
};
}
Run Code Online (Sandbox Code Playgroud)
该方法createService可以永远等待而不抛出任何Exception。(我使用Main 类中定义的全局 ( static public)执行任务)。ExecutorService
fxml文件如下(省略头文件):
<BorderPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity"
minWidth="-Infinity" prefHeight="600.0" prefWidth="800.0"
xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1"
fx:id="pane"
fx:controller="com.github.parboiled1.grappa.debugger.mainwindow.MainWindowUi">
<top>
<MenuBar BorderPane.alignment="CENTER">
<Menu mnemonicParsing="false" text="File">
<MenuItem fx:id="loadInput" mnemonicParsing="false"
text="Load file" onAction="#loadFileEvent"/>
<MenuItem fx:id="parse" mnemonicParsing="false"
text="Parse" onAction="#parseEvent"/>
<MenuItem fx:id="closeButton" mnemonicParsing="false"
text="Close" onAction="#closeWindowEvent"/>
</Menu>
</MenuBar>
</top>
<center>
<SplitPane dividerPositions="0.5" prefHeight="160.0" prefWidth="200.0"
BorderPane.alignment="CENTER">
<SplitPane dividerPositions="0.5" orientation="VERTICAL">
<TreeView fx:id="traceTree" prefHeight="200.0"
prefWidth="200.0" editable="false"/>
<TextArea fx:id="traceDetail" prefHeight="200.0"
prefWidth="200.0"/>
</SplitPane>
<TextArea fx:id="inputText" prefHeight="200.0" prefWidth="200.0"/>
</SplitPane>
</center>
</BorderPane>
Run Code Online (Sandbox Code Playgroud)
TreeView我可以毫无问题地设置根。树已更新,没有问题。
我遇到的问题是我无法设法在视图中的给定项目上触发事件。我尝试使用onMouseClicked简单的 System.out.println() 添加一个事件,无论我在树中单击哪个项目,我都可以看到该事件被触发。但我根本无法获取视图中已单击的项目。
我怎么做?
我有动态树表。如何设置列标题的工具提示,显示标题文本。下面的代码显示特定单元格的工具提示,但我不知道在哪里设置它的标题文本。
for (Entry<String, String> ent : dc.getSortedAssignedOrg().entrySet()) {
TreeTableColumn<String, ArrayList<String>> col = new TreeTableColumn<>(
ent.getValue());
col.setCellFactory(new Callback<TreeTableColumn<String, ArrayList<String>>, TreeTableCell<String, ArrayList<String>>>() {
@Override
public TreeTableCell<String, ArrayList<String>> call(
TreeTableColumn<String, ArrayList<String>> param) {
return new TreeTableCell<String, ArrayList<String>>() {
public void updateItem(ArrayList<String> item,
boolean empty) {
super.updateItem(item, empty);
if (item == null || empty) {
setStyle("");
setText("");
} else if (item.contains("Green")) {
float weightInt = Float.parseFloat(item.get(0));
float res = weightInt * 1;
String resString = Float.toString(res);
this.setStyle("-fx-background-color:green");
setTooltip(new Tooltip(item.get(2)));
setText(resString);
} else if (item.contains("yellow")) …Run Code Online (Sandbox Code Playgroud) 我第一次从事 java/Javafx 项目,我有一个TableView多列(姓名、名字、年龄...)来呈现我的数据,我需要用户能够选择一行并给我每次有关此人(其他列)的所有信息,即使他单击另一列,但我一直无法找到正确的方法来做到这一点。当我选择一行时,我的代码每次都会给出我单击的单元格的值,但我需要其他信息在我的 SQLite 数据库中搜索并对其进行处理(删除/编辑此人..)
这是我使用的代码:
...//rest of code
@Override
public void initialize(URL location, ResourceBundle resources) {
private TableView<Student> tbl_elev=new TableView<Student>();
...
tbl_elev.getSelectionModel().selectedItemProperty().addListener(new ChangeListener<Object>() {
@Override
public void changed(ObservableValue<?> observableValue, Object oldValue, Object newValue) {
//Check whether item is selected and set value of selected item to Label
if (tbl_elev.getSelectionModel().getSelectedItem() != null) {
TableViewSelectionModel<Student> selectionModel = tbl_elev.getSelectionModel();
ObservableList<?> selectedCells = selectionModel.getSelectedCells();
@SuppressWarnings("unchecked")
TablePosition<Object, ?> tablePosition = (TablePosition<Object, ?>) selectedCells.get(0);
Object …Run Code Online (Sandbox Code Playgroud) 当我双击列标题单元格的右边框时 - 它会自动调整列的宽度。 我怎样才能以编程方式做同样的事情?
我试图根据条件设置列表视图中各个单元格的样式。列表视图的类型是Label,在列表视图中插入标签时,条件是根据另一个类确定的。
目前,我尝试设置列表视图中每个标签的背景颜色,但它没有覆盖整个区域(见图)。
我也研究了这篇文章,但它不适合我的情况,因为字符串中不包含用于突出显示列表视图单元格的标识符。
到目前为止的当前代码:
for (Consultation c : notifications){
Label l = new Label(": consult reminder - " + c.getReminderTime());
if(c.getReminderRead() == 1){ //if the consultation reminder hasn't been read
l.setStyle("-fx-background-color: #33CEFF");
counter = counter + 1;
}
notificationList.getItems().add(l);
}
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?
从JavaFX CSS 参考指南中,我-fx-text-fill对使用它的属性有足够的了解。
在最近更新到 JavaFX 16 的更大的 JavaFX 项目上工作时,我遇到了一些 CSS 代码,这些代码-fx-text-inner-color显然用于实现完全相同的事情,即更改(在我的情况下)TextField 控件的文本颜色。
由于我找不到关于第二个财产的任何文件,我决定在这里询问。
有人能解释一下这两个属性之间的区别吗,为什么我们需要这两个属性,以及什么时候更喜欢一个?
javafx ×10
java ×7
css ×4
javafx-8 ×3
fxml ×2
columnheader ×1
concurrency ×1
javafx-2 ×1
javafx-css ×1
listview ×1
tableview ×1
tooltip ×1