2012-09-12 5 views
6

Ich bin sehr erfahren mit WPF und neu zu JavaFX 2.0. Ich bin dabei, ein Silverlight-Projekt nach JavaFX 2.0 zu verschieben. Zwei Apress-Bücher und mehrere Threads konnten meine Fragen nicht beantworten (vielleicht kann ich die Antworten aufgrund meiner WPF-beeinflussten Erwartungen nicht sehen oder verstehen).JavaFX 2.0 - Stil/Vorlage vorhandenes Steuerelement

Was ich brauche, ist ein Steuerelement mit RadioButton-Funktionalität, aber eine völlig andere Benutzeroberfläche. Mein RadioButton hat einen Text, ein Bild, keine Schaltfläche, eine Linie (Rechteck) unterhalb des Textes. Wenn der RadioButton nicht ausgewählt ist, sind Text und Bild transparent, das Bild ist grau und das Rechteck nicht sichtbar. Wenn es ausgewählt ist, sind der Text und das Bild undurchsichtig, das Bild ist farbig und das Rechteck wird sichtbar (alle Änderungen über die Animation).

Ich weiß, wie ein vorhandenes JavaFX 2.0-Steuerelement zu häuten, aber ich weiß nicht, wie das RadioButton auf diese Weise style/skin.

In WPF ich einfach eine neue Vorlage für meine RadioButton-Stil erstellen ... wie ich bereits erwähnt, vielleicht diese WPF beeinflusst die Erwartungen für JavaFX 2.0 sind meine Hürde.

Dank ...

Edit:

Scheint, wie es nicht möglich ist, eine andere Vorlage für bestehende Steuerelemente zu erstellen (?): JavaFX 2.0 render controls inside control

Also, was ist die beste Art und Weise zu implementieren mein RadioButton? Ich ärgere mich über die ToggleGroup ...

+0

Können Sie Bilder des ausgewählten und nicht ausgewählten Status einfügen? – jewelsea

+0

Möglich, aber nicht notwendig, da das Bild bei Nichtauswahl transparent und grau dargestellt wird. – thinkU

+0

Entschuldigung für Verwirrung, ich meinte Ortsbilder davon, wie die Knopfzustände in der Frage aussehen sollen, so dass es einfacher ist, eine Antwort zu formulieren, die Ihren Fall direkter löst. – jewelsea

Antwort

5

Es gibt zahlreiche Ansätze für Stil oder Vorlage JavaFX-Steuerelemente.

  1. Vorgefertigte JavaFX Kontrollen sind styleable über css.

  2. Vorgefertigte JavaFX-Steuerelemente können ebenfalls in Unterklassen unterteilt werden, um ihre Funktionalität und ihr Aussehen zu ändern. Ein example ist das IntField, das ein TextField erstellt, das nur zu dem Bearbeiten von Integer-Nummern angepasst wird.

  3. Oft können Sie benutzerdefinierte Komponenten erstellen, indem Sie eine Reihe vorhandener Steuerelemente in einem Layout Pane oder Group zusammenfügen. Durch die Parametrisierung der Methode oder Klasse, aus der die zusammengefasste Komponente besteht, können Sie die Konstruktion benutzerdefinierter Komponenten mithilfe von Code effektiv anpassen. Hier ist ein Beispiel von digital and analogue clock components gebaut mit einer solchen Methode (und styleable über CSS).

  4. Sie können das Layout einer benutzerdefinierten Komponente auch mithilfe verschiedener fxml-Dateien mithilfe des Ansatzes in introduction to fxml document verwalten. Die fxml könnte aus einer Templatsprache wie velocity generiert werden, oder ein paar verschiedene statische fxml-Dateien könnten für verschiedene Layouts geschrieben werden. Die statische oder generierte fxml kann auch dynamisch von einem Webserver geliefert werden, wie eine dynamisch generierte HTML-Site, falls nötig.

  5. Eine andere Möglichkeit, ein benutzerdefiniertes Steuerelement zu erstellen, ist die gleiche, wie es das JavaFX-Team tut (indem Skin und Behavior-Klassen für das Steuerelement erstellt werden). Ab JavaFX 2.2 (und vielleicht sogar in zukünftigen JavaFX-Versionen) ist dies am besten für Bibliotheks-Ersteller geeignet, die unter jfxtras arbeiten oder direkt zum open source control repository des JavaFX-Projekts beitragen.

  6. Beachten Sie auch, dass in CSS Sie eine Skinklasse für eine Kontrolle geben kann, zum Beispiel RadioButton- die folgende CSS hat:

 
    .radio-button { 
     -fx-skin: "com.sun.javafx.scene.control.skin.RadioButtonSkin"; 
    } 

