Swing per JComboBox gewünschtes Attribut auswählen und Komponenten passen sich an

Alex2013

Bekanntes Mitglied
Hallo Leute,

zum Üben, habe ich die Tage erneut ein kein wenig was gebastelt. Ich komme hier aber jetzt nicht mehr weiter. Es geht darum, dass ich in meinem kleinen Fenster zwei JSlider eingebaut habe und eine Berechnung die dahinter steht. Außerdem habe ich noch andere Komponenten, die können aber außer Acht gelassen werden (hoffe ich). Ich möchte, dass wenn ich die verschiedenen Einträge der JComboBox auswähle, dass sich die JSlider bzw. jeweils ein JSlider aktualisiert. Was er aber nicht tut. Ich habe es bereits mit 3 Klassen versucht. Also für jeden Eintrag, dass sich die GUI einmal "komplett" ändert und ich über die Listener nur den Konstruktor aufrufe. Das hat nicht geklappt. Anschließend habe ich es mit einer Methode "aktualisiere" versucht. Das hat aber auch nicht geklappt. Ich bin jetzt schon fast soweit zu sagen, dass ich alle drei JSlider direkt einbaue und bei Auswahl auf enabled(true) oder false stelle. Das möchte ich jedoch nicht. Daher wollte ich noch einmal um Rat fragen. Es geht um ein theoretisches Skisprungspiel, bei dem man die Weite, die Haltung und die Landung bestimmen kann. Den Slider den man verändern müsste, wäre jeweils nur der Weitenslider. Aber ich komme hier nicht weiter.
Es muss eigtl. bei Auswahl nur ein Element verändert werden, aber das klappt nicht, hat hier jemand einen Tipp bzw. kann mir sagen, was ich falsch mache?

Hier der Code der 1 Klasse:

Java:
[code]
import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.util.Random;

import javax.swing.ButtonGroup;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JRadioButton;
import javax.swing.JSlider;
import javax.swing.JTextField;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;


class Flugschanze extends JFrame implements ActionListener
{
	private static final long serialVersionUID = 1L;
	JSlider weite,haltung;
	JRadioButton ja,nein;
	JLabel telemark,punkte,ergebnis,punkte2,ergebnisGesamt,cr;
	JTextField anzeigeWeite,anzeigeHaltung;
	ButtonGroup bg;
	JComboBox auswahl;
	String []a=new String[]{"Normalschanze","Großschanze","Flugschanze"};
	
