Archiv verlassen und diese Seite im Standarddesign anzeigen : JSpinner: Wert vor dem Anzeigen ggf. umrechnen
Hallo,
Ich hab ein Problem mit dem JSpinner:
Ich möchte einen Spinner erzeugen, der je nach Rückgabewert einer Methode den angezeigten Wert ändert, getValue() soll jedoch davon unbeeinflusst bleiben (getValue() soll immer mg/dl als Integer zurückgeben)
Die spezifischen Einheiten, die angezeigt weden sollen, sind mg/dl und mmol/l, wobei 1 mg/dl = 0.0555 mmol/l entsprechen.
Ich hab schon recht lange dran gesessen, aber nicht hinbekommen, was nicht eine Endlosrekursion oder eine ClassCastException geschmissen hätte...
Ich hoffe, meine Problemstellung ist verständlich.
Kannst du nicht einfach den aktuellen Wert auslesen, neue Achse setzen, Wert umrechnen und anzeigen? Du musst dir dann halt irgendwo merken, welche Achse aktuell gerade angezeigt wird :D
MfG Bischi
Hab ich auch schon versucht, aber das sieht irgendwie recht komisch aus.
Ich hatte dabei zwei Spinner erstellt und je nach Einstellung per add und remove im JPanel ausgetauscht, aber dabei verschieben sich die Spinner irgendwie nach unten, was im Zusammenhang mit den Labels recht unschön wirkt.
Ansonsten, wenn du einen Vorschlag hast, wie sich das Problem mit dem Verschieben lösen lässt, gerne her damit :).
Also, ich habs dann doch mal so gelöst.
Aber das Problem mit dem Verschieben ist trotz der Nutzung von JViewport noch da. Also noch immer die Frage: Wie lässt sich das lösen?
static final public class BGChooser
extends JViewport
{
final private JSpinner mg_per_dl, mmol_per_l;
BGChooser(int defaultValue, int min, int max)
{
mg_per_dl = new JSpinner(new SpinnerNumberModel(defaultValue, min, max, 10));
mmol_per_l = new JSpinner(new SpinnerNumberModel(defaultValue * 0.0555d, min * 0.0555d, max * 0.0555d, 0.1d));
setView(Settings.use_mg_per_dl() ? mg_per_dl : mmol_per_l);
}
void updateView()
{
if (Settings.use_mg_per_dl())
{
mg_per_dl.setValue((int)(((Number)mmol_per_l.getVa lue()).doubleValue() / 0.0555d));
setView(mg_per_dl);
}
else
{
mmol_per_l.setValue(((Number)mg_per_dl.getValue()) .doubleValue() * 0.0555d);
setView(mmol_per_l);
}
}
public int getValue()
{
if (Settings.use_mg_per_dl())
return ((Number)mg_per_dl.getValue()).intValue();
return (int)(((Number)mmol_per_l.getValue()).doubleValue( ) / 0.0555d);
}
public void setValue(int value)
{
if (Settings.use_mg_per_dl())
mg_per_dl.setValue(value);
else
mmol_per_l.setValue(value * 0.0555d);
}
}
Hier noch Setting.set_use_mg_per_dl(), zwecks Aufruf von updateView():
static void set_use_mg_per_dl(boolean use_mg_per_dl)
{
if (mg_per_dl != use_mg_per_dl)
{
mg_per_dl = use_mg_per_dl;
Utilities.updateBGChoosers();
}
}
Jetzt weiß ich, wo das Problem liegt: GroupLayout zickt da rum...
Ich nutz jetzt GridLayout, Problem beseitigt.
Aber trotzdem danke!
Aber trotzdem danke!
Gern geschehen :D
Bischi
Powered by vBulletin® Version 4.2.5 Copyright ©2025 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.