Swing Slider-Value auslesen und weitergeben

aikon96

Neues Mitglied
Hey Leute, ich hoffe ich bin hier richtig.
Habe mal die Forumsuche benutzt, aber bin nicht wirklich so richtig fündig geworden.

Also, ich muss eine JAVA GUI erstellen, die folgendes beinhaltet:

Slider, Progressbar, Radiobuttons und einen Text.
Ich habe soweit mal alles visuell ^^ jedoch will ich jetzt den JSlider mit meinen anderen Komponenten verbinden, also hab ich einen addchangeListener erstellt. Ich habe jetzt zwar den Wert des Sliders, jedoch kann ich ihn nicht an die Progressbar etc... weiterreichen. Steh gerade irgendwie auf dem Schlauch :-/

Ich habe in meinen Listener,
Code:
JSlider slider = (JSlider)e.getSource();
drin, damit greife ich ja auf den Slider zu?!

Ich kann den Slider bewegen, jedoch ändern sich die Werte in der Progressbar etc. nicht :-(


Java:
package GUI;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.awt.GridLayout;


import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JSlider;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;

import sun.awt.SunHints.Value;

import com.sun.java.swing.plaf.nimbus.SliderPainter;

public class mainFrame extends JFrame implements ChangeListener
{
	private final JFrame window;
	
	
	public mainFrame() 
    {
	
		//window settings
		window = new JFrame("Exercise GUI");
		//size of window
		window.setSize(400,300);
		//add close button
        window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        //set visible to true
        window.setVisible(true);        
        
        
        //create header
        JLabel label1 = new JLabel("Please use the slider");
                        
        
        //create slider        
        JSlider slider = new JSlider();        
        slider.add(Box.createHorizontalStrut(30));
        slider.add(new JSlider(0,100));
        slider.setMinorTickSpacing(1);
        slider.setValue(50);
        
        //register slider to events
        slider.addChangeListener(this);        
        
        Box value = Box.createHorizontalBox();
        value.add(Box.createHorizontalStrut(30));
        
        value.add(new JLabel("Value of the slider "+ slider.getValue()+" %"));
        
        
        //create progressBar
        JProgressBar progress = new JProgressBar(0,100);
         
        //create color line
        Box color = Box.createHorizontalBox();
        
        color.add(new JLabel("Color"));
        color.add(Box.createHorizontalStrut(20));
        
        //group radio buttons
        ButtonGroup radioGroup = new ButtonGroup();
        
        //create radio buttons
        JRadioButton rbutton;
        
        //create blue radio button
        radioGroup.add(rbutton = new JRadioButton("Blue"));
        color.add(rbutton);
        color.add(Box.createHorizontalStrut(10));        

        //create red radio button        
        radioGroup.add(rbutton = new JRadioButton("Red"));
        color.add(rbutton);     
        
                
        Box popup = Box.createVerticalBox();
        popup.add(label1);
        popup.add(slider);
        popup.add(value);
        popup.add(progress);
        popup.add(color);
        
        
        Container content = window.getContentPane();
        content.setLayout(new BorderLayout());
        content.add(popup, BorderLayout.CENTER);
           
    }

		
    public static void main(String[] args)
       {
 	   mainFrame g = new mainFrame();          
       }


	public void stateChanged(ChangeEvent e) {
		
		int ValueOfSlider;
				
		JSlider slider = (JSlider)e.getSource();
		ValueOfSlider = slider.getValue();
				
		JLabel value = (JLabel)e.getSource();
		value.setText("Value of the slider "+ ValueOfSlider+" %");
	
		JProgressBar progess = (JProgressBar)e.getSource();
		progess.setValue(ValueOfSlider);
		
		
	}

}
 
Zuletzt bearbeitet von einem Moderator:
Alsooo

#1 - du solltest
Code:
window.setVisible(true);
erst gaanz am Ende aufrufen!
#2 - ja mit e.getSource kommst du AUCH an den Slider ran. Allerdings hast du paar Zeilen danach eben auch ein Cast aufs JLabel, das kann ja so gar nicht klappen! e.getSource liefert immer die Komponente die das Event ausgelöst hat, das kann generell eh immer nur eine sein! Und hier sogar auch IMMER nur der Slider, denn du addest ja sonst nirgends den Listener ran!
Dein Verständnissproblem liegt also an dem e.getSource! Was du machen kannst ist eben, die anderen beiden Komponenten nicht lokal im Konstruktor zu deklarieren, sondern eben außerhalb, so dass du dann direkt im Listener darauf zugreifen kannst

Java:
package GUI;

import java.awt.BorderLayout;
import java.awt.Container;

import javax.swing.Box;
import javax.swing.ButtonGroup;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JProgressBar;
import javax.swing.JRadioButton;
import javax.swing.JSlider;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;

public class mainFrame extends JFrame implements ChangeListener { //klassen immer gross schreiben!
	private final JFrame window;
	private JProgressBar progress; 
	private JLabel label;

	public mainFrame() {

		// window settings
		window = new JFrame("Exercise GUI");
		// size of window
		window.setSize(400, 300);
		// add close button
		window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		// set visible to true


		// create header
		JLabel label1 = new JLabel("Please use the slider");

		// create slider
		JSlider slider = new JSlider();
		slider.add(Box.createHorizontalStrut(30));
		slider.add(new JSlider(0, 100));
		slider.setMinorTickSpacing(1);
		slider.setValue(50);

		// register slider to events
		slider.addChangeListener(this);

		Box value = Box.createHorizontalBox();
		value.add(Box.createHorizontalStrut(30));

		label = new JLabel("Value of the slider " + slider.getValue() + " %");
		value.add(label);

		// create progressBar
		progress = new JProgressBar(0, 100);

		// create color line
		Box color = Box.createHorizontalBox();

		color.add(new JLabel("Color"));
		color.add(Box.createHorizontalStrut(20));

		// group radio buttons
		ButtonGroup radioGroup = new ButtonGroup();

		// create radio buttons
		JRadioButton rbutton;

		// create blue radio button
		radioGroup.add(rbutton = new JRadioButton("Blue"));
		color.add(rbutton);
		color.add(Box.createHorizontalStrut(10));

		// create red radio button
		radioGroup.add(rbutton = new JRadioButton("Red"));
		color.add(rbutton);

		Box popup = Box.createVerticalBox();
		popup.add(label1);
		popup.add(slider);
		popup.add(value);
		popup.add(progress);
		popup.add(color);

		Container content = window.getContentPane();
		content.setLayout(new BorderLayout());
		content.add(popup, BorderLayout.CENTER);
		
		window.setVisible(true);

	}

	public static void main(String[] args) {
		mainFrame g = new mainFrame();
	}

	public void stateChanged(ChangeEvent e) {

		int valueOfSlider;

		JSlider slider = (JSlider) e.getSource();
		valueOfSlider = slider.getValue();
		
		label.setText("Value of the slider " + valueOfSlider + " %");
		progress.setValue(valueOfSlider);

	}

}
 
Java:
	public void stateChanged(ChangeEvent e) {
		...
		JSlider slider = (JSlider)e.getSource();
		...
		JLabel value = (JLabel)e.getSource();
		...
		JProgressBar progess = (JProgressBar)e.getSource();
		...
	}
Wie soll das den funktionieren? Die Quelle eines Events kann ja nur ein Objekt sein - als der JSlider sein. Da fliegt doch beim Ausführen eine ClassCastException.

Das casten könnte man sich sparen, in dem man die Variable mit Referenz auf den JSlider als Instanzvariable halten würde.
 
Vielen Dank für die Rückmeldung! Besonder eRaaaa.

Soweit klappt es nun, nur noch ein Ding:

Ich habe zwei Radiobuttons eingebunden und mit dem Actionlistener verknüpft.
Durch die Radiobuttons kann ich die Sliderfarbe ändern.

Ich hab nur das Problem, dass ich die Farbe nur einmal auf rot ändern kann, danach geht es nicht mehr. Der Denkfehler müsste bei True/false irgendwo sein, nur weiß ich nicht, wie ich den Radiobutton per befehl umschreiben kann, dass er false/true ist...

Code:
package GUI;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.Box;
import javax.swing.ButtonGroup;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JProgressBar;
import javax.swing.JRadioButton;
import javax.swing.JSlider;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;

public class mainFrame extends JFrame implements ChangeListener,ActionListener{
	private final JFrame window;
	private JProgressBar progress; 
	private JLabel label;
	private JRadioButton red;
	private JRadioButton blue;

	public mainFrame() {

		// window settings
		window = new JFrame("Exercise GUI");
		// size of window
		window.setSize(400, 300);
		// add close button
		window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		// set visible to true


		// create header
		JLabel label1 = new JLabel("Please use the slider");

		// create slider
		JSlider slider = new JSlider();
		slider.add(Box.createHorizontalStrut(30));
		slider.add(new JSlider(0, 100));
		slider.setMinorTickSpacing(1);
		slider.setValue(50);

		// register slider to events
		slider.addChangeListener(this);

		Box value = Box.createHorizontalBox();
		value.add(Box.createHorizontalStrut(30));

		label = new JLabel("Value of the slider " + slider.getValue() + " %");
		value.add(label);

		// create progressBar
		progress = new JProgressBar(0, 100);
		progress.setValue(slider.getValue());
		progress.setForeground(Color.blue);
		

		// create color line
		Box color = Box.createHorizontalBox();

		color.add(new JLabel("Color"));
		color.add(Box.createHorizontalStrut(20));

		// group radio buttons
		ButtonGroup radioGroup = new ButtonGroup();

		
		// create blue radio button
		radioGroup.add(blue = new JRadioButton("Blue", true));
		color.add(blue);
		
	    // Register a listener for the radio buttons.
	        		

	    color.add(Box.createHorizontalStrut(10));
		
		// create red radio button
		radioGroup.add(red = new JRadioButton("Red", false));
		color.add(red);
		
		blue.addActionListener(this);
		red.addActionListener(this);
		

		Box popup = Box.createVerticalBox();
		popup.add(label1);
		popup.add(slider);
		popup.add(value);
		popup.add(progress);
		popup.add(color);

		Container content = window.getContentPane();
		content.setLayout(new BorderLayout());
		content.add(popup, BorderLayout.CENTER);
		
		window.setVisible(true);

	}

	public static void main(String[] args) {
		mainFrame g = new mainFrame();
	}

	public void stateChanged(ChangeEvent e) {

		int valueOfSlider;	

		JSlider slider = (JSlider) e.getSource();
		valueOfSlider = slider.getValue();
		
		label.setText("Value of the slider " + valueOfSlider + " %");
		progress.setValue(valueOfSlider);
		
		

	}
	
	public void actionPerformed(ActionEvent actionEvent) {

		
			

		JRadioButton blue = (JRadioButton) actionEvent.getSource();
				
		if (blue.isValid()==true){
			
			progress.setForeground(Color.blue);
			
		}
		
		JRadioButton red = (JRadioButton) actionEvent.getSource();
		
		if (red.isValid()==true){
			progress.setForeground(Color.red);
		}

	}
		
}
 
Du scheinst das mit dem getSource noch immer nicht verstanden zu haben 😛ueh:
Lies dich da besser noch einmal ein oder stelle uns konkrete Fragen dazu!
Und was soll das isValid() ? :bahnhof:

Java:
	public void actionPerformed(ActionEvent actionEvent) {
		JRadioButton btn = (JRadioButton) actionEvent.getSource();
		if (btn == blue) {
			progress.setForeground(Color.BLUE);
		} else {
			progress.setForeground(Color.RED);
		}
	}
 

Zurück
Oben