# beschriftung von JSlider



## Guest (2. Mrz 2008)

hallo, ich benutze einen JSlider, aber irgendwie gefällt mir das gar nicht so bzw. es macht nicht das, was ich will.

und zwar ist der im Moment so:


```
int min = 2;
                int max = 6;
                int init = min;
                JSlider playersTotal = new JSlider(min, max, init);
                playersTotal.setBounds(160, 60, 100, 20);
                playersTotal.setSnapToTicks(true);
                playersTotal.setPaintTrack(true);
```

also die erste Frage:

was genau macht das "setPaintTicks(true)", das ich hier* nicht *benutze, weil ich keinen Unterschied sehe ausser dass er mir die Grafik vom Regler (also dem großen Ding das festlegt wo man gerade in dem Slider ist) so halb wegschneidet ?

Und zweite Frage:

Wie mach ich das nun dass der User weiss welchen Wert das Teil nun hat? KAnn man nicht sowas in der Art machen:

|________________|
|     |     |     |    |    |   ....
0     1    2     3   4    5

oder so? Ich hatte ja gehofft dass dieses "setPaintTicks(true)" sowas in der Art macht, aber irgendwie passiert eben nix, sieht eher nach ner Art "Bug" aus wenn ich das aktiviere.

Wie würdet ihr das am hübschesten und schlausten lösen, dass der User weiss, welchen Wert jetzt der Slider grad hat?

Danke


----------



## Marco13 (2. Mrz 2008)

Die "Standard"-Beschriftung kann man mit setMajorTickSpacing/setMinorTickSpacing und setPaintLabels einschalten. setPaintTicks einzuschalten bewirkt bei dir vielleicht etwas, was nach einem Grafik-Bug aussieht, aber das liegt daran, dass der Slider dann merh Platz braucht, den du ihm bei deimem setBounds offenbar nicht zugestehst. setBounds macht übrigens nur bei einem null-Layout Sinn, was man sowieso nicht verwenden sollte. Warum? Weil man u.U. scheiß-viele Pixel-Angaben ändern muss, nur weil man bei irgendeinem Slider setPaintTicks einschaltet.... :roll:

http://java.sun.com/docs/books/tutorial/uiswing/components/slider.html


----------



## Guest (3. Mrz 2008)

hey,

ja das mit null-layout langweilt mich auch. allerdings kenne ich keine sinnvollen layouts. 
borderlayout is n quatsch wenn man nicht zufällig 4 himmelsrichtungen hat.

flowlayout ist zwar nett, presst die einzelnen elemente aber auch nebeneinander/untereinander ohne dass man 
den abstand einstellen kann (oder?)

und alle andren die ich bisher gesehen hab sind auch so superspeziell.

in meinem fall, wo 3 komponenten untereinander sein sollen, macht jedenfalls keins von denen sinn, höchstens das flowLayout was aber die o.g. schwächen hat.

bin aber gerne bereit zu lernen


----------



## The_S (3. Mrz 2008)

FlowLayout kannst du Hgap und Vgap setzen. GridLayout bietet sich an, wenn alle drei Komponenten untereinander die gleiche Größe haben sollen - auch hier kannst du den Abstand setzen. BorderLayout bietet sich auch an, da hat dann auch jede Komponente eine definierte Größe - außer die im Center. Und wenn dir das alles nicht reicht, verwende doch das GridBagLayout, oder wenns ein bisschen bequemer sein soll, ist auch das FormLayout von www.jgoodies.com oder das TableLayout zu empfehlen.


----------



## MiDniGG (3. Mrz 2008)

Pff FormLayout... Weißt doch was das immer für Probleme macht... ;-) (Naja zumindest bei mir)

Also ich plediere für das BorderLayout... Mach eig fast alles damit. Kann man ja beliebig oft verschachteln und mann muss ja nicht alle 4 Himmelsrichtungen besetzen 

Zu dem Slider. Da hab ichs das letzte Mal einfach so gemacht, dass ich den aktuellen Wert (Glaub mit nem MouseMotionListener, dass es sich gleich ändert) ausgelesen hab und ihn dann in en JLabel gepackt hab. Ging eig. ganz gut 

Also so:


```
public class Test extends JFrame implements MouseMotionListener
{
	private static final long serialVersionUID = 1L;
	
	private JPanel testpane = null; 
	
	private JSlider slide = null;
	
	private JLabel lab = null;
	
	public Test()
	{
		testpane = new JPanel(new BorderLayout());
		slide = new JSlider(0, 100, 50);
		lab = new JLabel(String.valueOf(slide.getValue()));
		
		testpane.add(slide, BorderLayout.CENTER);
		testpane.add(lab, BorderLayout.SOUTH);
		
		slide.addMouseMotionListener(this);
		
		setDefaultCloseOperation(EXIT_ON_CLOSE);
		
		setContentPane(testpane);
	}

	public void mouseDragged(MouseEvent evt)
	{
		lab.setText(String.valueOf(slide.getValue()));
	}

	public void mouseMoved(MouseEvent arg0){}
}
```

...mal so kurz hingekrizelt :-D


----------



## Guest (3. Mrz 2008)

