JSlider

Revangelis

Mitglied
Servus.
Ich habe ein kleines Problem mit meinem JSlider. Ich will ein einfaches JSlider mit 5 Major Ticks (1/4, 1/2, 1, 2, 4) erzeugen. Hier ist meine Code:

Java:
	    final int MIN = 1/4;
	    final int MAX = 4;
	    final int INIT = 1;   
	       
	    JSlider Samplerate = new JSlider(JSlider.HORIZONTAL, MIN, MAX, INIT);; 
	    Samplerate.setMaximum(4); 
	    Samplerate.setMinimum(4/16); 

            Hashtable<Integer, JLabel> labelTable = new Hashtable<Integer, JLabel>();
	    
	    labelTable.put( MAX/16, new JLabel("1/4") );
	    labelTable.put( MAX/8, new JLabel("1/2") );
	    labelTable.put( MAX/4, new JLabel("1") );
	    labelTable.put( MAX/2, new JLabel("2") );
	    labelTable.put( MAX, new JLabel("4") );
	    Samplerate.setLabelTable( labelTable );
	    Samplerate.setPaintLabels(true);
	    Samplerate.setMajorTickSpacing(MAX/4); 
	    Samplerate.setPaintTicks(true);

Aber meine Labels stimmen nicht. Ich bekomme so was:
|----|----|----|----|
1/2--1----2--------4

Kann jemand mir sagen, was ich falsch mache? Vielen Dank!
 
Du hast da einen kleinen Gedankenfehler!
Java:
 final int MIN = 1/4;

da du hier Integer hast, ist das natürlich schon 0 !
Und da put auch einen Integer erwartet, ist natürlich auch so etwas wie [c]MAX/16[/c] quatsch!
 
Danke für die schnelle Antwort aber ich hab nicht ganz kapiert was ich machen soll. Die Code habe ich so verändert aber ich bekomme Errors:


Java:
	    JSlider Samplerate = new JSlider(JSlider.HORIZONTAL); 
	    Samplerate.setMaximum(4); 
	    Samplerate.setMinimum(4/16); 

	    //Create the label table
	    Hashtable<Double, JLabel> labelTable = new Hashtable<Double, JLabel>();
	    
	    labelTable.put( 0.25, new JLabel("1/4") );
	    labelTable.put( 0.5, new JLabel("1/2") );
	    labelTable.put( 1.0, new JLabel("1") );
	    labelTable.put( 2.0, new JLabel("2") );
	    labelTable.put( 4.0, new JLabel("4") );
	    Samplerate.setLabelTable( labelTable );
	    Samplerate.setPaintLabels(true);
	    Samplerate.setMajorTickSpacing(1); 
	    Samplerate.setPaintTicks(true);
 
Ne ne, das geht so auch nicht, du musst weiterhin bei Integer bleiben und entsprechend umrechnen.
Wenn dein min also 0.25 sein soll, kannst du z.B. einfach sagen 0.25 --> 25 und dann den Wert entsprechend immer durch 100 teilen.
Irgendwie so z.B.:
Java:
		final int MIN = 25;
		final int MAX = 400;
		final int INIT = 100;
		JSlider samplerate = new JSlider(JSlider.HORIZONTAL, MIN, MAX, INIT);
		Hashtable<Integer, JLabel> labelTable = new Hashtable<Integer, JLabel>();
		labelTable.put(MIN, new JLabel("<html>&frac14;</html>"));
		labelTable.put(MIN*2, new JLabel("<html>&frac12;</html>"));
		labelTable.put(INIT, new JLabel("1"));
		labelTable.put(INIT * 2, new JLabel("2"));
		labelTable.put(MAX, new JLabel("4"));
		samplerate.setLabelTable(labelTable);
		samplerate.setPaintLabels(true);
		samplerate.setMajorTickSpacing(25); 
		samplerate.setPaintTicks(true);

Und dann wenn du dir den Wert mit getValue() holst, eben wieder zurückrechnen :
Code:
samplerate.getValue()/100.;
 
es tut mir wahnsinnig leid wieder zu stören aber ich bin ein noob und hab es nicht geschafft. was soll ich genau in stateChanged schreiben? Bei mir schaut es momentan so:

Java:
	     final int MIN = 25;
	     final int MAX = 400;
	     final int INIT = 100;
	       
	    JSlider Samplerate = new JSlider(JSlider.HORIZONTAL, MIN, MAX, INIT);; 


	    //Create the label table
	    Hashtable<Integer, JLabel> labelTable = new Hashtable<Integer, JLabel>();
	    
	    labelTable.put( MIN, new JLabel("<html>&frac14;</html>"));
	    labelTable.put( MIN*2, new JLabel("<html>&frac12;</html>"));
	    labelTable.put( INIT, new JLabel("1") );
	    labelTable.put( INIT*2, new JLabel("2") );
	    labelTable.put( MAX, new JLabel("4") );
	    Samplerate.setLabelTable( labelTable );
	    Samplerate.setPaintLabels(true);
	    Samplerate.setMajorTickSpacing(25); 
	    Samplerate.setPaintTicks(true);
	    
        Samplerate.addChangeListener(new javax.swing.event.ChangeListener() {
        	
    	public void stateChanged(ChangeEvent e) {
    		JSlider Samplerate = (JSlider) e.getSource();
    		MAX = Samplerate.getValue()/100.;

    	}
        });
 
a) MAX ist final, daher kannst du den Wert nicht neu zuweisen(ist ja auch okay so)
b) MAX ist ein int - Samplerate.getValue()/100. ist aber ein double !
c)
Java:
		Samplerate.addChangeListener(new javax.swing.event.ChangeListener() {
			public void stateChanged(ChangeEvent e) {
				double value = ((JSlider) e.getSource()).getValue() / 100.;
				System.out.println(value);
			}
		});

d) Variablen fangen mit kleinem Anfangsbuchstaben an :bae:
 
danke eRaaaa!
aber noch was 🙂.
so das erste bild ist wie es (vielen dank an dir) momentan ausschaut. aber die zweite ist wie es ausschauen soll. was kann ich dafür machen?

slideri.jpg
 
Das Problem ist, das Du keine lineare Skalierung haben willst, daher musst Du wohl ein bisschen rechnen:
Java:
	Hashtable<Integer, JLabel> labelTable = new Hashtable<Integer, JLabel>();
	labelTable.put(-20, new JLabel("1/4"));
	labelTable.put(-10, new JLabel("1/2"));
	labelTable.put(0, new JLabel("1"));
	labelTable.put(10, new JLabel("2"));
	labelTable.put(20, new JLabel("4"));
	
	JSlider slider = new JSlider(JSlider.HORIZONTAL, -20, 20, 0);
	slider.setLabelTable(labelTable);
	slider.setMajorTickSpacing(10);
	slider.setMinorTickSpacing(1);
	slider.setPaintLabels(true);
	slider.setPaintTicks(true);

	slider.addChangeListener(new ChangeListener() {
		public void stateChanged(ChangeEvent e) {
			double value = Math.pow(2,	((JSlider) e.getSource()).getValue() / 10.0);
			System.out.println(value);
		}
	});
 

Neue Themen


Zurück
Oben