	public Flugschanze() 
	{
		setLayout(new GridLayout(7,2));
		setTitle("Skispringe Punkte");
		setSize(700,350);
		add(auswahl=new JComboBox(a));
//		auswahl.setActionCommand("");
		auswahl.addItemListener(new ItemListener() 
		{
			@Override
			public void itemStateChanged(ItemEvent e) 
			{
				if(e.getSource()=="Normalschanze")
				{
//					aktualisiere();
					//Mit Aufruf des Konstruktors der Klasse Normalschanze lässt sich das Element ebenfalls nicht verändern
					new Normalschanze();
				}
				else if(e.getSource()=="Großschanze")
				{
					new Großschanze();
				}
			}
		});
		auswahl.addActionListener(new ActionListener() 
			{
				@Override
				public void actionPerformed(ActionEvent ae) 
				{
					if(ae.getActionCommand().equals("Normalschanze"))
					{
						aktualisiere();
//						new Normalschanze();
					}
					else if(ae.getActionCommand().equals("Großschanze"))
					{
						new Großschanze();
					}
				}
			});
		
//		auswahl.addActionListener(new ActionListener() 
//		{
//			@Override
//			public void actionPerformed(ActionEvent ae) 
//			{
//				if(ae.getActionCommand().equals("Normalschanze"))
//				{
//					new Normalschanze();
//				}
//			}
//		});
		add(weite=new JSlider(JSlider.HORIZONTAL,0,250,185));
		weite.setName("Weite");
		add(anzeigeWeite=new JTextField());
		//Der Wert des Sliders wird in da erste Textfeld übertragen
		weite.addChangeListener(new ChangeListener() 
		{
			@Override
			public void stateChanged(ChangeEvent ce) 
			{
				JSlider source;
				source=(JSlider)ce.getSource();
				if(source.getName().equals("Weite"))
				{
					anzeigeWeite.setText(""+source.getValue());
				}
			}
		});
		weite.setPreferredSize(new Dimension(300,50));
		weite.setMajorTickSpacing(20);
		weite.setMinorTickSpacing(5);
		weite.setPaintLabels(true);
		weite.setPaintTicks(true);
		add(haltung=new JSlider(JSlider.HORIZONTAL,0,20,15));
		haltung.setName("Haltung");
		add(anzeigeHaltung=new JTextField());
		haltung.setName("Haltung");
		//Der wert des zweiten Sliders wird in das zweite Textfeld übertragen
		haltung.addChangeListener(new ChangeListener() 
		{
			@Override
			public void stateChanged(ChangeEvent ce) 
			{
				JSlider source;
				source=(JSlider)ce.getSource();
				if(source.getName().equals("Haltung"))
				{
					anzeigeHaltung.setText(""+source.getValue());
				}
			}
		});
		haltung.setPreferredSize(new Dimension(300,50));
		haltung.setMajorTickSpacing(5);
		haltung.setMinorTickSpacing(1);
		haltung.setPaintLabels(true);
		haltung.setPaintTicks(true);
		add(telemark=new JLabel("Telemark",JLabel.LEFT));
		add(ja=new JRadioButton("Ja"));
		ja.addActionListener(this);
		add(nein=new JRadioButton("Nein"));
		nein.addActionListener(this);
		bg=new ButtonGroup();
		bg.add(ja);
		bg.add(nein);
		add(punkte=new JLabel("Punkte 1 Durchgang: ",JLabel.LEFT));
		add(ergebnis=new JLabel());
		ergebnis.setOpaque(true);
		ergebnis.setBackground(Color.WHITE);
		add(punkte2=new JLabel("Punkte insgesamt: ",JLabel.LEFT));
		add(ergebnisGesamt=new JLabel());
		ergebnisGesamt.setOpaque(true);
		ergebnisGesamt.setBackground(Color.WHITE);
		add(cr=new JLabel("cr"));
		setVisible(true);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	}

		//Ergebnis Flugschanze
		public double ergebnisFlugschanze(JSlider haltung,JSlider weite)
		{
			double weite1=60+((weite.getValue()-185)*1.2);
			double haltung1=0;
			
			if(haltung.getValue()<=10)
			{
				Random rd=new Random(0-2);
				haltung1=(haltung.getValue()+rd.nextDouble())+(haltung.getValue()+rd.nextDouble())+(haltung.getValue()+rd.nextDouble());
			}
			else if(haltung.getValue()<=15)
			{
				Random rd=new Random(0-2);
				haltung1=(haltung.getValue()+rd.nextDouble())+(haltung.getValue()+rd.nextDouble())+(haltung.getValue()+rd.nextDouble());
			}
			else if(haltung.getValue()>=15)
			{
				Random rd=new Random(0-2);
				haltung1=(haltung.getValue()+rd.nextDouble())+(haltung.getValue()+rd.nextDouble())+(haltung.getValue()+rd.nextDouble());
			}

			double ergebnis1=weite1+haltung1;
			return ergebnis1;
		}
	
		//Gesamtergebnis Flugschanze
		public double ergebnis2Flugschanze(JSlider weite,JSlider haltung)
		{
			double weite1=60+((weite.getValue()-185)*1.2);

			double haltung1=0;
			if(haltung.getValue()<=10)
			{
				Random rd=new Random(0-2);
				haltung1=(haltung.getValue()+rd.nextDouble())+(haltung.getValue()+rd.nextDouble())+(haltung.getValue()+rd.nextDouble());
			}
			else if(haltung.getValue()<=15)
			{
				Random rd=new Random(0-2);
				haltung1=(haltung.getValue()+rd.nextDouble())+(haltung.getValue()+rd.nextDouble())+(haltung.getValue()+rd.nextDouble());
			}
			else if(haltung.getValue()>=15)
			{
				Random rd=new Random(0-2);
				haltung1=(haltung.getValue()+rd.nextDouble())+(haltung.getValue()+rd.nextDouble())+(haltung.getValue()+rd.nextDouble());
			}

			double ergebnis1=(weite1+haltung1)*2;
			return ergebnis1;
		}
		
