# Slider Wert anzeigen



## JimBeam (9. Mrz 2017)

Hallo,
ich habe ein kleines Interface mit Slidern. Nun will ich, weil man es sonst nicht gut erkennt, den Wert über der Maus anzeigen lassen. Ich habe bisher folgendes:

```
final JLabel label1 = new JLabel("Wert: ");
      
        label1.setBorder(LineBorder.createBlackLineBorder());
        label1.setOpaque(true);
        label1.setBackground(Color.orange);

        int maxSize = label1.getFontMetrics(label1.getFont()).stringWidth("Wert: " + Slider1.getMaximum() + " ");
      
        label1.setBounds(10, 20, maxSize, 20);
        label1.setVisible(false);     
      
        Slider1.addMouseMotionListener(new MouseAdapter()
        {
            @Override
            public void mouseDragged(MouseEvent e)
            {

                label1.setLocation(e.getX(), Slider1.getY() + Slider1.getHeight() + 1);
                label1.setText("Wert: " + Slider1.getValue());
                label1.setVisible(true);
            };
        });
        Slider1.addMouseListener(new MouseAdapter()
        {@Override
            public void mouseReleased(MouseEvent e)
            {
                label1.setVisible(false);
            }
        });
```


Es wird allerdings nichts angezeigt was kann ich tun.


----------



## krgewb (9. Mrz 2017)

Du kannst Tooltips verwenden. Bei mir war es so:

```
meinSlider.setToolTipText("Huhu");
```


----------



## Joose (10. Mrz 2017)

Code bitte in Code-Tags packen, danke!
[code=java] ... dein code ... [/code]


----------



## krgewb (10. Mrz 2017)

Es tut mir Leid. Ich hatte dich falsch verstanden.

Dieses Programm zeigt den Wert von dem Slider in einem JLabel an:


```
import java.awt.*;

import javax.swing.*;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;

public class MeinPanel extends JPanel {
   private static final long serialVersionUID = 1L;
   private MeinChangeListener mein_change_listener;
   private JLabel label_fuer_temperatur;

   // Konstruktor
   public MeinPanel() {

       mein_change_listener = new MeinChangeListener(this);

       JSlider slider_fuer_temperatur = new JSlider(-100, 100);

       // Kleiner Strich zwischen in langen Strichen in 10 Grad-Abständen
       slider_fuer_temperatur.setMinorTickSpacing(10);

       // Striche darstellen
       slider_fuer_temperatur.setPaintTicks(true);

       // Ziffern darstellen
       slider_fuer_temperatur.setPaintLabels(true);

       // Voreinstellung 0 Grad Celsuis
       slider_fuer_temperatur.setValue(0);

       // Langer Strich alle 50 Grad
       slider_fuer_temperatur.setMajorTickSpacing(50);

       // ChangeListener registrieren.
       slider_fuer_temperatur.addChangeListener(mein_change_listener);

       // JSlider haben keinen ActionCommand. Stattdessen kann man einen Namen
       // setzen.
       slider_fuer_temperatur.setName("slider_fuer_temperatur");

       this.add(slider_fuer_temperatur);

       label_fuer_temperatur = new JLabel("0");
       this.add(label_fuer_temperatur);

       this.setVisible(true);

   }

   // Text vom Label aendern
   public void setLabelText(int wert) {
       label_fuer_temperatur.setText("" + wert);
   }

}

/**
 * Der ChangeListener für den Slider.
 *
 */
class MeinChangeListener implements ChangeListener {

   MeinPanel dasPanel;

   // Konstruktor
   public MeinChangeListener(MeinPanel dasPanel) {
       this.dasPanel = dasPanel;
   }

   @Override
   public void stateChanged(ChangeEvent e) {

       JSlider slider = (JSlider) e.getSource();

       int wert = slider.getValue();

       if (slider.getName().equals("slider_fuer_temperatur")) {
           dasPanel.setLabelText(wert);
       }

   }

}

class Hauptprogramm {

   public static void main(String[] args) {

       JFrame frame = new JFrame();
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
       frame.setSize(new Dimension(800, 400));
       frame.setTitle("Test");
       frame.setLayout(new BorderLayout());

       MeinPanel panel = new MeinPanel();
       frame.setContentPane(panel);
       frame.setVisible(true);

   }

}
```


----------



## Flown (10. Mrz 2017)

@krgewb Warum erbt dein MeinPanel von JPanel?


----------



## krgewb (10. Mrz 2017)

Weil du mir das Erben von JFrame nicht erlaubst.


----------



## Thallius (10. Mrz 2017)

Dann hast du aber noch nicht verstanden warum er Dir das verbietet. Das trifft nämlich auf JPanel in dem Fall genauso zu wie auf jede andere Klasse die es gibt ebenfalls 

Man erbt nur wenn man die Klasse erweitert oder in ihrer Funktionalität verändert. Nicht wenn man sie einfach nur benutzt. Dein MeinPanel könnte genauso gut ein Instanzvariable JPanel haben die du benutzt.

Gruß

Claus


----------



## krgewb (10. Mrz 2017)

Achso!
Wie müsste dann der Code aussehen?


----------



## krgewb (10. Mrz 2017)

Wenn ich es so mache kommt ein Fehlermeldung.

