JavaFX SelectionService selber implementieren

lam_tr

Top Contributor
Hallo zusammen,

ich finde der SelectionService von RCP ganz toll und möchte es für meine JavaFX nachbauen. Ich habe auch schon eine Lösung, bin aber nicht sicher ob das schön ist, deswegen möchte ich eure Meinung nachfragen.

Die Idee von SelectionService ist, der speichert immer die aktuelle Selektierung einer View, e.g. TreeView, ListView etc.

Alle anderen Views die daran interessiert sind, sollen Zugriff zu dem Service haben und es holen, beziehungsweise, wenn die Selektierung stattegfunden hat, werden die registrierten Views informiert.

Ich habe an der Stelle Google Guava benutzt

Hier der SelectionService
Code:
public enum SelectionService {
    INSTANCE;
   
    private EventBus eventBus;
   
    private SelectionService() {
        eventBus = new EventBus();
    }
   
    public void register(Object object) {
        eventBus.register(object);
    }

    public void unregister(Object object) {
        eventBus.unregister(object);
    }
   
    public void setSelection(StructureSelection selection) {
        eventBus.post(selection);
    }
}

Das Speichern der Selektierung über diese Klasse
Code:
public enum StructureSelection {
    INSTANCE;

    private Object selection;

    public Object getSelection() {
        return selection;
    }

    public void setSelection(Object selection) {
        this.selection = selection;
    }
}

Speichern der Selektierung geht dann wie folgt
Code:
    @Override
    public void changed(ObservableValue<? extends Object> arg0, Object arg1, Object newValue) {
        StructureSelection.INSTANCE.setSelection(newValue);
        SelectionService.INSTANCE.setSelection(StructureSelection.INSTANCE);
    }

Das Abhören der Selektierung
Code:
public class LabelView extends HBox{

    private Label label = new Label("Hallo");
   
    public LabelView() {
        getChildren().add(label);
        SelectionService.INSTANCE.register(this);
    }
   
    @Subscribe
    public void onSelection(StructureSelection selection) {
        label.setText(selection.getSelection().toString());
    }
}

Hier eine Veranschaulichung direkt von der Eclipse Seite
diagram1.gif


Bitte um Vorschläge, gerne auch syntaktische clean code Verbesserung.

Vielen Dank.
lam
 

dzim

Top Contributor
Hm. Ich verstehe, was du erreichen möchtest. Aber:

Ich sehe den Vorteil von dem gegenüber einer ObjectProperty noch nicht.

Ich persönlich finde die Lösung über eine Enum und eine Singleton-Instanz auch nicht sehr elegant (entweder: Dependency Injection oder nutzen der Properties-API an allen Node - bzw. ich würde es in dem Fall in das Window (die Stage) packen).

Sonst gibt es IMHO grundsätzlich nicht so viel zu sagen. Wenn du einen Anwendungszweck dafür hast, dann verwende es...
 

lam_tr

Top Contributor
Hm. Ich verstehe, was du erreichen möchtest. Aber:

Ich sehe den Vorteil von dem gegenüber einer ObjectProperty noch nicht.

Ich persönlich finde die Lösung über eine Enum und eine Singleton-Instanz auch nicht sehr elegant (entweder: Dependency Injection oder nutzen der Properties-API an allen Node - bzw. ich würde es in dem Fall in das Window (die Stage) packen).

Sonst gibt es IMHO grundsätzlich nicht so viel zu sagen. Wenn du einen Anwendungszweck dafür hast, dann verwende es...

Hi,

ich versuche gerade eine "Workbench" zusammen zu bauen und der ProjectExplorer ist beispielsweise in ein anderes OSGI-Plug-in wie die PropertyView (ich benutze an der Stelle kein E4 RCP oder Efxclipse Framework)

Wahrscheinlich hast du Recht, Dependency Injection ist eher der richtige Weg diesen Service zu registrieren.

Dann komme ich halt nicht drum rum Guice zu lernen :)

Danke!
lam

P.S: Properties API bedeutet, ich mache zentral eine SelectionObjectProperty und binde es zu allen Teilnehmer, ja ok, das könnte ich auch machen.
 
Zuletzt bearbeitet:

dzim

Top Contributor
Puh, dass hab ich vor knapp 7 Jahren mit JavaFX auch mal gemacht. Die "Plugins" haben sich als OSGi-Service angemeldet, aber durch eine dünne e4-Schicht zusammengehalten.
Hat zwar eigentlich recht gut funktioniert, aber verdammt: das Ding war frickelig. Und ich hab in der Zeit erst langsam begriffen, wie gut einem Tools wie Maven helfen können - denn Dependencies hab ich damals nicht damit gemanaget und könnte mich heute darüber ärgern, denn somit ist es heute nicht mehr Einsatzbereit. Tja. Shit happens.
 

lam_tr

Top Contributor
Puh, dass hab ich vor knapp 7 Jahren mit JavaFX auch mal gemacht. Die "Plugins" haben sich als OSGi-Service angemeldet, aber durch eine dünne e4-Schicht zusammengehalten.
Hat zwar eigentlich recht gut funktioniert, aber verdammt: das Ding war frickelig. Und ich hab in der Zeit erst langsam begriffen, wie gut einem Tools wie Maven helfen können - denn Dependencies hab ich damals nicht damit gemanaget und könnte mich heute darüber ärgern, denn somit ist es heute nicht mehr Einsatzbereit. Tja. Shit happens.