		//Mit dieser Methode klappt die Aktualisierung bei Auswahl nicht
		public void aktualisiere()
		{
			add(auswahl=new JComboBox(a));
//			auswahl.setActionCommand("");
			auswahl.addItemListener(new ItemListener() 
			{
				@Override
				public void itemStateChanged(ItemEvent e) 
				{
					if(e.getSource()=="Normalschanze")
					{
						new Normalschanze();
					}
					else if(e.getSource()=="Großschanze")
					{
						new Großschanze();
					}
				}
			});
			auswahl.addActionListener(new ActionListener() 
				{
					@Override
					public void actionPerformed(ActionEvent ae) 
					{
						if(ae.getActionCommand().equals("Normalschanze"))
						{
							aktualisiere();
//							new Normalschanze();
						}
						else if(ae.getActionCommand().equals("Großschanze"))
						{
							new Großschanze();
						}
					}
				});
			add(weite=new JSlider(JSlider.HORIZONTAL,0,140,115));
			weite.setName("Weite");
			add(anzeigeWeite=new JTextField());
			//Der Wert des Sliders wird in da erste Textfeld übertragen
			weite.addChangeListener(new ChangeListener() 
			{
				@Override
				public void stateChanged(ChangeEvent ce) 
				{
					JSlider source;
					source=(JSlider)ce.getSource();
					if(source.getName().equals("Weite"))
					{
						anzeigeWeite.setText(""+source.getValue());
					}
				}
			});
			weite.setPreferredSize(new Dimension(300,50));
			weite.setMajorTickSpacing(20);
			weite.setMinorTickSpacing(5);
			weite.setPaintLabels(true);
			weite.setPaintTicks(true);
			add(haltung=new JSlider(JSlider.HORIZONTAL,0,20,15));
			haltung.setName("Haltung");
			add(anzeigeHaltung=new JTextField());
			haltung.setName("Haltung");
			//Der wert des zweiten Sliders wird in das zweite Textfeld übertragen
			haltung.addChangeListener(new ChangeListener() 
			{
				@Override
				public void stateChanged(ChangeEvent ce) 
				{
					JSlider source;
					source=(JSlider)ce.getSource();
					if(source.getName().equals("Haltung"))
					{
						anzeigeHaltung.setText(""+source.getValue());
					}
				}
			});
			haltung.setPreferredSize(new Dimension(300,50));
			haltung.setMajorTickSpacing(5);
			haltung.setMinorTickSpacing(1);
			haltung.setPaintLabels(true);
			haltung.setPaintTicks(true);
//			return 0;
			
		}
		
	//Beim drücken der Radio Buttons Ja oder Nein
	@Override
	public void actionPerformed(ActionEvent e) 
	{
		int zahl=6;
		double ergebnis3=ergebnisFlugschanze(haltung, weite)-zahl;
		double ergebnis4=ergebnis2Flugschanze(weite, haltung)-(zahl*2);
		if((ja.isSelected()==true)&&(nein.isSelected()==false))
		{
			ergebnis.setText(""+ergebnisFlugschanze(haltung, weite));
			ergebnisGesamt.setText(""+ergebnis2Flugschanze(weite, haltung));
		}
		else if((nein.isSelected()==true)&&(ja.isSelected()==false))
		{
			ergebnis.setText(""+ergebnis3);
			ergebnisGesamt.setText(""+ergebnis4);
		}		
	}

}
[/code]

und als Beispiel noch der Code einer zweiten Klasse:

Java:
[code]
import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.util.Random;

import javax.swing.ButtonGroup;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JRadioButton;
import javax.swing.JSlider;
import javax.swing.JTextField;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;


