RangeSlider

Hallo zusammen. Hier gleich mal etwas Input für den (leider wieder) neuen Java-Bereich:

Ich programmiere gerade eine Oberfläche, in der der User unter anderem einen bestimmten Bereich für verschiedene Kriterien (hier: Drehzahlbereich, Leistung, etc.). Das ganze wollte ich mit einem JSlider mit 2 Thumbs verwirklichen. Nach ewigem Gesuche (Java-Forum ist ja weg :frowning: ) habe ich RangeSlider, MultiSlider (von GeoVISTA), den JXMultiThumbSlider (SwingX) und wahrscheinlich noch 3 andere Sachen gefunden. Aber nichts will irgendwie richtig funktionieren (oder überhaupt).

  1. Kennt jemand das Problem und eine geeignete Möglichkeit das zu lösen (oder eine schönere)?

  2. Der oben erwähnte MultiSlider funktioniert zwar, die Anzeige ist aber unschön: Er besteht aus zwei Klassen, dem MultiSlider und der MultiSliderUI. Letztere beinhaltet die Methode „paintTrack“, die den ausgewählten Bereich markiert. Allerdings zeichnet diese wie die im JSlider vorhandene Methode immer die Strecke von 0 bis zum ausgewählten Thumb.
    Ich möchte dazu hier erstmal nicht alles mit Code vollspammen, wenn ihr den hättet schreibe ich ihn noch rein.

  3. Den JXMultThumbSlider kann ich nicht initialisieren. Ich habe es (minimal, damit ich ihn mal sehe) mit

JXMultiThumbSlider<?> slider2 = new JXMultiThumbSlider<Object>();
	      	slider2.setBounds(50, 250, 400, 100);	      	
	      	add(slider2);

versucht, allerdings zeigt mir meine GUI damit nichts an (einen normalen JSlider oder MultiSlider aber schon). Die Dokumentation zu dieser Klasse ist z.Z. nicht zugänglich und es gibt eigentlich sonst keine Informationen dazu.

Ich hoffe jemand kennt sich damit aus, auch wenn ein Teil der Community fehlt.

Den RangeSlider hatte ich irgendwann mal in einem Projekt verwendet. An Probleme damit kann ich mich nicht erinnern. Das UI hatte ich geringfügig abgeändert, aber davon abgesehen fand ich das Teil tadellos. Woran scheitert es denn bei dir? Läuft wenigstens der Demo-Sourcecode von der oben verlinkten Seite?

Genau diesen RangeSlider hatte ich schon. der funktioniert auch, allerdings habe ich es leider nicht weit genug gebracht ihn an das MetalLookAndFeel anzupassen. Habe ich da eine einfach Möglichkeit übersehen?

Ich meine in irgendeinem Beitrag auch mal gelesen zu haben dass der sich eben nicht anpassen ließe und deshalb andere Vorschläge gesucht. Lasse mich aber gerne eines besseren belehren :slight_smile:

Meine Anpassungen waren nur sehr rudimentär, hatte lediglich die runden Buttons durch eine andere Form ersetzt und dabei gar nicht auf irgendein LAF geachtet… Falls dich das weiterbringt schaue ich mal ob ich den Quellcode dazu noch ergoogeln kann (hab das Projekt selber nicht mehr auf der Platte, der Screenshot stammte aus einem alten Zwischenbericht).
An welche Anpassungen dachtest du denn?

Wie wärs mit: JXMultiThumbSlider<Integer> slider2 = new JXMultiThumbSlider<Integer>();

Denn Quellcode kann man direkt auf der Seite runterladen. Habe mir die zugehörige UI nochmal angeschaut und gemerkt, dass man doch einiges Verändern kann. Jetzt muss ich halt rumsuchen wo welche Farbe gesetzt wird, dann könnte das aber schon so aussehen wie es soll :slight_smile:

Probleme könnte ich da aber vielleicht mit der Form und dem TickSpacing kriegen.

Wegen der Form…Da gefällt mir das was du hast echt klasse. Wie krieg ich die denn hin? Mit graphics2D zeichne ich eigentlich nie was. Oder hast du das anders gemacht?

Ansonsten melde ich mich wieder wenn es funktioniert (oder auch nicht :open_mouth: )
Danke schonmal Dow_Jones, für weitere Anregungen bin ich natürlich immer offen :slight_smile:

@bERt0r : Leider immer noch ein leeres Feld an der Stelle an der er auftauchen sollte. Der Platz wird aber verbraucht (sehe es am Box-Layout).

Die Methode createThumpShape habe ich durch zwei Methoden ersetzt (für oberen und unteren Thump). Die sehen schlicht so aus:

    private Shape createLowerThumbShape(int width, int height) {
        if( slider.getOrientation() == JSlider.HORIZONTAL ) {
            // horizontal
            int[] x = { 0, (int)(width*0.6), width, (int)(width*0.6), 0 };
            int[] y = { 0, 0, height/2, height, height };
            Polygon shape = new Polygon( x, y, 5);
            return shape;
        } else {
            // vertical
            int[] x = { 0, width, width, width/2, 0 };
            int[] y = { height, height, (int)(height*0.4), 0, (int)(height*0.4) };
            Polygon shape = new Polygon( x, y, 5);
            return shape;
        }
    }

In den Methoden paint…Thumb hab ich als Farben getHighlightColor() und getShadowColor() verwendet. Das geht sicher besser… In paintTrack und RangeTrackListener hatte ich dann noch dafür gesorgt das die Deaktivierung (slider.isEnabled()) entsprechend visualisiert wird. Das war auch schon alles. Viel Erfolg! :slight_smile:

So ich habs jetzt hingekriegt, ganz zufrieden bin ich aber nicht.

Ich habe mich nun doch mit dem RangeSlider des JIDE-CommonLayer begnügt. Dieser passt besser in das LookAndFeel meiner Oberfläche.

Den obigen RangeSlider konnte ich leider farblich nicht so anpassen wie ich es wollte:
Beim Drag&Drop der Thumbs (mit MetalLookAndFeel) wurden diese nicht mehr schnell genug gezeichnet
Die TrackFarbe hat auch nicht richtig geklappt

Was mich jetzt noch stört ist nur noch (wie ganz am Anfang schon) dass die Track immer von 0 bis zum niedrigeren Thumb gefüllt wird und nicht zwischen den beiden Thumbs. Das kann ich vielleich noch ändern, jetzt kümmere ich mich erstmal um den Rest.

Ich danke nochmal für die Hilfe.