Ich habe das jetzt halbwegs hinbekommen. Ich missbrauche das Ganze eigentlich ein bisschen als Plug-In aber tatsächlich laufen die nicht über einen OSGI Container.

Für die SelectionService habe ich jetzt Guice und Guava benutzt, klappt soweit echt gut. Was mich noch daran stört ist. ich injecte den SelectionService und EventBus über den AbstractModule. Jedes mal wenn ich woanders (im anderen Plug-in) darauf zugreifen möchte, mache ich es über meine eigene Klasse ApplcationContext.getInstance(SelectionService.class). Kann ich das auch wie bei Eclipse RCP elegant über @Inject machen? Wenn ich das mache sind die Services null.

Ich muss ehrlich gestehen, ich bin auch sehr neu in Guice und Guava.
 

dzim

Top Contributor
Ja, das muss gehen, aber das Problem ist: Ich kann dir keine OSGi-spezifischen Fragen mehr beantworten, da ich damit schon viel zu lange nichts mehr gemacht habe... Das meiste Wissen ist schon aus meinem Gehirn gespült.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
4 Swing Graphen selber zeichnen AWT, Swing, JavaFX & SWT 2
D Swing jSlider soll selber weiterwandern, je nach zeit der musik AWT, Swing, JavaFX & SWT 5
P [JTree] Markierhilfe der Drop-Location selber gestalten. AWT, Swing, JavaFX & SWT 4
M Swing Docking Widgets selber machen? AWT, Swing, JavaFX & SWT 14
T GUI-Builder selber erstellen AWT, Swing, JavaFX & SWT 2
G JIntegerField selber schreiben AWT, Swing, JavaFX & SWT 2
X MouseEvent selber auslösen AWT, Swing, JavaFX & SWT 12
I Event, Eventquelle und Listener selber schreiben AWT, Swing, JavaFX & SWT 9
G Mousecursor selber dynamisch generieren. AWT, Swing, JavaFX & SWT 6
G JScrollPane scrollt nach Neuzeichnen von selber AWT, Swing, JavaFX & SWT 2
V Listener selber schreiben? AWT, Swing, JavaFX & SWT 2
R Swing Background Image in JFrame implementieren AWT, Swing, JavaFX & SWT 40
ralfb1105 JavaFX AreaChart als DB Monitor implementieren AWT, Swing, JavaFX & SWT 11
D JavaFX Google API/OpenStreetMap in GUI implementieren AWT, Swing, JavaFX & SWT 1
Joker4632 JavaFX GridPane richtig implementieren AWT, Swing, JavaFX & SWT 7
Thallius Single Sign On in Java Implementieren AWT, Swing, JavaFX & SWT 6
L JavaFX StackedBar Implementieren? AWT, Swing, JavaFX & SWT 7
B GridLayout - wie am besten implementieren AWT, Swing, JavaFX & SWT 3
U Buttons schräg implementieren AWT, Swing, JavaFX & SWT 4
B mouseOnEntered ( Controller richtig implementieren) AWT, Swing, JavaFX & SWT 4
R AWT QuadratListener implementieren AWT, Swing, JavaFX & SWT 17
C In Hauptfenster Programm-Klassen implementieren AWT, Swing, JavaFX & SWT 9
K Action Listener implementieren über Objekt AWT, Swing, JavaFX & SWT 14
E Swing KeyListener implementieren AWT, Swing, JavaFX & SWT 12
M KeyListener richtig implementieren AWT, Swing, JavaFX & SWT 3
E Swing JTextArea in JFrame, wie nun WindowFocusListener implementieren? AWT, Swing, JavaFX & SWT 2
S Swing Spiel Richtig/Falsch implementieren AWT, Swing, JavaFX & SWT 5
S TextArea ausgabe ohne JFrame zu implementieren AWT, Swing, JavaFX & SWT 2
S Swing JTextArea - Bild auf/ab Tasten implementieren AWT, Swing, JavaFX & SWT 4
H shell in view implementieren; menu mit keystroke unterlegen AWT, Swing, JavaFX & SWT 8
L SWT CLabel als Button implementieren? AWT, Swing, JavaFX & SWT 6
3TageBart Ebenen in Zeichen-Programm implementieren AWT, Swing, JavaFX & SWT 9
GilbertGrape ActionListener implementieren oder Eigenen für jede Komponente? AWT, Swing, JavaFX & SWT 9
R setEnabled bei eigenem Widget implementieren? AWT, Swing, JavaFX & SWT 3
S Methoden implementieren AWT, Swing, JavaFX & SWT 7
B KeyListener implementieren AWT, Swing, JavaFX & SWT 3
F Welchen Listener implementieren? AWT, Swing, JavaFX & SWT 4
S Mehrsprachigkeit in GUI implementieren AWT, Swing, JavaFX & SWT 3
F Größenänderung mittels Maus - selbst implementieren? AWT, Swing, JavaFX & SWT 3
M ActionListener implementieren AWT, Swing, JavaFX & SWT 10
J Scrolling implementieren mit JPanels AWT, Swing, JavaFX & SWT 5

Ähnliche Java Themen

Neue Themen


Oben