class Normalschanze extends JFrame implements ActionListener
{
	private static final long serialVersionUID = 1L;
	JSlider weite,haltung;
	JRadioButton ja,nein;
	JLabel telemark,punkte,ergebnis,punkte2,ergebnisGesamt,cr;
	JTextField anzeigeWeite,anzeigeHaltung;
	ButtonGroup bg;
	JComboBox auswahl;
	String []a=new String[]{"Normalschanze","Großschanze","Flugschanze"};
	//Der Konstruktor lässt sich nicht aufrufen
	public Normalschanze() 
	{
		setLayout(new GridLayout(7,2));
		setTitle("Skispringe Punkte");
		setSize(700,350);
		add(auswahl=new JComboBox(a));
		auswahl.addItemListener(new ItemListener() 
		{
			@Override
			public void itemStateChanged(ItemEvent e) 
			{
				if(e.getSource()=="Großschanze")
				{
					new Großschanze();
				}
				else if(e.getSource()=="Flugschanze")
				{
					new Flugschanze();
				}
			}
		});
//		auswahl.setActionCommand("");
//			auswahl.addActionListener(new ActionListener() 
//			{
//				@Override
//				public void actionPerformed(ActionEvent ae) 
//				{
//					if(ae.getActionCommand().equals("Großschanze"))
//					{
//						new Großschanze();
//					}
//					else if(ae.getActionCommand().equals("Flugschanze"))
//					{
//						new Flugschanze();
//					}
//				}
//			});
		
//		auswahl.addActionListener(new ActionListener() 
//		{
//			@Override
//			public void actionPerformed(ActionEvent ae) 
//			{
//				if(ae.getActionCommand().equals("Normalschanze"))
//				{
//					
//				}
//			}
//		});
		add(weite=new JSlider(JSlider.HORIZONTAL,0,140,115));
		weite.setName("Weite");
		add(anzeigeWeite=new JTextField());
		//Der Wert des Sliders wird in da erste Textfeld übertragen
		weite.addChangeListener(new ChangeListener() 
		{
			@Override
			public void stateChanged(ChangeEvent ce) 
			{
				JSlider source;
				source=(JSlider)ce.getSource();
				if(source.getName().equals("Weite"))
				{
					anzeigeWeite.setText(""+source.getValue());
				}
			}
		});
		weite.setPreferredSize(new Dimension(300,50));
		weite.setMajorTickSpacing(20);
		weite.setMinorTickSpacing(5);
		weite.setPaintLabels(true);
		weite.setPaintTicks(true);
		add(haltung=new JSlider(JSlider.HORIZONTAL,0,20,15));
		haltung.setName("Haltung");
		add(anzeigeHaltung=new JTextField());
		haltung.setName("Haltung");
		//Der wert des zweiten Sliders wird in das zweite Textfeld übertragen
		haltung.addChangeListener(new ChangeListener() 
		{
			@Override
			public void stateChanged(ChangeEvent ce) 
			{
				JSlider source;
				source=(JSlider)ce.getSource();
				if(source.getName().equals("Haltung"))
				{
					anzeigeHaltung.setText(""+source.getValue());
				}
			}
		});
		haltung.setPreferredSize(new Dimension(300,50));
		haltung.setMajorTickSpacing(5);
		haltung.setMinorTickSpacing(1);
		haltung.setPaintLabels(true);
		haltung.setPaintTicks(true);
		add(telemark=new JLabel("Telemark",JLabel.LEFT));
		add(ja=new JRadioButton("Ja"));
		ja.addActionListener(this);
		add(nein=new JRadioButton("Nein"));
		nein.addActionListener(this);
		bg=new ButtonGroup();
		bg.add(ja);
		bg.add(nein);
		add(punkte=new JLabel("Punkte 1 Durchgang: ",JLabel.LEFT));
		add(ergebnis=new JLabel());
		ergebnis.setOpaque(true);
		ergebnis.setBackground(Color.WHITE);
		add(punkte2=new JLabel("Punkte insgesamt: ",JLabel.LEFT));
		add(ergebnisGesamt=new JLabel());
		ergebnisGesamt.setOpaque(true);
		ergebnisGesamt.setBackground(Color.WHITE);
		add(cr=new JLabel("cr"));
		setVisible(true);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	}

