自制ChoiceBoxTableCell startEdit-方法没有将Cell.editing变成true

发布于 2025-01-05 08:25:47 字数 4243 浏览 4 评论 0原文

我的问题很简单。我重写了 TableCell 的一些方法,如下所示:

class ChoiceBoxTableCell<S, T> extends TableCell<S, T> {

private ChoiceBox<T> view;

private ObservableList<T> values;

@Override
public void cancelEdit() {
    super.cancelEdit();
    setContentDisplay(ContentDisplay.TEXT_ONLY);
}

private void createView() {
    view = new ChoiceBox<T>(values);
    view.setMinWidth(this.getWidth() - this.getGraphicTextGap() * 2);
    final EventHandler<KeyEvent> keyHandler = new EventHandler<KeyEvent>() {
        @Override
        public void handle(final KeyEvent t) {
            if (t.getCode() == KeyCode.ENTER) {
                commitEdit(view.getSelectionModel().getSelectedItem());
            } else if (t.getCode() == KeyCode.ESCAPE) {
                cancelEdit();
            }
        }
    };
    view.setOnKeyPressed(keyHandler);
    view.setOnKeyTyped(keyHandler);
    view.setOnKeyReleased(keyHandler);
}

public ObservableList<T> getValues() {
    return values;
}

public void setValues(final ObservableList<T> values) {
    this.values = values;
}

@Override
public void startEdit() {
    super.startEdit();
    System.out.println("ChoiceBoxTableCell.startEdit() -> editable: " + isEditable()); // print is true
    System.out.println("ChoiceBoxTableCell.startEdit() -> editing: " + isEditing()); // print is false

    if (view == null) {
        createView();
    } else {
        view.getSelectionModel().select(getItem());
    }
    setGraphic(view);
    setContentDisplay(ContentDisplay.GRAPHIC_ONLY);
}

@Override
public void updateItem(final T item, final boolean empty) {
    super.updateItem(item, empty);
    if (view != null) {
        view.getSelectionModel().select(item);
    }
    if (item != null) {
        setText(item.toString());
    }
}
}

现在我希望在运行 super.startEdit() 后将变量“editing”设置为 true。在下面的类中,代码有效:

abstract class AbstractEditingTableCell<S, T> extends TableCell<S, T> {

private TextField textField;

public AbstractEditingTableCell() {}

@Override
public void cancelEdit() {
    super.cancelEdit();
    setContentDisplay(ContentDisplay.TEXT_ONLY);
}

private void commit() {
    try {
        final String text = textField.getText();
        commitEdit(parse(text));
    } catch (final Exception e) {
        // FIXME Ungültige Eingabe: TextField markieren als fehlerhaft
        e.printStackTrace();
    }
}

private void createTextField() {
    textField = new TextField(getFormatted(getItem()));
    textField.setMinWidth(this.getWidth() - this.getGraphicTextGap() * 2);
    final EventHandler<KeyEvent> keyHandler = new EventHandler<KeyEvent>() {
        @Override
        public void handle(final KeyEvent t) {
            if (t.getCode() == KeyCode.ENTER) {
                commit();
            } else if (t.getCode() == KeyCode.ESCAPE) {
                cancelEdit();
            }
        }
    };
    textField.setOnKeyPressed(keyHandler);
    textField.setOnKeyTyped(keyHandler);
    textField.setOnKeyReleased(keyHandler);
    textField.focusedProperty().addListener(new ChangeListener<Boolean>() {
        @Override
        public void changed(final ObservableValue<? extends Boolean> observable, final Boolean oldValue, final Boolean newValue) {
            if (!newValue) {
                commit();
            }
        }
    });
}

public abstract String getFormatted(T item);

protected abstract T parse(String value) throws Exception;

@Override
public void startEdit() {
    super.startEdit();
    System.out.println("AbstractEditingTableCell.startEdit() -> editing: " + isEditing()); // print is true

    if (textField == null) {
        createTextField();
    } else {
        textField.setText(getFormatted(getItem()));
    }
    setGraphic(textField);
    setContentDisplay(ContentDisplay.GRAPHIC_ONLY);
}

@Override
public void updateItem(final T item, final boolean empty) {
    super.updateItem(item, empty);
    if (textField != null) {
        textField.setText(getFormatted(item));
    }
    setText(getFormatted(item));
}

}

我看到的唯一区别是 ChoiceBox。 有人对我的问题有建议吗?