nochmal wegen den Layouts:

Ich versuche gerade ein schönes Menü zu machen aber irgendwie sieht das alles dumm aus.

Es sollen jeweils 2 Komponenten in jede der drei untereinander liegenden Zeilen, also etwa so:

http://rapidshare.com/files/96762076/Screenshot.png.html

Auf dem Bild sieht man das FlowLayout, was mir aber gar nicht gefällt. z.B. beachte man mal dass der Slider weiter rechts geadded wird als das DropDownMenu, und der untere Slider viel weiter links. warum? ich habs sowohl mit "LEADInG" als auch "LEFT" versucht, aber es bleibt so. Das sieht doch mal super schlecht aus...

ausserdem ist der linke Fensterrand riesengroß und ich weiss nicht wie ich den ändere. Die Komponenten sollen ja den gleichen Abstand behalten, nur halt nicht so weit rechts anfangen..

Hier mal der Code (bei Ausführung kommt o.g. Fenster) :


```
class NewGameDialog extends JDialog {

    private JLabel mapsize,  numPlayers,  ratio;
    private JComboBox sizeDropDown;
    private JSlider numPlayersSlider,  ratioSlider;
    private int mapsizeValue,  numPlayersValue,  HumansValue,  CPUValue;

    public NewGameDialog(JFrame parent) {

        setTitle("Neues Spiel");
        setPreferredSize(new Dimension(250, 200));
        setResizable(false);
        setLayout(new FlowLayout(FlowLayout.LEADING,40,10));
        
        mapsize = new JLabel("Kartengröße");
        add(mapsize);
        String[] mapsizeOptions = {"Klein","Groß","Riesig"};
        sizeDropDown = new JComboBox(mapsizeOptions);
        add(sizeDropDown);

        numPlayers = new JLabel("Spieleranzahl");
        add(numPlayers);
        numPlayersSlider = new JSlider(2,6,2);
        numPlayersSlider.setPreferredSize(new Dimension(80,40));
        numPlayersSlider.setPaintLabels(true);
        numPlayersSlider.setSnapToTicks(true);
        numPlayersSlider.setMinorTickSpacing(1);
        numPlayersSlider.setMajorTickSpacing(1);
        add(numPlayersSlider);

        ratio = new JLabel("Verhältnis");
        add(ratio);
        ratioSlider = new JSlider(1,6,1);
        ratioSlider.setPreferredSize(new Dimension(80,40));
        add(ratioSlider);

        pack();
        setLocationRelativeTo(parent);
        setModal(true);
    }
}
```

BorderLayout verstehe ich gar nicht wie das gehen soll in meinem Beispiel.

Ich habs auch kurz mit GridBagLayout versucht, aber das ist irgendwie extrem kompliziert und schwer zu machen. 

Ich weiss nicht... Wie kann ich das besser machen, irgendwie sieht das Fenster doch grad super sch*** aus.
Weiss nicht so recht wie ich da ran gehen soll. So schwer kann das doch nicht sein, ist ja nur ei FEnster mit 6 Komponenten die eigentlich tabellarisch angeordnet sind. Wie macht ihr sowas?


----------



## Marco13 (3. Mrz 2008)

Eigentlich ist so eine Tabellarische Anordnung unterschiedlich großer(!!!) Comonents das einzige, wofür sich imho das GridBagLayout am besten eignet, obwohl...
http://madbean.com/anim/totallygridbag/
... ja.

Die Alternative zum GridBagLayout wäre in diesem Fall vielleicht sowas...

```
import java.awt.*;
import javax.swing.*;

class NewGameDialog extends JDialog {

    public static void main(String args[])
    {
        new NewGameDialog(null).setVisible(true);
    }

    private JLabel mapsize,  numPlayers,  ratio;
    private JComboBox sizeDropDown;
    private JSlider numPlayersSlider,  ratioSlider;
    private int mapsizeValue,  numPlayersValue,  HumansValue,  CPUValue;

    public NewGameDialog(JFrame parent) {

        setTitle("Neues Spiel");
        setLayout(new GridLayout(1,2));
        JPanel p0 = new JPanel(new GridLayout(3,1));
        JPanel p1 = new JPanel(new GridLayout(3,1));
        add(p0);
        add(p1);

        mapsize = new JLabel("Kartengröße");
        p0.add(mapsize);
        String[] mapsizeOptions = {"Klein","Groß","Riesig"};
        sizeDropDown = new JComboBox(mapsizeOptions);
        sizeDropDown.setPreferredSize(new Dimension(80,20));
        JPanel p = new JPanel(new FlowLayout(FlowLayout.CENTER,0,10));
        p.add(sizeDropDown);
        p1.add(p);

        numPlayers = new JLabel("Spieleranzahl");
        p0.add(numPlayers);
        numPlayersSlider = new JSlider(2,6,2);
        numPlayersSlider.setPreferredSize(new Dimension(80,40));
        numPlayersSlider.setPaintLabels(true);
        numPlayersSlider.setSnapToTicks(true);
        numPlayersSlider.setMinorTickSpacing(1);
        numPlayersSlider.setMajorTickSpacing(1);
        p1.add(numPlayersSlider);

        ratio = new JLabel("Verhältnis");
        p0.add(ratio);
        ratioSlider = new JSlider(1,6,1);
        ratioSlider.setPreferredSize(new Dimension(80,40));
        p1.add(ratioSlider);

        pack();
        setResizable(false);
        setLocationRelativeTo(parent);
        setModal(true);
    }
}
```
ist aber (aus bestimmten Gründen) IMHO nicht so schön.