	//Berechnung auf einer Normalschanze
	public double ergebnisNormalschanze(JSlider haltung,JSlider weite)
	{
		double weite1=60+((weite.getValue()-115)*2);
		double haltung1=0;
		
		if(haltung.getValue()<=10)
		{
			Random rd=new Random(0-2);
			haltung1=(haltung.getValue()+rd.nextDouble())+(haltung.getValue()+rd.nextDouble())+(haltung.getValue()+rd.nextDouble());
		}
		else if(haltung.getValue()<=15)
		{
			Random rd=new Random(0-2);
			haltung1=(haltung.getValue()+rd.nextDouble())+(haltung.getValue()+rd.nextDouble())+(haltung.getValue()+rd.nextDouble());
		}
		else if(haltung.getValue()>=15)
		{
			Random rd=new Random(0-2);
			haltung1=(haltung.getValue()+rd.nextDouble())+(haltung.getValue()+rd.nextDouble())+(haltung.getValue()+rd.nextDouble());
		}

		double ergebnis1=weite1+haltung1;
		return ergebnis1;
	}
	//Normalschanze Gesamtergebnis
	public double ergebnis2Normalschanze(JSlider weite,JSlider haltung)
	{
		double weite1=60+((weite.getValue()-115)*2);

		double haltung1=0;
		if(haltung.getValue()<=10)
		{
			Random rd=new Random(0-2);
			haltung1=(haltung.getValue()+rd.nextDouble())+(haltung.getValue()+rd.nextDouble())+(haltung.getValue()+rd.nextDouble());
		}
		else if(haltung.getValue()<=15)
		{
			Random rd=new Random(0-2);
			haltung1=(haltung.getValue()+rd.nextDouble())+(haltung.getValue()+rd.nextDouble())+(haltung.getValue()+rd.nextDouble());
		}
		else if(haltung.getValue()>=15)
		{
			Random rd=new Random(0-2);
			haltung1=(haltung.getValue()+rd.nextDouble())+(haltung.getValue()+rd.nextDouble())+(haltung.getValue()+rd.nextDouble());
		}

		double ergebnis1=(weite1+haltung1)*2;
		return ergebnis1;
	}
	
	//Beim drücken der RadioButtons Ja oder Nein
	@Override
	public void actionPerformed(ActionEvent e) 
	{
		int zahl=6;
		double ergebnis3=ergebnisNormalschanze(haltung, weite)-zahl;
		double ergebnis4=ergebnis2Normalschanze(weite, haltung)-(zahl*2);
		if((ja.isSelected()==true)&&(nein.isSelected()==false))
		{
			ergebnis.setText(""+ergebnisNormalschanze(haltung, weite));
			ergebnisGesamt.setText(""+ergebnis2Normalschanze(weite, haltung));
		}
		else if((nein.isSelected()==true)&&(ja.isSelected()==false))
		{
			ergebnis.setText(""+ergebnis3);
			ergebnisGesamt.setText(""+ergebnis4);
		}	
	}
}
[/code]

Lg
 
Puh, wo soll man da anfangen?

Ein paar Kommentare meinerseits:

1. Du schreibst, daß "wenn ich die verschiedenen Einträge der JComboBox auswähle, dass sich die JSlider bzw. jeweils ein JSlider aktualisiert". In den Listenern, die an den JComboBoxen hängen, wird der Wert der JSlider gar nicht verändert. Es wird gar nicht auf die JSlider zugegriffen. Was genau hast du vor?

2. Zeile 45 in "Flugschanze" :
Code:
if(e.getSource()=="Normalschanze")
a) String vergleicht man mit equals(), und b) gibt e.getSource() die Source des ItemEvents zurück. Das KANN ein String sein, ich würds zur Sicherheit aber überprüfen. Besser dran dürftest du mit
Code:
 if (e.getSource().toString().equals("Normalschanze"))
sein.

3. Zeilen 62 und 67
Code:
if(ae.getActionCommand().equals("Normalschanze"))
und
Code:
else if(ae.getActionCommand().equals("Großschanze"))
;: damit das überhaupt funktioniert, musst du zuerst mal ein actionCommand festlegen, und das kann entweder "Normalschanze" oder "Großschanze" sein. Du möchtest wahrscheinlich aus ae.getSource() die JComboBox beschaffen, deren selectedItem abfragen und dieses mit den beiden Strings vergleichen. In der aktuellen Form dürften beide if-Abfragen "false" zurückgeben.

4. Im inneren der o.g. Codeblöcke erzeugst du jeweils neue Instanzen einer Klasse, die der Klasse "Flugschanze" sehr ähnlich sind. Den Sinn dahinter habe ich nicht verstanden. Das hat auch nix mit "JSlider aktualisieren" zu tun.

