# Jslider Beschriftung



## Marcel_Handball (31. Mrz 2010)

Hi,

ich platziere mit dem GridBagLayout vier JSlider untereinander, die jeweils einen unterschiedlichen Wertebereich haben.
Ich möchte den minimalen und maximalen Wert beschriften lassen. Wenn ich dies allerdings folgendermaßen machen, verändert sich die Größe des Sliders:









```
k_slider = new JSlider(1000, 100000);
k_slider.setMajorTickSpacing(99000);
k_slider.setPaintLabels(true);
```

Gibt es eine Möglichkeit dies zu unterbinden?


----------



## Ebenius (1. Apr 2010)

Hier ein Würgaraund: 
	
	
	
	





```
/* (@)LabeledSliderTestGui.java */

/* Copyright 2010 Sebastian Haufe

 * Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
   You may obtain a copy of the License at

       [url]http://www.apache.org/licenses/LICENSE-2.0[/url]

 * Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an "AS IS" BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   See the License for the specific language governing permissions and
   limitations under the License. */

package com.ebenius;

import java.awt.Component;
import java.awt.GridLayout;
import java.util.Dictionary;
import java.util.Enumeration;

import javax.swing.*;
import javax.swing.border.Border;

public class LabeledSliderTestGui {

  @SuppressWarnings("unchecked")
  private static int calculateTrackIndent(JSlider slider) {
    int labelInset = 0;
    final Dictionary labelTable;
    if (slider.getPaintLabels()
          && slider.getOrientation() == JSlider.HORIZONTAL
          && (labelTable = slider.getLabelTable()) != null) {
      final Enumeration labels = labelTable.elements();
      final Component first =
            !labels.hasMoreElements() ? null : (Component) labels
                  .nextElement();
      Component last = first;
      while (labels.hasMoreElements()) {
        last = (Component) labels.nextElement();
      }
      final int firstWidth = first == null ? 0 : first.getWidth();
      final int lastWidth = last == null ? 0 : last.getWidth();
      labelInset = Math.max(firstWidth, lastWidth) / 2;
    }
    return labelInset;
  }

  private static int calculateMaximumTrackIndent(JSlider... sliders) {
    int result = 0;
    for (JSlider slider : sliders) {
      result = Math.max(result, calculateTrackIndent(slider));
    }

    return result;
  }

  private static void setIndentingBorders(JSlider... sliders) {
    final int maxIndent = calculateMaximumTrackIndent(sliders);
    for (JSlider slider : sliders) {
      final int myIndent = calculateTrackIndent(slider);
      final Border indentingBorder =
            BorderFactory.createEmptyBorder(0, maxIndent - myIndent, 0,
                  maxIndent - myIndent);
      final Border sliderBorder = slider.getBorder();
      if (sliderBorder != null) {
        slider.setBorder(BorderFactory.createCompoundBorder(indentingBorder,
              sliderBorder));
      } else {
        slider.setBorder(indentingBorder);
      }
    }
  }

  private static void createAndShowGui() {
    final JSlider slider = new JSlider(-10, 10, 0);
    slider.setMajorTickSpacing(10);
    slider.setPaintLabels(true);
    slider.setPaintTicks(true);
    slider.setPaintTrack(true);

    final JSlider slider2 = new JSlider(-10000, 10000, 0);
    slider2.setMajorTickSpacing(10000);
    slider2.setPaintLabels(true);
    slider2.setPaintTicks(true);
    slider2.setPaintTrack(true);

    setIndentingBorders(slider, slider2);

    final JPanel contentPane = new JPanel(new GridLayout(0, 1, 6, 6));
    contentPane.add(slider);
    contentPane.add(slider2);

    final JFrame f = new JFrame("Test Frame: LabeledSliderTestGui"); //$NON-NLS-1$
    f.setContentPane(contentPane);
    f.pack();
    f.setLocationRelativeTo(null);
    f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    f.setVisible(true);
  }

  public static void main(String[] args) {
    SwingUtilities.invokeLater(new Runnable() {

      public void run() {
        createAndShowGui();
      }
    });
  }
}
```
Ebenius


----------



## Marcel_Handball (1. Apr 2010)

Danke für das Beispiel !!


----------



## Ebenius (1. Apr 2010)

Man muss (vielleicht) dazu sagen, dass das gegen jedes Look and Feel sich da anders verhalten kann. Dieser Workaround funktioniert mit dem Metal L&F. Sollte eigentlich mit jedem BasicSliderUI-Derivat gehen, aber da kann ich mich auch täuschen. Also ordentlich testen! :-D

Happy Hacking!
Ebenius


----------



## Marco13 (1. Apr 2010)

Könnte man nicht einfach für alle Silder das gleiche PreferredSize setzen? ???:L


----------



## Ebenius (6. Apr 2010)

Marco, das Problem ist, dass die Sliders die Labels zentriert an ihren Tick setzen. Je länger der Text des ersten und letzten Labels, desto weiter wird der Abstand zwischen dem Rand des Tracks und dem Rand des JSliders. Die Breite der Sliders im Eingangsbeitrag ist exakt gleich. Der TO möchte aber, dass die *Tracks* genau gleich breit werden.

Ebenius


----------



## Marco13 (6. Apr 2010)

Ahso... Ich dachte es geht um die Höhe, aber stimmt: Dass die Breite sich ändert ist nicht so schön (auch wenn's mir nicht aufgefallen ist...)


----------

