如何选择单元格内的单个字符,而不是JavaFX TableView中的整个单元格?

时间:2018-06-11 13:51:42

标签: javafx

我知道如何在JavaFX的tableview中复制整个单元格,但是有一种方法我只能在一个单元格中复制文本的一部分吗?

例如,如果我在单元格中有以下内容:

1. apples
2. oranges
3. bananas

我希望能够从单元格中复制“2. oranges”而不复制整个文本内容列表。目前,如果我点击一个单元格,它会突出显示并复制整个文本。

1 个答案:

答案 0 :(得分:1)

我喜欢做的一件事是在右键单击上下文菜单中创建选项。

  

密码:

    //Use setRowFactory to set up the ContextMenu
    table.setRowFactory(new Callback<TableView<Person>, TableRow<Person>>()
    {
        @Override
        public TableRow<Person> call(TableView<Person> tableView)
        {
            final TableRow<Person> row = new TableRow<>();
            final ContextMenu contextMenu = new ContextMenu();
            final MenuItem copyItem = new MenuItem("copy index and first name");
            copyItem.setOnAction(new EventHandler<ActionEvent>()
            {
                @Override
                public void handle(ActionEvent event)
                {
                    final Clipboard clipboard = Clipboard.getSystemClipboard();
                    final ClipboardContent content = new ClipboardContent();
                    Person tempPerson = row.getItem();
                    //Put the row index and first name in clipboard
                    content.putString(row.getIndex() + ". " + tempPerson.getFirstName());
                    clipboard.setContent(content);
                }
            });
            contextMenu.getItems().add(copyItem);
            // Set context menu on row, but use a binding to make it only show for non-empty rows:
            row.contextMenuProperty().bind(
                    Bindings.when(row.emptyProperty())
                            .then((ContextMenu) null)
                            .otherwise(contextMenu)
            );
            return row;
        }
    });
  

完整代码 - 来自https://gist.github.com/james-d/7758918

的代码更改

主要类

import java.util.Arrays;
import javafx.application.Application;
import javafx.beans.binding.Bindings;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.geometry.Insets;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.control.ContextMenu;
import javafx.scene.control.Label;
import javafx.scene.control.MenuItem;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableRow;
import javafx.scene.control.TableView;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.scene.input.Clipboard;
import javafx.scene.input.ClipboardContent;
import javafx.scene.layout.VBox;
import javafx.scene.text.Font;
import javafx.stage.Stage;
import javafx.util.Callback;

public class TableViewSample extends Application
{

    private TableView<Person> table = new TableView<Person>();
    private final ObservableList<Person> data
            = FXCollections.observableArrayList(
                    new Person("Jacob", "Smith", "jacob.smith@example.com"),
                    new Person("Isabella", "Johnson", "isabella.johnson@example.com"),
                    new Person("Ethan", "Williams", "ethan.williams@example.com"),
                    new Person("Emma", "Jones", "emma.jones@example.com"),
                    new Person("Michael", "Brown", "michael.brown@example.com")
            );

    public static void main(String[] args)
    {
        launch(args);
    }

    @Override
    public void start(Stage stage)
    {
        Scene scene = new Scene(new Group());
        stage.setTitle("Table View Sample");
        stage.setWidth(450);
        stage.setHeight(500);

        final Label label = new Label("Address Book");
        label.setFont(new Font("Arial", 20));

        table.setEditable(true);

        TableColumn<Person, String> firstNameCol = new TableColumn<>("First Name");
        firstNameCol.setMinWidth(100);
        firstNameCol.setCellValueFactory(
                new PropertyValueFactory<Person, String>("firstName"));

        TableColumn<Person, String> lastNameCol = new TableColumn<>("Last Name");
        lastNameCol.setMinWidth(100);
        lastNameCol.setCellValueFactory(
                new PropertyValueFactory<Person, String>("lastName"));

        TableColumn<Person, String> emailCol = new TableColumn<>("Email");
        emailCol.setMinWidth(200);
        emailCol.setCellValueFactory(
                new PropertyValueFactory<Person, String>("email"));

        table.setItems(data);
        table.getColumns().addAll(Arrays.asList(firstNameCol, lastNameCol, emailCol));

        table.setRowFactory(new Callback<TableView<Person>, TableRow<Person>>()
        {
            @Override
            public TableRow<Person> call(TableView<Person> tableView)
            {
                final TableRow<Person> row = new TableRow<>();
                final ContextMenu contextMenu = new ContextMenu();
                final MenuItem copyItem = new MenuItem("copy index and first name");
                copyItem.setOnAction(new EventHandler<ActionEvent>()
                {
                    @Override
                    public void handle(ActionEvent event)
                    {
                        final Clipboard clipboard = Clipboard.getSystemClipboard();
                        final ClipboardContent content = new ClipboardContent();
                        Person tempPerson = row.getItem();
                        content.putString(row.getIndex() + ". " + tempPerson.getFirstName());
                        clipboard.setContent(content);
                    }
                });
                contextMenu.getItems().add(copyItem);
                // Set context menu on row, but use a binding to make it only show for non-empty rows:
                row.contextMenuProperty().bind(
                        Bindings.when(row.emptyProperty())
                                .then((ContextMenu) null)
                                .otherwise(contextMenu)
                );
                return row;
            }
        });

        final VBox vbox = new VBox();
        vbox.setSpacing(5);
        vbox.setPadding(new Insets(10, 0, 0, 10));
        vbox.getChildren().addAll(label, table);

        ((Group) scene.getRoot()).getChildren().addAll(vbox);

        stage.setScene(scene);
        stage.show();
    }
}

人员类

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package javafxapplication206;

import javafx.beans.property.SimpleStringProperty;

public class Person
{

    private final SimpleStringProperty firstName;
    private final SimpleStringProperty lastName;
    private final SimpleStringProperty email;

    public Person(String fName, String lName, String email)
    {
        this.firstName = new SimpleStringProperty(fName);
        this.lastName = new SimpleStringProperty(lName);
        this.email = new SimpleStringProperty(email);
    }

    public String getFirstName()
    {
        return firstName.get();
    }

    public void setFirstName(String fName)
    {
        firstName.set(fName);
    }

    public String getLastName()
    {
        return lastName.get();
    }

    public void setLastName(String fName)
    {
        lastName.set(fName);
    }

    public String getEmail()
    {
        return email.get();
    }

    public void setEmail(String fName)
    {
        email.set(fName);
    }
}