beschriftung von JSlider

Status
Nicht offen für weitere Antworten.
G

Guest

Gast
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:

Code:
                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

Top Contributor
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
 
G

Guest

Gast
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

Top Contributor
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.
 
M

MiDniGG

Gast
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:

Code:
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
 
G

Guest

Gast
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) :

Code:
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

Top Contributor
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...
Code:
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
Code:
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);
    }
}
 
M

MiDniGG

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

Code:
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);
	}
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
M Jslider Beschriftung AWT, Swing, JavaFX & SWT 6
L JSlider Beschriftung AWT, Swing, JavaFX & SWT 1
CptK Point2D.Double Kurven - Beschriftung und richtiges Anklicken AWT, Swing, JavaFX & SWT 7
T JButton Beschriftung AWT, Swing, JavaFX & SWT 12
Z kleine JButtons und ihre Beschriftung AWT, Swing, JavaFX & SWT 5
R TitledBorder: Beschriftung am senkrechten Rand AWT, Swing, JavaFX & SWT 3
J Menü beschriftung wird nicht verändert AWT, Swing, JavaFX & SWT 7
S Beschriftung von Buttons AWT, Swing, JavaFX & SWT 9
G Sehr kleine JButtons mit Icon oder Beschriftung AWT, Swing, JavaFX & SWT 2
T JTree: Beschriftung der Zellen AWT, Swing, JavaFX & SWT 3
J Beschriftung vom JButton per UIManager ändern AWT, Swing, JavaFX & SWT 2
P JButton 20x20 Beschriftung AWT, Swing, JavaFX & SWT 2
F mehrzeilige Button-Beschriftung AWT, Swing, JavaFX & SWT 5
S List mit mehrfarbiger Beschriftung AWT, Swing, JavaFX & SWT 2
E Frage zum Schieberegler JSlider AWT, Swing, JavaFX & SWT 5
T Java: Zwei abhängige JSlider machen nicht das, was sie sollen AWT, Swing, JavaFX & SWT 4
D Swing JSlider Tip Anzahl AWT, Swing, JavaFX & SWT 3
J JSlider sichtbar AWT, Swing, JavaFX & SWT 7
J Swing JSlider - Form des Reglers AWT, Swing, JavaFX & SWT 6
J JSlider Color Ticks AWT, Swing, JavaFX & SWT 1
J JSlider - MajorTick AWT, Swing, JavaFX & SWT 0
Z JSlider im Modalen-Fenster AWT, Swing, JavaFX & SWT 0
A Swing JLabel/JTextField Inhalt mit JSlider verändern AWT, Swing, JavaFX & SWT 12
A Swing 2 JSlider verknüpfen und mit einem JTextField vergleichen, dann Ausgabe AWT, Swing, JavaFX & SWT 5
A Slider (JSlider?) AWT, Swing, JavaFX & SWT 7
D JSlider "laggt" nach überschreiben der paint methode AWT, Swing, JavaFX & SWT 2
A Swing JSlider erscheint doppelt AWT, Swing, JavaFX & SWT 2
K 2D-Grafik Kontrastanpassung über einen JSlider AWT, Swing, JavaFX & SWT 2
A Swing Bestimmte Werte anzeigen JSlider() AWT, Swing, JavaFX & SWT 2
Y Mehrere JSlider verlinken AWT, Swing, JavaFX & SWT 6
M JSlider-Wert ändern, ohne ein ChangeEvent auszulösen AWT, Swing, JavaFX & SWT 4
C Aussehen von JSlider ändern AWT, Swing, JavaFX & SWT 7
D Swing jSlider soll selber weiterwandern, je nach zeit der musik AWT, Swing, JavaFX & SWT 5
D JSlider und Textfeld AWT, Swing, JavaFX & SWT 2
C Swing Tickspacing in JSlider AWT, Swing, JavaFX & SWT 3
C Swing Mehrere JSlider sollen aufeinander reagieren AWT, Swing, JavaFX & SWT 4
Y JSlider Wert auslesen (Kategorien) AWT, Swing, JavaFX & SWT 2
T jSlider-Value als Float in jLabel ausgeben AWT, Swing, JavaFX & SWT 2
O Swing JSlider mit doppelter Value AWT, Swing, JavaFX & SWT 6
F JSlider Design ändern AWT, Swing, JavaFX & SWT 6
D Swing JSlider AWT, Swing, JavaFX & SWT 11
B JSlider - Wert am Mouszeiger anzeigen lassen AWT, Swing, JavaFX & SWT 6
E JSlider synchron halten AWT, Swing, JavaFX & SWT 4
J Swing jSlider nur auf bestimmte werte beschränken AWT, Swing, JavaFX & SWT 15
X Audio Player: Fenster mit Play/Stop-Button erstellen, mit JSlider Lautstärke ändern AWT, Swing, JavaFX & SWT 6
R JSlider AWT, Swing, JavaFX & SWT 9
M Swing JSlider, Popup-Box AWT, Swing, JavaFX & SWT 3
J JSlider mit Double Werten AWT, Swing, JavaFX & SWT 5
J JSlider auf JTextPane? AWT, Swing, JavaFX & SWT 2
R JLabel und JSlider dynamisch erzeugen? AWT, Swing, JavaFX & SWT 3
E jSlider und ChangeListener AWT, Swing, JavaFX & SWT 2
S JSlider Track Breite und Farbe AWT, Swing, JavaFX & SWT 2
T Swing JSlider und Adjustment-Listener wollen nicht so recht AWT, Swing, JavaFX & SWT 2
O JSlider - wie unterscheide ich mit Maus verändert und durch setValue verändert. AWT, Swing, JavaFX & SWT 16
T JSlider: ChangeListener löst dreimal aus? AWT, Swing, JavaFX & SWT 4
B JSlider in JCombobox AWT, Swing, JavaFX & SWT 9
J JSlider wird nicht neugezeichnet AWT, Swing, JavaFX & SWT 8
J Einen JSlider ähnlich wie in OO3 AWT, Swing, JavaFX & SWT 5
G JSlider in Applet AWT, Swing, JavaFX & SWT 4
K Unterschiedliches Aussehen der JSlider? AWT, Swing, JavaFX & SWT 4
I Listener für einen JSlider AWT, Swing, JavaFX & SWT 1
H JSlider mit 2 Werten AWT, Swing, JavaFX & SWT 7
A JSlider umdrehen AWT, Swing, JavaFX & SWT 15
D JSlider und JMF player verbinden AWT, Swing, JavaFX & SWT 6
J JSlider regaiert unter Java 1.6 nicht mehr AWT, Swing, JavaFX & SWT 7
N JSlider: Kosmetik - snapToTicks AWT, Swing, JavaFX & SWT 3
T JComponents abändern/modifizieren z.b. JSlider AWT, Swing, JavaFX & SWT 2
N Nicht linearer JSlider! AWT, Swing, JavaFX & SWT 4
T JSlider getValue() erst nach dem Loslassen des Mauszeigers AWT, Swing, JavaFX & SWT 3
Z JSlider-Knob wenden AWT, Swing, JavaFX & SWT 8
L JSlider stumm geworden? AWT, Swing, JavaFX & SWT 2
I JSlider - klick ignorieren AWT, Swing, JavaFX & SWT 4
I JSlider-Schieberegler AWT, Swing, JavaFX & SWT 7
T JSlider Schiebereglerbild ändern AWT, Swing, JavaFX & SWT 4
U JSlider - Probleme bei der Darstellung AWT, Swing, JavaFX & SWT 3
H ChangeListener für JSlider AWT, Swing, JavaFX & SWT 6
P JSlider automatisch bewegen AWT, Swing, JavaFX & SWT 3
G JSlider AWT, Swing, JavaFX & SWT 2

Ähnliche Java Themen

Neue Themen


Oben