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();