5. Zeile 204, die "aktualisiere" Methode. Mal ganz abgesehen davon, daß diese Methode mit deinem jetzigen Code wahrscheinlich nie aufgerufen wird (s.o.): was für einen Sinn soll es haben, nochmal eine JComboBox anzulegen mit einem identischen Inhalt wie eine schon bestehende, und an die neue JComboBox Listener dranzuhängen mit einer Logik, die bei der ersten JComboBox schon nicht funktioniert hat?
 
mhm...ok, also praktisch noch einmal von vorne...
Ich fürchte, ja. Aber zuerst solltest du einen Plan haben, wie du das ganze umsetzt. Ins Blaue hinein programmieren führt meist zu nichts.
Soweit wie ich dein Problem verstanden habe:
1. Normalschanze, Flugschanze und Großschanze brauchen einen identischen Satz an JComponents zur Konfiguration und zur Ausgabe der Ergebnisse. Zumindest haben die beiden Klassen "Flugschanze" und "Normalschanze" je zwei JSlider, zwei JTextFields und zwei JRadioButtons.
2. Die einzelnen Schanzentypen unterscheiden sich offenbar nur darin, wie aus den Eingaben die Endnote(n) gemacht wird/werden.

Ich würde so vorgehen:
1. Lege dir eine abstrakte Klasse "Schanze" an. Dieser gibt du setter, mit denen die notwendigen Werte in der Klasse gesetzt werden können. Diese Werte werden, so weit ich das bisher gesehen habe, aus den JSlidern kommen.
2. Ausserdem braucht deine Schanze noch getter für die verschiedene Noten. Diese kannst du in der Schanzenklasse abstract lassen.
3. In Unterklassen von "Schanze" ("Normalschanze", "Flugschanze", "Großschanze") werden die getter für die Noten implementiert. Die Noten werden für jede Klasse separat aus den Parametern berechnet, die mit den settern in 1. gesetzt wurden.
4. Dein JComboBox füllst du nicht mit Strings, sondern mit je einer Instanzen der verschiedenen Schanzenklassen. Wenn der Benutzer in der JComboBox was auswählt, wird in deiner Hauptklasse (statt "Flugschanze" würde ich sie "Schanzensimulator" nennen) basierend auf der Auswahl die Instanzvariable aktuelleSchanze gesetzt. Damit du in der JComboBox was sinnvolles zu sehen bekommst, musst du einfach "toString()" in deinen Schanzenklassen überschreiben und einen sinnvollen Wert zurückgeben.
5. Wenn der Benutzer jetzt an den JSlidern rumspielt, passiert folgendes:
- Die Werte aus den JSlidern werden ausgelesen und per setter in aktuelleSchanze verfrachtet.
- Innerhalb der Klasse wird sofort die Berechnung der Noten mit den aktuellen Parametern durchgeführt.
- Die Noten aus aktuelleSchanze werden abgefragt und das Ergebnis in den JTextFields oder JLabels dargestellt.
Klar soweit?
 
Ich glaube Punkt 4 ist mir noch nicht so ganz Klar aber ich versuche es mal zu erklären so wie ich es verstanden habe.

Also bei Punkt 4 meinst du also, dass ich mit den Angaben einen erweiterten Datentyp bilden und dann jeweils die Schanzen deklarieren soll.
Oder habe ich das jetzt falsch verstanden?
 
Jetzt als Beispiel, meintest du das in etwa so:

Java:
[code]
import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Random;

import javax.swing.ButtonGroup;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JRadioButton;
import javax.swing.JSlider;
import javax.swing.JTextField;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;

//Mit drei JSlidern und Berechnung 1,8 P/m
public class Sprung extends JFrame //implements ActionListener
{
	private static final long serialVersionUID = 1L;
	JSlider weite,weite2,weite3,haltung;
	JRadioButton ja,nein;
	JLabel telemark,punkte,ergebnis;
	JTextField anzeigeWeite,anzeigeHaltung;
	JComboBox auswahl;    
	String []a=new String[]{"Normalschanze","Großschanze","Flugschanze"};
	ButtonGroup bg;
	
