Java 在tableview中仅为一个单元格着色

Java 在tableview中仅为一个单元格着色,java,javafx,colors,tableview,tooltip,Java,Javafx,Colors,Tableview,Tooltip,我为了这个解决方案工作了一整天。我希望我能找到任何帮助 所以我有一个桌面视图。当我单击一个单元格时,我会通过右键单击得到一个上下文菜单。右键单击菜单项,将打开一个文本输入对话框。键入内容后,我将文本显示为工具提示。我只想在选定的单元格中显示工具提示。例如,背景颜色应更改为红色。这应该是有工具提示的信号 我可以将文本输入文本显示为工具提示,但不能显示在选定的单元格中,不幸的是,只能显示在整个tableview中。我无法为单元格着色,也无法显示该单元格是否有工具提示。我也在使用css。 我希望我能解

我为了这个解决方案工作了一整天。我希望我能找到任何帮助

所以我有一个桌面视图。当我单击一个单元格时,我会通过右键单击得到一个上下文菜单。右键单击菜单项,将打开一个文本输入对话框。键入内容后,我将文本显示为工具提示。我只想在选定的单元格中显示工具提示。例如,背景颜色应更改为红色。这应该是有工具提示的信号

我可以将文本输入文本显示为工具提示,但不能显示在选定的单元格中,不幸的是,只能显示在整个tableview中。我无法为单元格着色,也无法显示该单元格是否有工具提示。我也在使用css。 我希望我能解释一下

public class CreateScheme extends Application {

    // Variablen
    ContextMenu contextMenu = new ContextMenu();
    MenuItem item1 = new MenuItem("Tooltip erstellen");
    private Model model;
    private Pane root;
    TableView<Model> tableview = new TableView<Model>();
    VBox vbox3 = new VBox();
    private Tooltip tooltip = new Tooltip();
    TableCell<Model, String> cell = new TableCell<>();


    @Override
    public void start(Stage secondStage) throws Exception {

        // Scene / root
        root = new Pane(); // Layout -> alle Elmente haben die Position 0/0
        Scene scene = new Scene(root, 800, 600);

        // Variablen erstellen
        VBox vbox = new VBox();
        VBox vbox2 = new VBox();
        HBox hbox = new HBox();
        HBox hbox2 = new HBox();
        HBox hbox3 = new HBox();
        Label label = new Label("Bewertungsschema erstellen: ");
        Button button = new Button("New");
        TextField textField1 = new TextField();
        CheckBox checkbox = new CheckBox();
        Button addButton = new Button("Erstellen");
        Button cancelButton = new Button("Abbrechen");
        Button saveButton = new Button("Speichern");
        Button addTextFieldButton = new Button("+");
        Button bold = new Button("F");
        Button redButton = new Button("Fehler markieren");


        ObservableList<Model> list = FXCollections.observableArrayList();

        model = new Model();
        model.addListener(e -> {
            while (e.next()) {
                if (e.wasAdded()) {
                    int ix = model.size() - 1; // fängt bei Überschrift Table 1 an.
                    for (Model m : list) {
                        if (m.size() <= ix) {
                            m.add("");
                        }
                    }
                    TableColumn<Model, String> column = new TableColumn<Model, String>("Table" + (ix + 1));

                    column.setCellFactory(TextFieldTableCell.<Model>forTableColumn());
                    column.setCellValueFactory(feature -> feature.getValue().get(ix));
                    column.setEditable(true);
                    tableview.getColumns().add(column);

                }
            }
        });

        cell.getStyleClass().add("cellmy");

        tableview.setItems(list);
        tableview.setEditable(true);

        textField1.setVisible(false);
        checkbox.setVisible(false);
        vbox2.setVisible(false);

        hbox.setSpacing(10.0);
        hbox.getChildren().addAll(button, textField1, checkbox);

        vbox.setLayoutX(10.0);
        vbox.setLayoutY(30.0);
        vbox.setSpacing(30.0);
        vbox.setPadding(new Insets(10.0, 20.0, 30.0, 10.0));
        vbox.getChildren().addAll(label, hbox, redButton, bold);

        vbox2.setLayoutX(300.0);
        vbox2.setLayoutY(30.0);
        vbox2.setSpacing(30.0);
        vbox2.setMaxHeight(200.0);
        vbox2.setPadding(new Insets(50.0, 30.0, 30.0, 30.0));
        vbox2.getChildren().add(tableview);

        hbox2.setLayoutX(10.0);
        hbox2.setLayoutY(500.0);
        hbox2.setSpacing(20.0);

        hbox3.setLayoutX(10.0);
        hbox3.setLayoutY(550.0);
        hbox3.setSpacing(20.0);
        hbox3.getChildren().addAll(addButton, cancelButton, saveButton, addTextFieldButton);

        contextMenu.getItems().addAll(item1);

        button.setOnAction(new EventHandler<ActionEvent>() {

            public void handle(ActionEvent e) {
                textField1.setVisible(true);
                checkbox.setVisible(true);
            }
        });

        checkbox.setOnAction(new EventHandler<ActionEvent>() {

            public void handle(ActionEvent e) {
                vbox2.setVisible(true);
                textField1.setEditable(false);
            }
        });

        addTextFieldButton.setOnAction(event -> {
            TextField textfield = new TextField();
            int ix = model.size();
            model.add("");
            textfield.textProperty().bindBidirectional(model.get(ix));
            hbox2.getChildren().add(textfield);
        });

        addButton.setOnAction(new EventHandler<ActionEvent>() {

            public void handle(ActionEvent e) {

                // list.add(new Model());
                tableview.refresh();
            }
        });

        addButton.setOnAction(new EventHandler<ActionEvent>() {
            public void handle(ActionEvent e) {
                model.addTo(list);
                model.reset();
            }
        });

        saveButton.setOnAction(new EventHandler<ActionEvent>() {
            public void handle(ActionEvent e) {
                FileChooser fileChooser = new FileChooser();

                // Set extension filter
                FileChooser.ExtensionFilter extFilter = new FileChooser.ExtensionFilter("TXT files (*.txt)", "*.txt");
                fileChooser.getExtensionFilters().add(extFilter);

                // Show save file dialog
                File file = fileChooser.showSaveDialog(secondStage);

                if (file != null) {
                    saveTextToFile(root, file);
                }
            }
        });

        tableview.setTooltip(tooltip);
        item1.setOnAction(new EventHandler<ActionEvent>() {

            @Override
            public void handle(ActionEvent event) {
                showInputTextDialog();


            }
        });

        tableview.setOnContextMenuRequested(new EventHandler<ContextMenuEvent>() {

            @Override
            public void handle(ContextMenuEvent event) {
                contextMenu.show(tableview, event.getScreenX(), event.getScreenY());

            }
        });

        root.getChildren().addAll(vbox, vbox2, hbox2, hbox3);

        scene.getStylesheets().add("style.css");
        secondStage.setTitle("Bewertungsschema erstellen");
        secondStage.setScene(scene);
        secondStage.show();
    }

