Frage

Ich habe ein nerviges Problem, wenn ich anrufe Jslider#setLabeltable mit beschreibenden Beschriftungen. Das Problem ist, dass die Strecke (die normalerweise mit der Breite der Schieberegler von einer Seite zu Seite geht) aufgrund der Länge der Etiketten verengt wird.

Standardmäßig sieht der Schieberegler aus:

##############################################
|    |    |    |    |    |    |    |    |    |

Aber mit benutzerdefinierten Beschriftungen sieht es so aus:

     ############################
     |  |  |  |  |  |  |  |  |  |
Low priority     High priority (Quick delivery)

Aber ich möchte so etwas:

##############################################
|    |    |    |    |    |    |    |    |    |
Low priority                                 High priority (Quick delivery)

Weiß jemand, ob dies möglich ist? Ich fürchte, das beinhaltet Basicsliderui Dies ist leider keine Option, da die Anwendung mehrere L & Fs unterstützt.

Hier ist ein SSCCE mein Problem zeigen:

import java.awt.BorderLayout;
import java.awt.Rectangle;
import java.util.Dictionary;
import java.util.Hashtable;

import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JSlider;
import javax.swing.SwingUtilities;

public class JSliderLabelTableProblem
{
    public JSliderLabelTableProblem()
    {
        JFrame frame = new JFrame();
        frame.setLayout(new BorderLayout());
        frame.setBounds(new Rectangle(200, 200, 400, 200));
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(createNormalSlider(), BorderLayout.NORTH);
        frame.add(createSliderWithLabels(), BorderLayout.SOUTH);
        frame.setVisible(true);
    }

    private JSlider createNormalSlider()
    {
        JSlider slider = new JSlider();
        slider.setMinimum(1);
        slider.setMaximum(10);
        slider.setMajorTickSpacing(1);
        slider.setSnapToTicks(true);
        slider.setPaintTicks(true);
        slider.setPaintLabels(true);
        return slider;
    }

    private JSlider createSliderWithLabels()
    {
        JSlider slider = createNormalSlider();
        Dictionary<Integer, JComponent> labels = new Hashtable<Integer, JComponent>();
        labels.put(1, new JLabel("Low priority"));
        labels.put(10, new JLabel("High priority (Quick delivery)"));
        slider.setLabelTable(labels);
        return slider;
    }

    public static void main(String[] args)
    {
        SwingUtilities.invokeLater(new Runnable()
        {
            @Override
            public void run()
            {
                new JSliderLabelTableProblem();
            }
        });
    }
}
War es hilfreich?

Lösung

Wie du kannst Verwenden Sie HTML in Schwungkomponenten, Sie könnten versuchen, die Etiketten so zu wickeln, dass sie besser passen.

labels.put(1, new JLabel("<html>Low<br>priority</html>"));
labels.put(10, new JLabel("<html>High priority<br>(Quick delivery)</html>"));

Addendum: Sie können auch versuchen, die horizontale Ausrichtung des Etiketts zu ändern.

Addendum: Ein anderer Ansatz könnte darin bestehen, kurze Etiketten auf dem Schieberegler selbst zu verwenden und eine erklärende Legende in der Nähe hinzuzufügen. Wenn Sie eine benutzerdefinierte Komponente übernehmen müssen, habe ich Kirill Grouchnikovs gefunden So schreiben Sie eine benutzerdefinierte Swing -Komponente hilfreich.

Andere Tipps

Ich denke, Sie müssen Ihre eigene Version von Jslider und Override -Methode erstellen
public Hashtable createStandardLabels( int increment, int start )
Wo speziell diese Zeile für Änderungen bereit ist
put( new Integer ( labelIndex ), new LabelUIResource( ""+labelIndex, JLabel.CENTER ) );

nach Code gefunden bei:
http://kickjava.com/src/javax/swing/jslider.java.htm

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top