天道酬勤,学无止境

JavaFX: Disable multiple rows in TableView based on other TableView

I'm creating an application in JavaFx. Right now I have two tableviews next to each other:

------------------------------------------------------------------------------
| TableView 1                        |  TableView 2                          |  
|                                    |                                       |
|                                    |  Entry 1                              |
|                                    |  Entry 2                              |
|                                    |  Entry 3                              |
|                                    |  Entry ...                            |
|                                    |  Entry N                              |
------------------------------------------------------------------------------

I would like to copy items from TableView 2 to TableView 1, but at the same time, the entries that have been copied from TableView 2 need to be disabled (disable the row with setDisable or something similar). I do know how to copy the items from one tableview to another. The problem is that I do not know how to disable multiple rows when one or multiple entries have been copied to TableView 1. I tried this with a RowFactory, like this:

productsInTransaction.setRowFactory(tv -> {
      TableRow<Product> row = new TableRow<>();
      row.disableProperty().bind(???);
      return row;
});

Any help is much appreciated!

标签

评论

I'm not quite sure of the logic you're wanting, but if your row factory is attached to table 1, and you are disabling the row when the item is present in table 2, do:

row.disableProperty().bind(Bindings.createBooleanBinding(() -> 
    table2.getItems().contains(row.getItem()), table2.getItems(), row.itemProperty()));

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • JavaFX: BooleanBindings in bind with multiple EasyBind maps
    This question goes further where JavaFX: Disable multiple rows in TableView based on other TableView stops. I want to generate a more general topic, of which other people could also benefit. I also have the two tableviews. I also want to disable a row in table2 when table1 contains the same object. This is achieved with the code below: //Check if a row needs to be disabled: this is achieved with a rowfactory ObservableList<String> listOfSKUs = EasyBind.map(table1.getItems(),Product::getSKU); table2.setRowFactory(tv -> { TableRow<Product> row = new TableRow<>(); //The row doesnt need to be
  • JavaFX:如何禁用TableView中的行?(JavaFX: How to disable a row in a TableView?)
    问题 我想禁用TableView中的一行。 我有一个产品的Tableview,并且我已经知道需要禁用哪个产品(我从填充TableView的ObservableList中获得了它的索引)。 如何获得与ObservableList中与Product关联的TableRow,我知道其中的索引? 否则:是否有一种简便的方法可以从TableView禁用特定的TableRow? 任何帮助是极大的赞赏。 回答1 最好的方法不是使用索引,而是使用自定义的行工厂并观察行中项目的适当属性。 对于当前的API,这有些棘手,因为您可能需要观察表行的item属性的属性。 您可以使用Bindings.select(...)来执行此操作,但是当前版本在该项为null时会发出很多不必要的警告(这会经常发生)。 我更喜欢将EasyBind框架用于这种功能。 本示例禁用显示项的value属性小于5的所有表行: import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Random; import java.util.function.Function; import javafx.application.Application; import javafx.beans.binding
  • JavaFX:与多个 EasyBind 映射绑定的 BooleanBindings(JavaFX: BooleanBindings in bind with multiple EasyBind maps)
    问题 这个问题更进一步,其中 JavaFX: Disable multiple rows in TableView based on other TableView 停止。 我想生成一个更一般的主题,其他人也可以从中受益。 我也有两个表视图。 当 table1 包含相同的对象时,我还想禁用 table2 中的一行。 这是通过以下代码实现的: //Check if a row needs to be disabled: this is achieved with a rowfactory ObservableList<String> listOfSKUs = EasyBind.map(table1.getItems(),Product::getSKU); table2.setRowFactory(tv -> { TableRow<Product> row = new TableRow<>(); //The row doesnt need to be checked when it is empty, thats the first part //The second part is a big OR: the row is a gift card OR the listOfSkus contains the row. In this last one, the amount also
  • JavaFX TableView:选择整个TableColumn并获取索引(JavaFX TableView: Select the whole TableColumn and get the index)
    问题 假设我们有一个包含 3 列(A、B、C)的简单 Tableview。 每列包含一些目前不重要的数据。 我想知道是否可以只选择一整列(无论用户单击列中的哪个位置)并检索用户选择的该列的 ID 和/或索引? 例如,用户单击 B 列区域中的某处。在这种情况下,应该标记整个列并返回索引 2。 任何帮助,将不胜感激 ;) 回答1 You can try something like this: table.getSelectionModel().setSelectionMode(SelectionMode.MULTIPLE); table.getSelectionModel().setCellSelectionEnabled(true); table.addEventFilter(MouseEvent.MOUSE_PRESSED, (event) -> { if(event.isShortcutDown() || event.isShiftDown()) event.consume(); }); table.getFocusModel().focusedCellProperty().addListener((obs, oldVal, newVal) -> { if(newVal.getTableColumn() != null){ table.getSelectionModel()
  • 我可以在我的 TableView 中使用 CheckBoxTableCell 作为让用户选择多行的一种方式吗?(Can I use a CheckBoxTableCell in my TableView as a way to let the user select multiple rows?)
    问题 在我的 TableView 中,我想要一个包含复选框的列。 此复选框是用户选择要为特定操作(例如删除)标记哪些行的一种方式。 我曾尝试使用 CheckBoxTableCell 但我看到的所有示例都将复选框的值绑定到模型的某些布尔属性。 我的 TableView 所基于的模型是一个 JPA 实体并且没有这样的字段。 我也不愿意添加这样的字段,因为除了用于此行选择目的之外,它与模型无关。 因此我的问题是,是否可以使用 CheckBoxTableCell 来选择多行。 如果是这样,我该如何实现它,然后再获取所选的每一行? 如果没有,使用表格列中的复选框实现多项选择的最佳方法是什么? 谢谢你。 回答1 首先请注意,您只需使用表格视图的默认选择实现即可实现此功能。 即调用table.getSelectionModel().setSelectionMode(SelectionMode.MULTIPLE); . 然后用户可以选择多行,您可以只对选定的行进行操作。 如果您想为此功能使用复选框列,这并不难: CheckBoxTableCell有一个 selectedStateCallback 属性,它是一个将单元格(即它的行)的索引映射到ObservableValue<Boolean>的函数。 复选框的选中状态将绑定(如果 observable 布尔值是可写的,则是双向的)到作为此函数结果的
  • Javafx 选择多行(Javafx select multiple rows)
    问题 我正在尝试在 JavaFX 中选择多行,但我不想为此使用键盘(即 SHIFT 键)。 它应该在我点击后被选中,当我点击另一列时它也应该被选中。 我在这里查看了其他一些答案,但找不到简短而方便的内容。 有没有更短的方法来做到这一点? @FXML private static Logger logger = Logger.getLogger(MainFrameControl.class); public TableView<Box> boxTable; protected final ObservableList<Box> boxData = FXCollections.observableArrayList(); Service service = new ServiceImpl(); private Stage mainStage; public MainFrameControl(Stage mainStage) { FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("MainFrame.fxml")); fxmlLoader.setRoot(this); fxmlLoader.setController(this); this.mainStage = mainStage; Stage stage =
  • javafx,TableView:检测对单元格的双击(javafx, TableView: detect a doubleclick on a cell)
    问题 给定一个TableView,我需要检测单元格上的双击。 tableView.setOnMouseClicked(new EventHandler<MouseEvent>() { @Override public void handle(MouseEvent event) { if(event.getClickCount()>1) { System.out.println("double clicked!"); } } }); 如何确定单击鼠标所在的单元格? 回答1 代码示例。 运行官方tableview教程的“示例12-11:单元格编辑的替代解决方案” 。 替换以下内容: table.setEditable(false); Callback<TableColumn, TableCell> cellFactory = new Callback<TableColumn, TableCell>() { public TableCell call(TableColumn p) { TableCell cell = new TableCell<Person, String>() { @Override public void updateItem(String item, boolean empty) { super.updateItem(item, empty); setText
  • JavaFX: How to disable a row in a TableView?
    I want to disable a row in a TableView. I have a Tableview of Products, and I already know which product needs to be disabled (I got the index of it from the ObservableList that fills the TableView). How do I get the TableRow that is associated with Product in the ObservableList, of which I know the index? Otherwise: is there a easy way to disable a specific TableRow from a TableView? Any help is greatly appreciated.
  • 在JavaFX应用程序中聚焦TableView或TreeView时,总是选择第一行(First Row Always Gets Selected When Focussing a TableView or TreeView in a JavaFX Application)
    问题 我意识到JavaFX应用程序中的所有tableViews和treeViews都会一集中就选择第一行。 结果,即使单击相应的滚动条,也将选择第一行。 既然我当然不希望有这样的行为,我想问一下,是否有办法避免这种行为? 编辑:我添加了一个简单的示例,创建两个谦虚的列表。 在这里,只要单击一个空行,就会选择第一行。 编辑2:在代码中添加了两个小的侦听器,这样就可以在不重新启动应用程序的情况下重复出现该问题。 package testlistview; import javafx.application.Application; import javafx.scene.Scene; import javafx.scene.control.ListView; import javafx.scene.input.MouseEvent; import javafx.scene.layout.HBox; import javafx.stage.Stage; public class TestListView extends Application { public static void main(String[] args) { launch(args); } @Override public void start(Stage primaryStage) throws Exception
  • 适配 TableView 菜单按钮(Adapt TableView menu button)
    问题 问题 TableView 的 setTableMenuButtonVisible 提供了一种机制来更改表列的可见性。 然而,该功能还有很多不足之处: 菜单应保持打开状态。 例如,我有 15 个表格列,单击菜单打开 -> 单击列 -> 单击菜单打开 -> 单击下一列 -> ... 更改多列的可见性很痛苦应该有一个全选/取消全选功能应该有一种方法可以使用自定义项目扩展菜单取消选择所有列后,无法重新选择列,因为标题消失了,表格菜单也随之消失了 换句话说:表格菜单的当前实现是相当无用的。 题 有谁知道如何用适当的菜单替换现有的tableview菜单? 我见过一个带有“.show-hide-columns-button”样式查找和添加事件过滤器的解决方案。 然而那是两年前的事了,也许事情发生了变化。 非常感谢! 这就是我想要的方式,通过 ContextMenu 演示(即鼠标右键单击表格): public class TableViewSample extends Application { private final TableView table = new TableView(); public static void main(String[] args) { launch(args); } @Override public void start(Stage stage) {
  • JavaFx - String and FlowPane (row?) within tableView?
    I'm currently trying to implement the following: A TableView with an ObservableList as dataset, with two columns, each of which contains Strings (names of the players). This part is easy enough. Once a Player(name) is clicked, a custom FlowPane should be injected below the selected player. If another player is clicked, the flowpane should disappear and be injected below the currently clicked player. The below code implements the TableView (minus the mouse listener part). Please help me let the FlowPane span the entire row. I'm guessing I need a RowFactory but have no clue how to make it work
  • 如何根据排序的过滤列表向 JavaFX 中的 TableView 添加新行?(How to add new Rows to TableView in JavaFX, based on a sorted filtered List?)
    问题 在我的 FXMLTableViewController.java 中,我添加了一个搜索功能,它使用排序过滤列表在同一个 TableView 中显示搜索结果(过滤结果)。 这段代码取自这里,这是我在我的项目中实现的。 但是当我执行通常的data2.add(new Entity(""));时它会抛出异常data2.add(new Entity("")); public class FXMLTableViewController { @FXML private TableView<Entity> tableView; @FXML private JFXTextField searchBox; @FXML public void initialize() throws IOException, ParseException { tableView.setItems(data2); //data2 is a observable list returned my another function, it is not related here. FilteredList<Entity> filteredData = new FilteredList<> (data2, p -> true); searchBox.textProperty().addListener(
  • 任务中的Tableview中的JavaFX Update进度栏(JavaFX Update progressbar in tableview from Task)
    问题 我知道Task有一个方法updateProgress,我需要将progressbar绑定到task,但是我不能这样做,因为我没有Progressbar作为对象。 我的程序有一个TableView。 用户输入下载URL并单击后,将下载在TableView中创建的新行。 该行具有一些信息和进度栏列。 然后,我开始一个新线程-任务。 所有下载都已完成,我需要以某种方式更新该行中的进度条。 我尝试将SimpleDoubleProperty绑定到任务,但它不会更新进度栏... 回答1 James D在Oracle JavaFX论坛线程中解决了此问题:表单元进度指示器。 我刚刚将该解决方案复制到了此答案中。 该解决方案创建多个任务,并通过TableView中的一组进度条监视它们的进度。 原始线程还包括一个解决方案,该解决方案在您喜欢ProgressBars的情况下使用ProgressIndicators。 import java.util.Random; import java.util.concurrent.Executor; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.ThreadFactory
  • 如何在 JavaFX 2 中禁用表格单元格进行编辑(How to disable a table cell for editing in JavaFX 2)
    问题 在 JavaFX 2 中,我想禁用列中的某些单元格进行编辑。 类似的东西 TableModel.isCellEditable(row, col) 在摇摆。 我需要行中的项目来决定单元格是否可编辑,单元格值是不够的。 我设法编写的代码是: TableView<FilterItem> localTableView = new TableView<FilterItem>() { public void edit(int paramInt, TableColumn<FilterItem, ?> paramTableColumn) { if (paramInt >= 0) { FilterItem item = getItems().get(paramInt); //get item in the row if (!item.isPropagated()) { //condition return; } } super.edit(paramInt, paramTableColumn); } }; 问题是没有视觉线索表明某些项目被禁用进行编辑。 设置单元工厂是我尝试的第一件事,但我无法访问更新单元方法中的行数据: localValueCol.setCellFactory( new Callback<TableColumn<FilterItem, String>, TableCell
  • JavaFX 在多个页面上打印 tableview(JavaFX print tableview on multiple pages)
    问题 所以,我的问题是我需要打印 tableview 的内容,但是我有很多项目,它只打印其中的前 23 个。 我已经在这里找到了一些解决方案,不幸的是它们并没有太大帮助。 这是我的打印方法: @FXML private void printIt() { Printer printer = Printer.getDefaultPrinter(); PageLayout pageLayout = printer.createPageLayout(Paper.A4, PageOrientation.LANDSCAPE, Printer.MarginType.DEFAULT); double scaleX = pageLayout.getPrintableWidth() / logBookTable.getBoundsInParent().getWidth(); double scaleY = pageLayout.getPrintableHeight() / logBookTable.getBoundsInParent().getHeight(); logBookTable.getTransforms().add(new Scale(scaleX, scaleY)); PrinterJob job = PrinterJob.createPrinterJob(); if (job !=
  • JavaFX TableView: format one cell based on the value of another in the row
    I have a class named TransactionWrapper I'm using to populate my ObservableList for the TableView in my application. This wrapper has an attribute (enum) indicating whether it is a withdrawal or a deposit. I need to get to that to render/format the amount cell (display it in red or green based on the nature of the transaction) and I'm not finding anything out there that is helping me with that battle. Basically what I want to do is look at the row and say if the type is withdrawal, color the text red and if it's a deposit color it green... I'm hoping someone here can help me out with this. I
  • 如何在 JavaFX 9 中的 TableView 中查找可见行的索引(How to find the indices of the visible rows in a TableView in JavaFX 9)
    问题 如何在 JavaFX 9 中获取 TableView 中可见行的索引? 在 JavaFX 8 中,我可以执行以下操作: // --- The offending imports in Java 9 // import com.sun.javafx.scene.control.skin.TableViewSkin; // import com.sun.javafx.scene.control.skin.VirtualFlow; /** * This is a total hack. We need it as scrollTo jumps the selected * row to the top of the table. Jarring if the row is already * visible. As a workaround, we only scroll if the row isn't already * visible * * @return A 2 element ray with the start and end index of visible rows */ public int[] getVisibleRows() { TableView<?> tableView = getTableView(); TableViewSkin<?> skin =
  • How can I bypass the JavaFX's TableView "placeholder"?
    JavaFX's TableView has a placeholder property that is basically a Node that gets displayed in the TableView whenever it is empty. If this property is set to null (its default value), it appears as a Label or some other text based Node that says "There is no content in the table." But if there are any rows of data in the table, then the placeholder Node disappears and the entire vertical space in the TableView gets filled with rows, including empty rows if there isn't enough data to fill the whole table. These empty rows are what I want, even when the table is empty. In other words, I don't
  • Insert row in JavaFX TableView and start editing is not working correctly
    We are running a JavaFX application that contains some editable table views. A new requested feature is: a button that adds a new row below the currently selected one and immediately starts to edit the first cell of the row. We implemented this feature, which was not so complicated, but we experience a very strange behavior and after a couple of days investigating the issue we still have no idea what goes wrong. What happens is that when one clicks the button it adds a new row but starts to edit to first cell not of the newly created row but on an arbitrary other row. Unfortunately, this issue
  • How to add new Rows to TableView in JavaFX, based on a sorted filtered List?
    In my FXMLTableViewController.java I have added a Search feature which uses the Sorted Filtered List to display the search Results (filter results) in the same TableView. This code was taken from here this is what I have implemented in my Project. But it throws exception when I do the usual data2.add(new Entity("")); public class FXMLTableViewController { @FXML private TableView<Entity> tableView; @FXML private JFXTextField searchBox; @FXML public void initialize() throws IOException, ParseException { tableView.setItems(data2); //data2 is a observable list returned my another function, it is