PS:请原谅我的英语,我不是本地人;)

谢谢你的时间

帕特里克

my problem is quiet simple. I overrode a few methods of TableCell as follows:

class ChoiceBoxTableCell<S, T> extends TableCell<S, T> {

private ChoiceBox<T> view;

private ObservableList<T> values;

@Override
public void cancelEdit() {
    super.cancelEdit();
    setContentDisplay(ContentDisplay.TEXT_ONLY);
}

private void createView() {
    view = new ChoiceBox<T>(values);
    view.setMinWidth(this.getWidth() - this.getGraphicTextGap() * 2);
    final EventHandler<KeyEvent> keyHandler = new EventHandler<KeyEvent>() {
        @Override
        public void handle(final KeyEvent t) {
            if (t.getCode() == KeyCode.ENTER) {
                commitEdit(view.getSelectionModel().getSelectedItem());
            } else if (t.getCode() == KeyCode.ESCAPE) {
                cancelEdit();
            }
        }
    };
    view.setOnKeyPressed(keyHandler);
    view.setOnKeyTyped(keyHandler);
    view.setOnKeyReleased(keyHandler);
}

public ObservableList<T> getValues() {
    return values;
}

public void setValues(final ObservableList<T> values) {
    this.values = values;
}

@Override
public void startEdit() {
    super.startEdit();
    System.out.println("ChoiceBoxTableCell.startEdit() -> editable: " + isEditable()); // print is true
    System.out.println("ChoiceBoxTableCell.startEdit() -> editing: " + isEditing()); // print is false

    if (view == null) {
        createView();
    } else {
        view.getSelectionModel().select(getItem());
    }
    setGraphic(view);
    setContentDisplay(ContentDisplay.GRAPHIC_ONLY);
}

@Override
public void updateItem(final T item, final boolean empty) {
    super.updateItem(item, empty);
    if (view != null) {
        view.getSelectionModel().select(item);
    }
    if (item != null) {
        setText(item.toString());
    }
}
}

Now i would expect that the variable 'editing' would be set to true after running through super.startEdit(). In the following class the code works:

abstract class AbstractEditingTableCell<S, T> extends TableCell<S, T> {

private TextField textField;

public AbstractEditingTableCell() {}

@Override
public void cancelEdit() {
    super.cancelEdit();
    setContentDisplay(ContentDisplay.TEXT_ONLY);
}

private void commit() {
    try {
        final String text = textField.getText();
        commitEdit(parse(text));
    } catch (final Exception e) {
        // FIXME Ungültige Eingabe: TextField markieren als fehlerhaft
        e.printStackTrace();
    }
}

private void createTextField() {
    textField = new TextField(getFormatted(getItem()));
    textField.setMinWidth(this.getWidth() - this.getGraphicTextGap() * 2);
    final EventHandler<KeyEvent> keyHandler = new EventHandler<KeyEvent>() {
        @Override
        public void handle(final KeyEvent t) {
            if (t.getCode() == KeyCode.ENTER) {
                commit();
            } else if (t.getCode() == KeyCode.ESCAPE) {
                cancelEdit();
            }
        }
    };
    textField.setOnKeyPressed(keyHandler);
    textField.setOnKeyTyped(keyHandler);
    textField.setOnKeyReleased(keyHandler);
    textField.focusedProperty().addListener(new ChangeListener<Boolean>() {
        @Override
        public void changed(final ObservableValue<? extends Boolean> observable, final Boolean oldValue, final Boolean newValue) {
            if (!newValue) {
                commit();
            }
        }
    });
}

public abstract String getFormatted(T item);

protected abstract T parse(String value) throws Exception;

@Override
public void startEdit() {
    super.startEdit();
    System.out.println("AbstractEditingTableCell.startEdit() -> editing: " + isEditing()); // print is true

    if (textField == null) {
        createTextField();
    } else {
        textField.setText(getFormatted(getItem()));
    }
    setGraphic(textField);
    setContentDisplay(ContentDisplay.GRAPHIC_ONLY);
}

@Override
public void updateItem(final T item, final boolean empty) {
    super.updateItem(item, empty);
    if (textField != null) {
        textField.setText(getFormatted(item));
    }
    setText(getFormatted(item));
}

}

The only difference I see is the ChoiceBox.
Does anyone have a suggestion for my problem?

PS: please excuse my english i'm not a native ;)

thank you for your time

patrick

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文