    private void showInputTextDialog() {

        TextInputDialog dialog = new TextInputDialog("Tran");

        dialog.setTitle("Bemerkung");
        dialog.setHeaderText("Meine Notiz:");
        dialog.setContentText("Bemerkung:");

        Optional<String> result = dialog.showAndWait();

        result.ifPresent(name -> {
            this.tooltip.setText(name);
        });

        if (result != null) {
            tableview.setStyle("-fx-background-color: red;");
        }
    }


    private void saveTextToFile(Pane pane2, File file) {
        try {
            PrintWriter writer;
            writer = new PrintWriter(file);
            writer.println(pane2);
            writer.close();
        } catch (IOException ex) {
            Logger.getLogger(CreateScheme.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public Pane getPane2() {
        return this.root;
    }

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


public class Model {


    private final ObservableList<SimpleStringProperty> properties = FXCollections.observableArrayList();

    public void addListener(ListChangeListener<? super SimpleStringProperty> listener) {
        properties.addListener(listener);
    }

    public void add(String value) {
        properties.add(new SimpleStringProperty(value));
    }

    public int size() {
        return properties.size();
    }

    public Property<String> get(int ix) {
        return properties.get(ix);
    }

    public void addTo(List<Model> list) {
        Model copy = new Model();
        for (SimpleStringProperty prop : properties) {
            copy.add(prop.getValue());
        }
        list.add(copy);
    }

    public void reset() {
        for (SimpleStringProperty prop : properties) {
            prop.setValue("");
        }
    }
}
public类CreateScheme扩展应用程序{
//变异素
ContextMenu ContextMenu=新建ContextMenu();
MenuItem1=新MenuItem(“工具提示erstellen”);
私有模型;
私有窗格根;
TableView TableView=新建TableView();
VBox vbox3=新的VBox();
专用工具提示工具提示=新工具提示();
TableCell=新的TableCell();
@凌驾
public void start(Stage secondStage)引发异常{
//场景/根
root=new Pane();//布局->alle Elmente haben模具位置0/0
场景=新场景(根,800600);
//艾斯泰伦变量
VBox VBox=新的VBox();
VBox vbox2=新的VBox();
HBox HBox=新的HBox();
HBox hbox2=新的HBox();
HBox hbox3=新的HBox();
标签标签=新标签(“Bewertungschema erstellen:”);
按钮按钮=新按钮(“新”);
TextField textField1=新的TextField();
复选框=新复选框();
按钮添加按钮=新按钮(“Erstellen”);
按钮取消按钮=新按钮(“Abbrechen”);
按钮保存按钮=新按钮(“Speichen”);
按钮addTextFieldButton=新按钮(“+”);
按钮粗体=新按钮(“F”);
按钮红色按钮=新按钮(“Fehler-markieren”);
ObservableList=FXCollections.observableArrayList();
模型=新模型();
model.addListener(e->{
while(如next()){
如果(e.wasAdded()){
int ix=model.size()-1;//fängt beiÜberschrift表1。
用于(m型:列表){
if(m.size()feature.getValue().get(ix));
column.setEditable(true);
tableview.getColumns().add(column);
}
}
});
cell.getStyleClass().add(“cellmy”);
tableview.setItems(列表);
tableview.setEditable(true);
textField1.setVisible(假);
复选框.setVisible(false);
vbox2.setVisible(假);
hbox.setspace(10.0);
hbox.getChildren().addAll(按钮,文本字段1,复选框);
vbox.setLayoutX(10.0);
vbox.setLayoutY(30.0);
vbox.setspace(30.0);
vbox.setPadding(新插图(10.0,20.0,30.0,10.0));
vbox.getChildren().addAll(标签、hbox、红色按钮、粗体);
vbox2.setLayoutX(300.0);
vbox2.setLayoutY(30.0);
vbox2.setspace(30.0);
vbox2.setMaxHeight(200.0);
vbox2.setPadding(新的插图(50.0,30.0,30.0,30.0));
vbox2.getChildren().add(tableview);
hbox2.setLayoutX(10.0);
hbox2.setLayoutY(500.0);
hbox2.setspace(20.0);
hbox3.setLayoutX(10.0);
hbox3.setLayoutY(550.0);
hbox3.setspace(20.0);
hbox3.getChildren().addAll(addButton、cancelButton、saveButton、addTextFieldButton);
contextMenu.getItems().addAll(item1);
setOnAction(新的EventHandler


您可以将单元格工厂设置为您的
表格视图
,并分别设置每个单元格的背景色样式和工具提示。但您必须在单元格项目中设置选定状态

您可以使用以下内容:

column.setCellFactory(e -> new TableCell<LineItem, String>() {
    @Override
    public void updateItem(Item item, boolean empty) {
        super.updateItem(item, empty);
        setStyle(null);
        setTooltip(null);
        if (item == null || empty) {
            setText(null);
        } else {
            setText(item.getText());
            if (item.isSelected()) {
                setStyle("-fx-background-color: red;");
                setTooltip(new Tooltip("My Tooltip"));
            }
        }
    }
});
column.setCellFactory(e->new TableCell(){
@凌驾
public void updateItem(项,布尔值为空){
super.updateItem(项,空);
设置样式(空);
设置工具提示(空);
如果(项==null | |空){
setText(空);
}否则{
setText(item.getText());
if(item.isSelected()){
setStyle(“-fx背景色:红色;”);
设置工具提示(新工具提示(“我的工具提示”);
}
}
}
});

您必须将单元格工厂设置为表中的每一列。

您可以将单元格工厂设置为您的
TableView
,并分别设置每个单元格的背景色样式和工具提示。但您必须在您的单元格项中设置所选状态

您可以使用以下内容:

column.setCellFactory(e -> new TableCell<LineItem, String>() {
    @Override
    public void updateItem(Item item, boolean empty) {
        super.updateItem(item, empty);
        setStyle(null);
        setTooltip(null);
        if (item == null || empty) {
            setText(null);
        } else {
            setText(item.getText());
            if (item.isSelected()) {
                setStyle("-fx-background-color: red;");
                setTooltip(new Tooltip("My Tooltip"));
            }
        }
    }
});
column.setCellFactory(e->new TableCell(){
@凌驾
public void updateItem(项,布尔值为空){
super.updateItem(项,空);
设置样式(空);
设置工具提示(空);
如果(项==null | |空){
setText(空);
}否则{
setText(item.getText());
if(item.isSelected()){
setStyle(“-fx背景色:红色;”);
设置工具提示(新工具提示(“我的工具提示”);
}
}
}
});

您必须将单元格工厂设置为表中的每一列。

那是什么
模型
类?我已经编辑了我的代码。有模型类。好的,我已经尝试了这个tableview.setStyle(“-fx选择栏:红色;-fx选择栏非聚焦:鲑鱼;”);所以问题是,我的背景是红色的,并且是非聚焦的鲑鱼。这没关系,但是非聚焦的背景必须一直保持鲑鱼色,即使我选择了另一个条。工具提示必须显示在我用文本输入对话框编辑工具提示的单元格中。一些想法?那是什么
Model
class?我编辑了我的代码.这是模型课。好的,我试过这个桌面视图。