ОК - я боролся и боролся с этим и прочитал миллион постов, учебных пособий и т. Д. Ни один из них, кажется, не касается непосредственно того, что я пытаюсь сделать здесь. У меня есть небольшой пример кода для иллюстрации.
По сути, я хочу иметь возможность вызывать / запускать пользовательское событие с кнопки, чтобы метка реагировала на это событие.
(Обратите внимание, что я НЕ ЗАИНТЕРЕСОВАН в поиске других способов сделать это, кроме того, что я пытаюсь сделать здесь с реальными объектами Event. Я прекрасно знаю, как это сделать с прослушивателями изменений и тому подобным, но я хочу чтобы научиться делать это так.)
Вот код, который вы видите, не дает мне результат, который я ищу. Многое из этого исходит из некоторых примеров (которые на самом деле не работали для меня), и я признаю, что здесь есть части, которые "гудят" над моей головой.
Если кто-то может помочь мне заставить его работать, я могу позже проанализировать его, чтобы точно понять, что происходит. Вот код:
import javafx.application.Application;
import javafx.beans.property.ObjectProperty;
import javafx.beans.property.SimpleObjectProperty;
import javafx.event.Event;
import javafx.event.EventHandler;
import javafx.event.EventType;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
//-------------------------------------------------------------------
public class MyDemo extends Application {
public static void main(String[] args) {
launch(args);
}
@Override
public void start(Stage primaryStage) {
// label that should receive the event and react to it
MyLabel lblReceiver = new MyLabel("And I Should Receive & React");
// button to firs the event
Button btnSender = new Button("Initate Event");
btnSender.setPrefWidth(200);
btnSender.setOnAction(e -> {
MyEvent.fireEvent(lblReceiver, e); // really confused what the first parameter here is supposed to be.
});
// set up stage and show it
Stage stage = new Stage();
VBox root = new VBox(btnSender, lblReceiver);
root.setSpacing(10);
root.setPadding(new Insets(10, 10, 10, 10));
Scene scene = new Scene(root);
stage.setScene(scene);
stage.show();
}
}
//-------------------------------------------------------------------
// Interface for objects that want to listen to my event
//-------------------------------------------------------------------
interface MyEventListener {
void onMyEvent();
}
//-------------------------------------------------------------------
// My event definition itself
//-------------------------------------------------------------------
class MyEvent extends Event {
public static final EventType<MyEvent> MY_EVENT = new EventType<>(ANY, "MY_EVENT");
public MyEvent(EventType<? extends MyEvent> eventType) {
super(eventType);
}
}
//-------------------------------------------------------------------
//base/parent class for my label - this is what should receive/respond to event and
// where I'm sure i have problems - just don't know what.
//-------------------------------------------------------------------
class MyLabel extends Label implements MyEventListener {
public MyLabel(String name) {
this.setAlignment(Pos.CENTER);
this.setText(name);
this.setPrefWidth(200);
}
@Override // this is what I'm expecting to happen when i click the button
public void onMyEvent() {
this.setText("YAY! i got the event!");
}
private final ObjectProperty<EventHandler<? super MyEvent>> onMyEventProp
= new SimpleObjectProperty<EventHandler<? super MyEvent>>(this, "onMyEvent") {
@Override
protected void invalidated() {
setEventHandler(MyEvent.MY_EVENT, get());
}
};
public final void setOnMyEvent(EventHandler<? super MyEvent> handler) {
onMyEventProp.set(handler);
}
public final EventHandler<? super MyEvent> getOnMyEvent() {
return onMyEventProp.get();
}
public final ObjectProperty<EventHandler<? super MyEvent>> onMyEventProperty() {
return onMyEventProp;
}
}
//-------------------------------------------------------------------