	public Sprung()
	{
		weite=new JSlider(JSlider.HORIZONTAL,0,135,115);
		weite2=new JSlider(JSlider.HORIZONTAL,0,160,120);
		weite3=new JSlider(JSlider.HORIZONTAL,0,250,185);
		haltung=new JSlider(JSlider.HORIZONTAL,0,20,15);
		punkte=new JLabel("Punkte: ");
		ergebnis=new JLabel();
		auswahl=new JComboBox();
		if(auswahl.getActionCommand().equals("Normalschanze"))
		{
			Normalschanze nschanze=new Normalschanze();
			nschanze.getWeite(weite);
		}
		else if(auswahl.getActionCommand().equals("Großschanze"))
		{
			Großschanze gschanze=new Großschanze();
			gschanze.getWeite2(weite2);
		}
		else if(auswahl.getActionCommand().equals("Flugschanze"))
		{
			Flugschanze fschanze=new Flugschanze();
			fschanze.toString();
			fschanze.getWeite3(weite3);
		}
	}
	public static void main(String[] args) 
	{
		new Sprung();
	}
}
[/code]

Die einzelnen Klassen mit den get und setMethoden habe ich wie von dir beschrieben gebildet, daher habe ich jetzt nur als Beispiel das Programm, wie es jetzt aussieht eingefügt.
Mir ist jetzt nur noch nicht so ganz klar, wie ich die JSlider mit den Komponenten verbinde, aber ich schau mir das noch weiter an.

Lg
 
1. Deine JComboBox enthält immer noch Strings anstatt der empfohlenen Schanzenobjekte.
2. Der JComboBox "auswahl" wurde immer noch kein action command zugeordnet, aber es wird eins abgefragt.
3. In Zeile 43, 48 und 54 rufst du einen getter auf, der einen double-Parameter hat. Wenn es ein getter ist, sollte er was zurückgeben. Wenn es ein setter ist, der nur mit get anfängt, ist die Namensgebung sehr ungeschickt. Deine drei Schanzeninstanzen sollten eine einheitliche API haben, und der setter sollte für alle Instanzen gleich heißen.
4. Mir ist nicht klar, was es für einen funktionalen Unterschied zwischen den drei JSlidern weite, weite2 und weite3 gibt.
Ich habe mir mal grob skizziert, was ich meine (weder auf Richtigkeit noch auf Kompilierbarkeit getestet):
Java:
abstract class Schanze{
	double hoehe;
	double weite;
	public void setHoehe(double h){
		this.hoehe = h;
	}
	public void setWeite(double w){
		this.weite = w;
	}
	public double getHoehe(){
		return this.hoehe;
	}
	public double getWeite(){
		return this.weite;
	}
	abstract double getNote();
}
class Normalschanze extends Schanze{
	public double getNote(){
		return (115.0-getWeite())*(12.0 - getHoehe());// oder was auch immer
	}
	public String toString(){
		return "Normalschanze";
	}
}
class Flug implements ActionListener, ChangeListener{
	private JComboBox schanzenAuswahl;
	private JSlider slider1;
	private JSlider slider2;
	private JLabel ergebnis;
	private Schanze aktuelleSchanze;

	public Flug(){
		Schanze[] a = new Schanze[]{new Normalschanze(), new Flugschanze()};
		schanzenAuswahl = new JComboBox(a);
		schanzenAuswahl.addActionListener(this);
		slider1 = new JSlider(JSlider.HORIZONTAL,0,20,15);
		slider2 = new JSlider(JSlider.HORIZONTAL,0,150,50);
		slider1.addChangeListener(this);
		slider2.addChangeListener(this);
		ergebnis = new JLabel();
	}
	public void actionPerformed(ActionEvent ae){
		if(ae.getSource() == schanzenAuswahl){
			aktuelleSchanze = (Schanze)(schanzenAuswahl.getSelectedItem());
		}
	}
	public void stateChanged(ChangeEvent ce){
		if(aktuelleSchanze == null) return;
		JSlider source = (JSlider)ce.getSource();
		if(source.getValueIsAdjusting())return;
		if(source == slider1 || source == slider2){
			aktuelleSchanze.setHoehe(slider1.getValue());
			aktuelleSchanze.setWeite(slider2.getValue());
			ergebnis.setText(String.valueOf(aktuelleSchanze.getNote()));
		}
	}
}
 

Neue Themen


Zurück
Oben