```
import java.awt.*;

import javax.swing.*;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;

public class Hauptprogramm {
    private static MeinChangeListener mein_change_listener;
    private static JLabel label_fuer_temperatur;

    public static void main(String[] args) {

        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(new Dimension(800, 400));
        frame.setTitle("Test");
        frame.setLayout(new BorderLayout());

        JPanel panel = new JPanel();
        frame.setContentPane(panel);
        frame.setVisible(true);

        mein_change_listener = new MeinChangeListener(this);

        JSlider slider_fuer_temperatur = new JSlider(-100, 100);

        // Kleiner Strich zwischen in langen Strichen in 10 Grad-Abständen
        slider_fuer_temperatur.setMinorTickSpacing(10);

        // Striche darstellen
        slider_fuer_temperatur.setPaintTicks(true);

        // Ziffern darstellen
        slider_fuer_temperatur.setPaintLabels(true);

        // Voreinstellung 0 Grad Celsuis
        slider_fuer_temperatur.setValue(0);

        // Langer Strich alle 50 Grad
        slider_fuer_temperatur.setMajorTickSpacing(50);

        // ChangeListener registrieren.
        slider_fuer_temperatur.addChangeListener(mein_change_listener);

        // JSlider haben keinen ActionCommand. Stattdessen kann man einen Namen
        // setzen.
        slider_fuer_temperatur.setName("slider_fuer_temperatur");

        panel.add(slider_fuer_temperatur);

        label_fuer_temperatur = new JLabel("0");
        panel.add(label_fuer_temperatur);

        frame.setVisible(true);
    }

    // Text vom Label aendern
    public void setLabelText(int wert) {
        label_fuer_temperatur.setText("" + wert);
    }

}

/**
 * Der ChangeListener für den Slider.
 *
 */
class MeinChangeListener implements ChangeListener {

    Hauptprogramm haupt;

    // Konstruktor
    public MeinChangeListener(Hauptprogramm haupt) {
        this.haupt = haupt;
    }

    @Override
    public void stateChanged(ChangeEvent e) {

        JSlider slider = (JSlider) e.getSource();

        int wert = slider.getValue();

        if (slider.getName().equals("slider_fuer_temperatur")) {
            haupt.setLabelText(wert);
        }

    }

}
```

Der Fehler ist in der Zeile

```
mein_change_listener = new MeinChangeListener(this);
```
Das Wort *this *ist rot unterstrichen. Die Meldung lautet: Cannot use this in a static context


----------



## JStein52 (11. Mrz 2017)

Weil jetzt plötzlich mein_change_listener static ist. Und wenn wir schon beim erlauben und verbieten sind:
meinChangeListener wäre der bessere Name dafür.


----------



## Thallius (11. Mrz 2017)

JStein52 hat gesagt.:


> Weil jetzt plötzlich mein_change_listener static ist. Und wenn wir schon beim erlauben und verbieten sind:
> meinChangeListener wäre der bessere Name dafür.



Ja um das grausame Denglisch zu verperfektionieren...

Wie kann man nur? Bitte Bitte wenigstens da dann myChangeListener oder MeinVeränderungsZuhoerer *grusel*

Claus


----------



## JStein52 (11. Mrz 2017)

Thallius hat gesagt.:


> MeinVeränderungsZuhoerer


Da sind gleich zwei Fehler drin:  meinVeraenderungsZuhoerer !


----------



## Thallius (11. Mrz 2017)

JStein52 hat gesagt.:


> Da sind gleich zwei Fehler drin:  meinVeraenderungsZuhoerer !



Ich konnte halt einfach nicht hinsehen beim schreiben sonst hätte ich direkt gek...


----------



## Xyz1 (11. Mrz 2017)

Hier ist mal ein (für @Flown negatives) Beispiel, was man alles mit JSlider anstellen kann:

```
import java.awt.GridLayout;
import java.awt.event.InputEvent;
import java.awt.event.KeyEvent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JSlider;
import javax.swing.ToolTipManager;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;

public class JSLDemo extends JFrame implements ChangeListener {

    public static void main(String[] args) {
        JSLDemo jslDemo = new JSLDemo();
    }

    private JSlider[] jss = {
        new JSlider(JSlider.HORIZONTAL, -30, +30, +0),
        new JSlider(JSlider.HORIZONTAL, -30, +30, +0)};
    private JLabel jl = new JLabel("", JLabel.CENTER);

    public JSLDemo() {
        setTitle("JSLDemo");
        setLayout(new GridLayout(3, 1));
        for (JSlider js : jss) {
            js.setMajorTickSpacing(10);
            js.setMinorTickSpacing(1);
            js.setPaintLabels(true);
            js.setPaintTicks(true);
            js.setPaintTrack(true);
            add(js);
        }
        add(jl);

        jss[0].addChangeListener(this);
        ToolTipManager.sharedInstance().setInitialDelay(0);

        pack();
        setSize(800, 168);
        setDefaultCloseOperation(2);
        setVisible(true);
    }

    @Override
    public void stateChanged(ChangeEvent e) {
        JSlider source = (JSlider) e.getSource();
        if (!source.getValueIsAdjusting()) {
            jl.setText("Temperatur ist: " + source.getValue());
            jss[1].setValue(-source.getValue());
        } else {
            source.setToolTipText(source.getValue() + " °C");
//            KeyEvent ke = new KeyEvent(source, KeyEvent.KEY_PRESSED,
//                    System.currentTimeMillis(), InputEvent.CTRL_MASK,
//                    KeyEvent.VK_F1, KeyEvent.CHAR_UNDEFINED);
//            source.dispatchEvent(ke);
        }
    }
}
```

 

Ich hab nachgeschaut, die einzige Möglichkeit, Tooltip immer sichtbar zu machen, ist: das Delay zu ändern und/oder ein KeyEvent auszulösen. Beides nicht so toll.

Was hattest du eigentlich mal vor?


----------



## Flown (12. Mrz 2017)

@DerWissende Wenn du weißt, dass es ein Negativbeispiel ist, warum postest du es dann nicht richtig?


----------



## krgewb (15. Mrz 2017)

@JimBeam Bist du noch da oder bist du jetzt komplett verwirrt? :-D
Damit wir auf dich eingehen können benötigen wir eine Rückmeldung von dir.


----------