Mit GridBagLayout wäre das dann sowas wie

```
import java.awt.*;
import javax.swing.*;

class NewGameDialog extends JDialog {

    public static void main(String args[])
    {
        new NewGameDialog(null).setVisible(true);
    }

    private JLabel mapsize,  numPlayers,  ratio;
    private JComboBox sizeDropDown;
    private JSlider numPlayersSlider,  ratioSlider;
    private int mapsizeValue,  numPlayersValue,  HumansValue,  CPUValue;

    public NewGameDialog(JFrame parent) {

        setTitle("Neues Spiel");
        setLayout(new GridBagLayout());

        mapsize = new JLabel("Kartengröße");
        String[] mapsizeOptions = {"Klein","Groß","Riesig"};
        sizeDropDown = new JComboBox(mapsizeOptions);
        sizeDropDown.setPreferredSize(new Dimension(80,20));
        addRow(this.getContentPane(), mapsize, sizeDropDown, 0);

        numPlayers = new JLabel("Spieleranzahl");
        numPlayersSlider = new JSlider(2,6,2);
        numPlayersSlider.setPreferredSize(new Dimension(80,40));
        numPlayersSlider.setPaintLabels(true);
        numPlayersSlider.setSnapToTicks(true);
        numPlayersSlider.setMinorTickSpacing(1);
        numPlayersSlider.setMajorTickSpacing(1);
        addRow(this.getContentPane(), numPlayers, numPlayersSlider, 1);

        ratio = new JLabel("Verhältnis");
        ratioSlider = new JSlider(1,6,1);
        ratioSlider.setPreferredSize(new Dimension(80,40));
        addRow(this.getContentPane(), ratio, ratioSlider, 2);

        pack();
        setResizable(false);
        setLocationRelativeTo(parent);
        setModal(true);
    }

    private static void addRow(Container container, Component a, Component b, int row)
    {
        GridBagConstraints constraints = new GridBagConstraints();
        constraints.fill = GridBagConstraints.BOTH;
        constraints.weighty = 1.0;
        constraints.insets = new Insets(1, 1, 1, 1);
        constraints.gridy = row;

        constraints.weightx = 0.0;
        constraints.gridx = 0;
        container.add(a, constraints);

        constraints.weightx = 1.0;
        constraints.gridx = 1;
        container.add(b, constraints);
    }
}
```


----------



## MiDniGG (4. Mrz 2008)

So habs etz mal im BorderLayout gemacht, nur dass es mal siehst ;-)


```
private JPanel main = null;
	private JPanel panel = null;
	private JPanel testpane1 = null; 
	private JPanel testpane2 = null; 
	private JPanel testpane3 = null; 
	private JPanel testpane4 = null; 
	
	private JSlider slide = null;
	private JSlider slider = null;
	
	private JComboBox cb = null;
	
	private JLabel lab = null;
	private JLabel labl = null;
	private JLabel label = null;
	
	public Test()
	{
		testpane1 = new JPanel(new BorderLayout());
		testpane2 = new JPanel(new BorderLayout());
		testpane3 = new JPanel(new BorderLayout());
		testpane4 = new JPanel(new BorderLayout());
		panel = new JPanel(new BorderLayout(50, 25));
		main = new JPanel(new BorderLayout(50, 25));
		slide = new JSlider(0, 50, 25);
		slider = new JSlider(0, 50, 25);
		
		String[] items = {"Klein", "Mittel", "Groß", "Riesig"};
		cb = new JComboBox(items);
		
		lab = new JLabel("Kartengröße");
		labl = new JLabel("Spieleranzahl");
		label = new JLabel("Verhältnis");
		
		panel.add(main, BorderLayout.CENTER);
		
		main.add(testpane1, BorderLayout.NORTH);
		main.add(testpane2, BorderLayout.CENTER);
		main.add(testpane3, BorderLayout.SOUTH);
		
		testpane1.add(testpane4, BorderLayout.EAST);
		testpane1.add(lab, BorderLayout.CENTER);
		testpane4.add(cb, BorderLayout.WEST);
		
		testpane2.add(slide, BorderLayout.EAST);
		testpane2.add(labl, BorderLayout.CENTER);
		
		testpane3.add(slider, BorderLayout.EAST);
		testpane3.add(label, BorderLayout.CENTER);
		
		//slide.addMouseMotionListener(this);
		
		setDefaultCloseOperation(EXIT_ON_CLOSE);
		
		setContentPane(panel);
	}
	
	public static void main(String[] args) throws Exception
	{
		Test t = new Test();
		
		t.pack();
		t.setLocationRelativeTo(null);
		t.setVisible(true);
	}
```


----------

