Java: hoe maak ik de showwaarde van JSpinner met wat offset

In mijn applicatie hebben sommige waarden intern hun bereik van 0. Maar de gebruiker zou dit bereik vanaf 1 moeten zien. Ik dacht dat het gepast zou zijn om deze offsetende dingen in de presentatie te plaatsen. In dit geval is het een JSpinner-component. Zodat ik in een contructor kon specificeren of er een offset is (niet alle waarden hebben het). Maar als ik getValue() van JSpinner of getValue() van het model negeer om zoiets te zijn (+1 is alleen voor test)

       public Object getValue() {
            Number value = (Number)super.getValue();
            Number newValue=value;
            if (value instanceof Double){
                newValue=value.doubleValue()+1;
            }
            else if (value instanceof Integer){
                newValue = value.intValue()+1;
            }
            return newValue;
        }

het gaat in een oneindige lus. Ik veronderstel dat het hier om een ​​of andere reden een staatsveranderingsevenement veroorzaakt. Roept getValue opnieuw op, verhoogt meer, activeert gebeurtenis, verhogingen enzovoort. Hoe kan dit worden opgelost? Bedankt

4

2 antwoord

Laat het gegevensmodel van uw programma en het nummermodel van de spinner niet vermengen; houd ze gescheiden. Delegeren naar een privé SpinnerNumberModel met het juiste presentatiebereik, 1 .. n . Geef een accessor die waarden in het gewenste bereik retourneert, 0 .. n -1.

Geef de methode getAdjustedValue() op, in feite getValue() - offset , die alle clients moeten gebruiken in plaats van getValue() ?

Ja. Het SpinnerModel dient de weergave JSpinner . Als het model van uw toepassing verschillende eenheden gebruikt, moet er een transformatie plaatsvinden. Je zult moeten beslissen waar dat het meest logisch is. Als een concreet voorbeeld, deze model 's ControlPanel heeft een spinner die een frequentie aanpast in Hz , terwijl de Timer van de toepassing een periode in milliseconden vereist.

4
toegevoegd
Ik heb hierboven uitgewerkt.
toegevoegd de auteur trashgod, de bron
Dus als er een offset is, geeft JSpinner waarde + offset door aan SpinnerNumberModel en levert methode getAdjustedValue die in feite getValue() is - offset , die alle clients moeten gebruiken in plaats van getValue ? Heb ik begrepen dat je correct bent?
toegevoegd de auteur Boris Mikhaylov, de bron
Bedankt, dat bracht me op de goede weg
toegevoegd de auteur Boris Mikhaylov, de bron

Ik denk dat CyclingSpinnerListModel kan doe dat

2
toegevoegd
@Boris Mikhaylov dat over het in oneindige lus gaat. , dan kun je dat in een bepaald bereik opnieuw invoeren
toegevoegd de auteur mKorbel, de bron
+1 Dit is een goed voorbeeld van een privé SpinnerModel , zoals voorgesteld hier .
toegevoegd de auteur trashgod, de bron
Kun je dat uitwerken? Ik zie niet hoe het helpt
toegevoegd de auteur Boris Mikhaylov, de bron
maar het hele punt is om de waarde slechts eenmaal te verhogen
toegevoegd de auteur Boris Mikhaylov, de bron