Java - это ключевое слово внутри нового оператора

public class FXMLDocumentController implements Initializable {

    @Override
    public void initialize(URL url, ResourceBundle rb) {

        listViewArtigosMercado.setCellFactory((ListView<String> param) -> new ListCell<String>(){
            @Override
            public void updateItem(String name, boolean empty){
                super.updateItem(name,empty);
                if (name.equals("Vender")){
                    setText(name);
                    ((Node)this).setId("id");
                }
            }
        });
    }
}

Я хочу, чтобы мой this Ключевое слово, будь ссылка на мой новый ListCell<String> скорее, чем FXMLDocumentController, один раз ListCell продолжается

java.lang.Object,
**javafx.scene.Node**,
javafx.scene.Parent,
javafx.scene.layout.Region,
javafx.scene.control.Control,
javafx.scene.control.Labeled,
javafx.scene.control.Cell<T>,
javafx.scene.control.IndexedCell<T>,
javafx.scene.control.ListCell<T>

а также class Node есть метод setId,

Как ссылаться на мой новый класс внутри реализации?

3 ответа

Удалить актерский состав и thisэто однозначный вызов, относящийся к методу родителя:

setId("id");

Посмотрите внимательно на то, как вы используете setText(name);, Метод из Labeled, но вы также не использовали this и не передавайте его этому классу просто потому, что в этом не было необходимости. ListCell это Labeled также как и Node,

Здесь, как я вижу, вы используете lambda Функция внутри метода инициализации, как показано ниже.

listViewArtigosMercado.setCellFactory((ListView<String> param) -> new ListCell<String>(){
      @Override
      public void updateItem(String name, boolean empty){
      super.updateItem(name,empty);
      if (name.equals("Vender")){
          setText(name);
              ((Node)this).setId("id");
          }
      }
 });

Лямбда не относится к анонимному классу. Таким образом, область действия лямбда-функции ограничена этим конкретным закрывающим закрытием. this является ссылкой только для этой конкретной области. так что не можешь писать this.setId('Id'); внутри setCelFactor лямбда, потому что он не содержит setId метод.

Здесь лямбда рассматривается как дочерний класс родительского класса. В вашем случае это дочерний класс FXMLDocumentController так что он имеет доступ ко всем открытым методам родительского класса, так что вы можете использовать setID или другие методы, прямые без какой-либо ссылки.

Insted of (Node)this использование Node.this, Вы можете получить текущий объект внешнего класса, вызвав OuterClass.this,

Тогда вы можете просто вызвать его метод:

(OuterClass.this).methodOfOuterClass();
Другие вопросы по тегам