Pimp my slider

Herr Kaiser

Bekanntes Mitglied
Hallo Forum,

ich beabsichtige, verschiedene Messwerte in einer Tabelle darzustellen. Neben der numerischen Anzeige sollen die Werte auch grafisch veranschaulicht werden. Dazu möchte ich JSlider einsetzen, ähnlich, wie es etwa in diesem Beispiel zu sehen ist:

A slider renderer for volume values in a table : Table Renderer EditorSwing JFCJava

Zusätzlich soll aber auch jeweils der Normbereich angezeigt werden, so dass visuell erkennbar ist, ob der jeweilige Wert in der Norm liegt, oder nicht.

Klasse wäre z. B., wenn der Normbereich über die Hintergrundfarbe des Sliders erkennbar wäre. Ich fantasiere mir da also etwa einen Slider, wie er in der angehängten Grafik zu sehen ist.

Jetzt bin ich als Anfänger sicher noch meilenweit von der Umsetzung entfernt und würde daher von euch ersteinmal nur wissen, ob man so eine Erweiterung des Sliders überhaupt bewerkstelligen kann (in welche Richtung müsste ich mich da weiter einlesen?) oder ob Ihr vielleicht eine andere Idee habt, auf welche Weise man den Normbereich in so einer Tabelle visualisieren könnte.

Danke schonmal! :)
 

Anhänge

  • slider.jpg
    slider.jpg
    6,2 KB · Aufrufe: 48

kirax

Bekanntes Mitglied
Nich getestet - aber du kannst den Hintergrund des JSlider mit einem Alphawert versehen, dadurch kannst du ihn transparent machen.
Hintendran kannst du dann z.B. Labels in der festgelegten Größe mit entsprechender Farbe rendern.
Problematisch wirds dann beim Größe ändern...
 

Herr Kaiser

Bekanntes Mitglied
Das klingt sehr gut! :)
Das heißt ich kann zwei Labels und den Slider übereinander in eine Tabellenzelle legen?
Dann versuche ich mal, herauszufinden, wie das geht (oder ist das schnell erklärt bzw. gibt es irgendwo genauere Infos darüber?) ...
 

Herr Kaiser

Bekanntes Mitglied
Ich muss gestehen, dass meine Kenntnisse noch nicht ausreichen, um ohne eure Hilfe weiter zu kommen.
Ich habe den Slider jetzt mit folgendem Renderer implementiert:

Java:
import java.awt.Component;
import java.io.Serializable;
import javax.swing.JSlider;
import javax.swing.JTable;
import javax.swing.table.TableCellRenderer;

public class SliderRenderer implements TableCellRenderer, Serializable {

    private JSlider delegate;

    public SliderRenderer(int lowerLimit, int upperLimit) {
        delegate = new JSlider(lowerLimit, upperLimit);
    }

    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
        if (value instanceof Integer) {
            delegate.setValue(((Integer) value).intValue());
        }
        delegate.setBackground((isSelected && !hasFocus)
                ? table.getSelectionBackground()
                : table.getBackground());
        return delegate;
    }
}

und so der betreffenden Tabellenspalte bekannt gemacht:

Java:
TableColumn col = tabelle.getColumnModel().getColumn(8);
col.setCellRenderer(new SliderRenderer(1, 99));

Nach ewigem suchen finde ich immer noch nicht die Stelle, an der ich gemäß dem oben genannten Tip das Panel mit den Hintergrund-Labels einfügen könnte. Hättet ihr da einen kleinen Hinweis für mich? ....

Danke schonmal! :)
 

Michael...

Top Contributor
Wenn die Farbgrenzen nicht so hart sein müssen, könnte man den Wertebereich mit einem GradientPaint hinterlegen.
Mit harten Farbgrenzen wird's schwierig die Werte richtig zu erwischen.
Java:
class CustomSlider extends JSlider {
	public CustomSlider(int min, int max, int value) {
		super(min, max, value);
		this.setOpaque(false);
		this.setPaintTicks(true);
		this.setPaintLabels(true);
		this.setMajorTickSpacing(10);
	}

	public void paintComponent(Graphics g) {
		int height = this.getHeight();
		int width = this.getWidth();
		Graphics2D g2d = (Graphics2D) g;
		GradientPaint gradient = new GradientPaint(0, 0, Color.RED, width/2, 0,
					Color.GREEN, true);
		g2d.setPaint(gradient);
		g.fillRect(0, 0, width, height);
		super.paintComponent(g);
	}
}
 

Herr Kaiser

Bekanntes Mitglied
Fantastisch!!!

Ich brauche zwar scharfe Grenzen und muss die auch individuell setzen können, aber das kann ich durch die fillRect-Methode ja exakt festlegen. Ich mache für den Normbereich einfach einen einfarbig grünen Balken, indem ich x und width setze und fertig!

Das war eine große Hilfe. Graphics2D war mir noch nicht bekannt. Werde mich mal weiter da rein vertiefen ...

1000 Dank! :)
 

Ähnliche Java Themen

Neue Themen


Oben