also eine Möglichkeit, die RadioButton- aussehen wie anpassen Sie erwägen, ist:

  1. Schnappen Sie sich eine Kopie der RadioButtonSkin Klasse Quelle aus der Open-Source-Repository JavaFX ich früher verknüpft.
  2. Kopieren Sie es in einen neuen Klassennamen (z. B. LinedRadioButtonSkin).
  3. Ändern Sie es, um das gewünschte Aussehen zu erhalten.
  4. Erstellen Sie ein benutzerdefiniertes CSS-Stylesheet für Ihr Projekt.
  5. Legen Sie im benutzerdefinierten CSS-Stylesheet das -fx-skin-Attribut der .radio-button-Klasse fest, um Ihre neue LinedRadioButtonSkin-Klasse zu verwenden.

Solange Ihre neue Haut richtig umgesetzt wird und ähnlich wie an die bestehenden ButtonBehaviour Klasse verdrahtet, wie die bestehende RadioButtonSkin Klasse funktioniert, dann sollten Sie automatisch das gleiche Verhalten für die neue Haut auf Basis Optionsfeld als bestehenden Funk erhalten Tasten. Die Schaltfläche reagiert beispielsweise auf Mausklicks, Tastaturbeschleuniger, Berührungsereignisse, Interaktionen mit ToggleGroups usw., genau wie die vorhandene RadioButtonSkin, und kann über die vorhandene API RadioButton aufgerufen werden. Das heißt, die Schaltfläche behält das Gefühl (Verhalten) eines RadioButton bei, kann jedoch durch die Verwendung verschiedener interner Komponenten, des Layouts und des CSS-Stylings völlig anders aussehen.

Wenn Sie sich für die benutzerdefinierte Skin-Route entscheiden und Hilfe bei diesem Prozess benötigen, sollten Sie die Mitglieder des jfxtras-Teams kontaktieren und Ihre neue Skin an das jfxtras-Projekt spenden.

Caveat

Die Haut und das Verhalten Klassen in JavaFX 2.2 sind private Umsetzung apis, nicht öffentlich unterstützt apis und wird sich in Zukunft ändern, da sie für die nächste Hauptversion von JavaFX für die öffentliche api (geplant Übergang - JavaFX/JDK 8) - Wenn Sie diese heute verwenden, sollten Sie dies mit Vorsicht tun. Sobald sie auf öffentliche APIs übergehen, erwarte ich, dass Sie mehr Informationen und Anleitungen zum Erstellen eigener Steuerelemente mit diesen Klassen erhalten.

Die Paketnamen und API-Methoden werden als API geändert, um Ihre eigenen Steuerelemente aus Skin- und Behaviour-Übergängen von der internen privaten Implementierung zur öffentlichen API zu erstellen. Zum Beispiel könnte com.sun.javafx.scene.control.behavior.BehaviorBase zu javafx.scene.control.behavior.Behavior werden. Wenn Sie also eine Klasse erstellen, die BehaviorBase erweitert, wird sie erst dann gegen eine neue Version von JavaFX ausgeführt, wenn Sie die Quelle der Klasse so ändern, dass sie auf den neuen Namen und die API verweist und sie erneut kompiliert.

Aus diesem Grund gibt es keine guten Bücher zu diesem Thema, bis die API öffentlich und endgültig ist, weil jeder Beispielcode, den das Buch gegen die private API geschrieben hat, veraltet wäre, sobald api gemacht würde öffentlich und würde weder gegen die öffentliche API kompilieren noch gegen die neuere Version von JavaFX ausführen.

+0

Vielen Dank, Jewelsea! Alle Informationen, die ich wollte und die ich in zwei Büchern vermisste. (6) scheint wie die WPF-Vorlage zu sein, die ich verwendet habe. Ich werde versuchen (5) und (6) ... schon aufgeregt. PS .: Können Sie ein gutes Buch vorschlagen? P.P.S: Ich verstehe nicht, warum die privaten Implementierungs-APIs mit Vorsicht zu verwenden sind. – thinkU

+0

Aktualisierte Vorbehaltsinformationen zur Beantwortung Ihrer Fragen. – jewelsea