bashoogzaad
bashoogzaad

Reputation: 4781

JavaFX8: How to create listener for selection of row in Tableview?

I currently have two tableviews in one screen, which results in both TableViews have rows which the user can select.

Now I want only one row to be selected at the same time (doesn't matter which TableView it is selected from). I was thinking about some kind of listener which deselects the other row when a row is selected. This is my initial setup:

Step 1 Search for a way to bind a method to the selection of a row (there is not something like tableview.setOnRowSelected(method))

Step 2 Create the method which acts like a kind of listener: when a row is selected, deselect the other row (I know how to do this part)

Class1 selectedObject1 = (Class1)tableview1.getSelectionModel().getSelectedItem();
Class2 selectedObject2 = (Class2)tableview2.getSelectionModel().getSelectedItem();

if(selectedObject1 != null && selectedObject2 != null) {
   tableview1.getSelectionModel().clearSelection();
}

So, step one is the problem. I was thinking of an observable list on which a listener can be created, and then add the selected row to the list. When this happens, the listener can call the method. Anyone any clue how to make this?

Any help is greatly appreciated.

Upvotes: 45

Views: 74216

Answers (5)

java.is.for.desktop
java.is.for.desktop

Reputation: 11216

In case you need not only the row, but the x|y position of the table cell, do this:

table.getFocusModel().focusedCellProperty().addListener(
        new ChangeListener<TablePosition>() {
    @Override
    public void changed(ObservableValue<? extends TablePosition> observable,
            TablePosition oldPos, TablePosition pos) {
        int row = pos.getRow();
        int column = pos.getColumn();
        String selectedValue = "";

        if (table.getItems().size() > row
                && table.getItems().get(row).size() > column) {
            selectedValue = table.getItems().get(row).get(column);
        }

        label.setText(selectedValue);
    }
});

In this example, I am using a "classic" TableView with List<String> as column model. And, of course, that label is just an example from my code.

Upvotes: 1

badarshahzad
badarshahzad

Reputation: 1297

This question helped me but during experiment in javafx and jfoenix this also works for me.

deleteSingle.addEventHandler(MouseEvent.MOUSE_CLICKED, (e) -> {

            StringProperty selectedItem = table.getSelectionModel().getSelectedItem().getValue().link1;

            System.out.println("That is selected item : "+selectedItem);

            if (selectedItem.equals(null)) {

            System.out.println(" No item selected");


            } else {
                System.out.println("Index to be deleted:" + selectedItem.getValue());

                 //Here was my database data retrieving and selectd
                 // item deleted and then table refresh
                table.refresh();

                return;
            }

        });

Upvotes: 1

I use it for deleting the chosen row.

public void ButtonClicked()
{
  ObservableList<Names> row , allRows;
  allRows = table.getItems();
  row = table.getSelectionModel().getSelectedItems();         
  row.forEach(allRows::remove);
}

Upvotes: 1

James_D
James_D

Reputation: 209684

The selectedItem in the selection model is an observable property, so you should be able to achieve this with:

tableview1.getSelectionModel().selectedItemProperty().addListener((obs, oldSelection, newSelection) -> {
    if (newSelection != null) {
        tableview2.getSelectionModel().clearSelection();
    }
});

tableview2.getSelectionModel().selectedItemProperty().addListener((obs, oldSelection, newSelection) -> {
    if (newSelection != null) {
        tableview1.getSelectionModel().clearSelection();
    }
});

Upvotes: 85

user2186425
user2186425

Reputation: 475

My solution would be creating custom cell factory for table and set it for each table columns.

Callback<TableColumn<..., ...>, TableCell<..., ...>> value = param -> {
                TextFieldTableCell cell = new TextFieldTableCell<>();
                cell.addEventFilter(MouseEvent.MOUSE_CLICKED, event -> {
                            //your code
                        }
                );
                return cell;
            };
            packageName.setCellFactory(value);

    table1.column1.setCellFactory();
    table2.column1.setCellFactory();
    ...

Upvotes: 1

Related Questions