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
 

Harry Kane

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

Harry Kane

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

Alex2013

Bekanntes Mitglied
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?
 

Alex2013

Bekanntes Mitglied
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
 

Harry Kane

Top Contributor
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()));
		}
	}
}
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
hannibalstgt Fehler bei JCOMBOBOX GUI Anzeige AWT, Swing, JavaFX & SWT 4
L jComboBox Actionlistener wird beim erstmaligen Befüllen getriggert AWT, Swing, JavaFX & SWT 7
N Keylistener & JComboBox AWT, Swing, JavaFX & SWT 5
R JComboBox abfragen AWT, Swing, JavaFX & SWT 1
Esquid If Befehl bei JComboBox AWT, Swing, JavaFX & SWT 3
kodela Swing Element einer JComboBox ausgrauen AWT, Swing, JavaFX & SWT 3
D JComboBox Strings aus JTextFields zuordnen AWT, Swing, JavaFX & SWT 2
F JComboBox und Model AWT, Swing, JavaFX & SWT 10
I Editierbare JComboBox, die nur Ganzzahlen als Eingabewerte zulässt AWT, Swing, JavaFX & SWT 3
Drachenbauer Swing Wie ändere ich die Farbe der Konturen von jButton und jCombobox? AWT, Swing, JavaFX & SWT 18
Drachenbauer Swing Wie ändere ich den Hintergrund vom Anzeigefeld einer JComboBox, die nicht zum Hineinschreiben offen steht? AWT, Swing, JavaFX & SWT 32
Hatsi09 JCombobox default wert AWT, Swing, JavaFX & SWT 6
D Swing JCombobox Aktion löscht Grafik AWT, Swing, JavaFX & SWT 1
cezary Choice, JComboBox oder JList AWT, Swing, JavaFX & SWT 5
R Swing Java9 NullPointerException bei JComboBox AWT, Swing, JavaFX & SWT 13
ralfb1105 Swing JComboBox update der Daten AWT, Swing, JavaFX & SWT 8
D Swing JCombobox Weiße Leerzeilen AWT, Swing, JavaFX & SWT 10
G JComboBox: Arrow-Button permanent anzeigen AWT, Swing, JavaFX & SWT 4
D Swing Java JComboBox Example AWT, Swing, JavaFX & SWT 16
K Swing JComboBox mit ArrayList füllen AWT, Swing, JavaFX & SWT 4
D Swing "blaues" Element aus JComboBox erhalten AWT, Swing, JavaFX & SWT 6
F JComboBox und Einträge AWT, Swing, JavaFX & SWT 3
gamillton Swing JComboBox mit extra Inhalt + breiteres Popupmenü AWT, Swing, JavaFX & SWT 0
T JPanelsteuerung mit JComboBox AWT, Swing, JavaFX & SWT 5
N Swing Duplikate im Jcombobox vermeiden AWT, Swing, JavaFX & SWT 15
L Swing JComboBox kann nicht erstellt werden! AWT, Swing, JavaFX & SWT 2
C JComboBox Objecte übergeben und Eintrag auswählen AWT, Swing, JavaFX & SWT 3
M Swing JComboBox mit Laufwerksbuchstaben (Windows) AWT, Swing, JavaFX & SWT 6
D Swing Größe einer JComboBox im GridBagLayout aufgrund der maximalen Länge der enthaltenen Daten AWT, Swing, JavaFX & SWT 7
D Swing JComboBox (DefaultComboBoxModel) überschreibt Eintrag beim erstellen AWT, Swing, JavaFX & SWT 0
R Swing Durch JComboBox-Item eine TextArea aktualisieren AWT, Swing, JavaFX & SWT 2
3 JComboBox - Action - Auslesen & Umwandeln AWT, Swing, JavaFX & SWT 9
M Alle Schriftarten in JComboBox AWT, Swing, JavaFX & SWT 5
M Swing JComboBox eigenes Design AWT, Swing, JavaFX & SWT 3
Sin137 JComboBox mit Generics AWT, Swing, JavaFX & SWT 14
R JComboBox erweitern AWT, Swing, JavaFX & SWT 5
S Swing Eigene JComboBox Problem! AWT, Swing, JavaFX & SWT 1
V Editierbare JComboBox AWT, Swing, JavaFX & SWT 2
D Swing JCombobox in einem JTable vorbelegen AWT, Swing, JavaFX & SWT 4
F neuen Menüpunkt in jcombobox einfügen AWT, Swing, JavaFX & SWT 1
F Swing Jcombobox mit manueller Rückgabe AWT, Swing, JavaFX & SWT 4
W JComboBox auffristen nach Listenänderung AWT, Swing, JavaFX & SWT 20
S JComboBox mit mehreren Spalten? AWT, Swing, JavaFX & SWT 6
J JComboBox + ItemListener AWT, Swing, JavaFX & SWT 12
T Swing jComboBox auslesen mit Datenbankanbindung AWT, Swing, JavaFX & SWT 3
S JComboBox aus anderer Klasse füllen (Java-Swing) AWT, Swing, JavaFX & SWT 0
D Swing Erstes Item einer JCombobox in JTable anzeigen AWT, Swing, JavaFX & SWT 2
N JComboBox in JTable [Swing] -> totaler UI-Einsteiger AWT, Swing, JavaFX & SWT 3
H Swing jComboBox Ausgabe -1/null AWT, Swing, JavaFX & SWT 4
C Arrow Farbe bei JComboBox AWT, Swing, JavaFX & SWT 2
H Swing JList/JTable mit JButton, JTextField, Image, JComboBox und JLable AWT, Swing, JavaFX & SWT 2
O JTextfield und JComboBox Wert in SQL Database speichern AWT, Swing, JavaFX & SWT 4
S JComboBox UTF-8 Codierung zuweisen AWT, Swing, JavaFX & SWT 5
A JComboBox mit Array aktualisieren AWT, Swing, JavaFX & SWT 7
S JComboBox nach auswahl erneuern AWT, Swing, JavaFX & SWT 4
S Swing JComboBox mit Listener aktualisieren AWT, Swing, JavaFX & SWT 13
I JComboBox gibt bei ausgewählten ITem NullPointer an... AWT, Swing, JavaFX & SWT 3
D Swing JCombobox - Tooltip Location ändern AWT, Swing, JavaFX & SWT 4
J JComboBox Dropdown Icon AWT, Swing, JavaFX & SWT 2
M Swing Mix JComboBox - JButton? AWT, Swing, JavaFX & SWT 6
A Swing bei Auswahl und klick eines JComboBox buttons die Klasse eines anderen Projekts aufrufen AWT, Swing, JavaFX & SWT 3
F Swing jComboBox auslesen AWT, Swing, JavaFX & SWT 6
O Swing TableCellRenderer und JComboBox AWT, Swing, JavaFX & SWT 4
F Swing JComboBox - Frage zur Größe AWT, Swing, JavaFX & SWT 11
C Swing JComboBox, ItemListener gibt 2x aus AWT, Swing, JavaFX & SWT 2
O JComboBox - autom. Selektieren AWT, Swing, JavaFX & SWT 6
J JComboBox - wie getSelectedItem() überschreiben? AWT, Swing, JavaFX & SWT 8
S Swing Jcombobox und array AWT, Swing, JavaFX & SWT 6
D Swing JComboBox aktualisieren AWT, Swing, JavaFX & SWT 4
E JComboBox AWT, Swing, JavaFX & SWT 8
N Swing JComboBox Frage AWT, Swing, JavaFX & SWT 5
S Swing Bild auf jPanel nach Änderung von JComboBox zeichnen AWT, Swing, JavaFX & SWT 4
H Swing Element aus JComboBox auswählen AWT, Swing, JavaFX & SWT 2
H JCombobox inhalt löschen AWT, Swing, JavaFX & SWT 17
N Swing JCombobox - PopupMenu-Inhalt mit KSKB AWT, Swing, JavaFX & SWT 2
O JComboBox mit ArrayList füllen AWT, Swing, JavaFX & SWT 3
S Swing JComboBox mit Datenbank füllen AWT, Swing, JavaFX & SWT 16
S Inhalt einer JComboBox aktualisieren AWT, Swing, JavaFX & SWT 6
F Swing JComboBox in JTable AutoComplete + Tab AWT, Swing, JavaFX & SWT 4
O JComboBox getSelectedItem AWT, Swing, JavaFX & SWT 4
M JComboBox Hintergrundfarbe des gewählten Items AWT, Swing, JavaFX & SWT 3
B Swing Problem: Horizontaler Scrollbalken in JComboBox hinzufügen AWT, Swing, JavaFX & SWT 4
M JCombobox mit ID und Text AWT, Swing, JavaFX & SWT 4
A JComboBox-Inhalt durch neues Array ersetzen AWT, Swing, JavaFX & SWT 2
C Swing Dynamische JComboBox (Filter) AWT, Swing, JavaFX & SWT 28
M JComboBox Item-Auswahl in JTable AWT, Swing, JavaFX & SWT 2
L Jbutton + jcombobox mit vorhandenen frame verknüfen AWT, Swing, JavaFX & SWT 8
D JCombobox mit Linien Styles AWT, Swing, JavaFX & SWT 4
H Unterschiedliche JComboBox je JTable Zeile AWT, Swing, JavaFX & SWT 4
B jCombobox addItem funktioniert nicht AWT, Swing, JavaFX & SWT 9
G JComboBox mit CellRenderer (Auswahl) AWT, Swing, JavaFX & SWT 11
G Swing JComboBox anpassen AWT, Swing, JavaFX & SWT 6
M Item in JComboBox umbenennen AWT, Swing, JavaFX & SWT 5
M Swing Busy Waiting Problem (JComboBox) AWT, Swing, JavaFX & SWT 11
C JComboBox Renderer Problem AWT, Swing, JavaFX & SWT 7
N Renderer Editoren und die JCombobox AWT, Swing, JavaFX & SWT 2
T Wie ist das "Lookup-Verhalten" von JList, JCombobox änderbar? AWT, Swing, JavaFX & SWT 4
N JCombobox und Actionlistener Aktion nur ausführen, wenn Useraktion ihn auslöst AWT, Swing, JavaFX & SWT 4
T Swing JComboBox mit grauem Vorgabetext AWT, Swing, JavaFX & SWT 3
M TableLayout: JComboBox zerstört alles... AWT, Swing, JavaFX & SWT 10

Ähnliche Java Themen

Neue Themen


Oben