Lernprogramm mit Tiersounds

Wichi

Mitglied
Hallo Java-forum Gemeinde :)

Ich bin zurzeit in der 9. Klasse und wir müssen alle in Kleingruppen ein Programm schreiben und es anschließend vorstellen. Meine Gruppe arbeitet zurzeit mit Eclipse für Java an einem Programm , welches beim Drücken auf einen Button einen vorher festgelegten Tiersound abspielt. Nun soll der Anwender in einer jList zwischen 3 Tieren das richtige auswählen.Nach diesem Vorgang soll ein neuer vorher festgelegter Sound und 3 neue Tiere in der jList stehen. Wir dachten dabei an so etwas wie Arrays oder Schleifen.
Nun zu meinen Problemen :

- Wie macht man es , dass das Tier in der jList als "richtig" erkannt wird ?
- Wie kann ich den vorherigen Sound mit dem neuen Sound ersetzen ?
( d.h nach beantworten der 1. Frage wird ein neuer Sound zum Abspielen bereitgestellt )

- Wie kann ich die vorherigen 3 Tiere in der jList mit 3 neuen ersetzen ?
( d.h nach dem beantworten der Frage sollen die 3 vorherigen mit den 3 neuen Tieren ersetzt)


Werde demnächst die Programmcodes posten , falls benötigt.


Ich bedanke mich schon mal im Vorraus für die Hilfe , Tipps und Hinweise :) :toll:
 

Atze

Top Contributor
na ein paar informationen wären schon sinnvoll. z.b.:

wie soll das soundfile abgespielt werden, bzw. (was dürft / dürft nicht / müsst) ihr benutzen?
was habt ihr schon gelernt?
was für ein format haben die daten?
wie sollte die oberfläche ausehen? swing? swt?
und was wichtigeste eigentlich, was habt ihr bereits an code? und woran haperts? :)

eigentlich nimmt man den benötigten stoff doch meistens vorher im unterricht durch, bevor man ein projekt o.ä. realisiert, oder? nicht aufgepasst? ;)
 

Wichi

Mitglied
Also , die Sounddateien werden durch einen Buttonklick abgespielt , sind ausschließlich .wav Dateien , da Java nur noch diese unterstützt. Die Oberfläche wurde mit Jigloo in Eclipse erstellt d.h swing wenn ich mich nicht irre :D
Das Abspielen von Sounds klappt soweit . Das jetzige Problem ist wie wir nach dem beantworten der Frage eine neue Sounddatei abspielen lassen können und wie wir die Tiere in der jList "austauschen" durch 3 neue (steht übrigens oben genauer beschrieben )

PS: Im Unterricht passen wir immer auf ;) . Das Projekt ist ein 2 monatiges Projekt , in dem wir selber recherchieren und programmieren sollen. Der Lehrer gibt uns ab und zu paar Hinweise .
Codeschnipsel kann ich leider erst am Montag posten , da ich hier zuhause Windows habe und das Programm auf Linux - Rechnern geschrieben wurde.
 
A

anonym

Gast
Vermutlich schon, aber nicht mit so wenig Informationen.

Also:

Ich nehme mal an, ihr habt zum Abspielen der Sounddatei irgendwo Code, der etwa so aussieht:

Java:
playSound("esel.wav");

dann musst du halt, wenn du die Datei, die abgespielt wird, ersetzen willst, statt "esel.wav" was anderes haben. Mein Vorschlag wäre, du nimmst ein Array:

Java:
String[] dateien=new String[]{"esel.wav", "giraffe.wav", "goldfisch.wav", "gepardenforelle.wav"};

Außerdem eine int- Variable, die dir sagt, bei der wievielten Frage ihr seid. Dabei solltest du bei 0 anfangen zu zählen:

Java:
playSound(dateien[frageCounter]);

sollte dann vom Wert des FrageCounter abhängig machen, welcher Sound kommt. Wenn jetzt eine Frage beantwortet ist, musst du nur den Counter hochzählen.

PS: De facto wäre das das Letzte was ich machen würde, weil es absolut null mit Objektorientierung zu tun hat. Selbst in Erlang (was ja nichtmal Objektorientiert ist) gibt es eine Lösung, die besser kapselt, aber ich weiß halt nicht, ob ihr schon Objektorientierung gemacht habt. Wenn ja, denk mal darüber nach, dass eine "Frage" ein Objekt ist.

PPS: Eure Hausaufgaben müsst ihr schon selber machen, eine ausführlichere Lösung werdet ihr hier nicht bekommen. Aber vielleicht Antworten, wenn eure Fragen etwas weniger Wage sind.
 

Wichi

Mitglied
Vielen dank an Atze und anonym :)
Haben versucht vieles umzusetzen was uns auch größtenteils gelungen ist.
Außerdem ist das keine Hausaufgabe sondern ein längerandauerndes Programmierprojekt.
Unser einziges Problem ist jetzt das Ändern der Elemente in der jList und das Ändern des Sounds.

Hier unser ganzer Programmcode.

Java:
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.ComboBoxModel;
import javax.swing.DefaultComboBoxModel;
import javax.swing.ImageIcon;

import javax.swing.JApplet;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JTextField;
import javax.swing.ListModel;
import javax.swing.SwingUtilities;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import java.applet.*;
import java.io.File;
import java.net.MalformedURLException;
import javax.swing.ImageIcon;
import javax.swing.Icon;
import java.net.URL;


/**
* This code was edited or generated using CloudGarden's Jigloo
* SWT/Swing GUI Builder, which is free for non-commercial
* use. If Jigloo is being used commercially (ie, by a corporation,
* company or business for any purpose whatever) then you
* should purchase a license for each developer using Jigloo.
* Please visit [url=http://www.cloudgarden.com]Cloud Garden (Java Resources)[/url] for details.
* Use of Jigloo implies acceptance of these licensing terms.
* A COMMERCIAL LICENSE HAS NOT BEEN PURCHASED FOR
* THIS MACHINE, SO JIGLOO OR THIS CODE CANNOT BE USED
* LEGALLY FOR ANY CORPORATE OR COMMERCIAL PURPOSE.
*/
public class Beta extends javax.swing.JApplet {
	private JLabel jLabel1;
	private JLabel jLabel2;
	private JLabel jLabel3;
	private JButton jButton1;
	private JTextField jTextField1;
	private JList jList1;
	
	String tier[]=new String[15];
	
	File f;
	AudioClip sound=null;


	/**
	* Auto-generated main method to display this 
	* JApplet inside a new JFrame.
	*/
	
	public static void main(String[] args) {
		SwingUtilities.invokeLater(new Runnable() {
			public void run() {
				JFrame frame = new JFrame();
				Beta inst = new Beta();
				frame.getContentPane().add(inst);
				((JComponent)frame.getContentPane()).setPreferredSize(inst.getSize());
				frame.pack();
				frame.setVisible(true);
				frame.setResizable(false); 
			}
		});

	}
	
	public Beta() {
		super();
		
		
		tier[0] = "Giraffe";
	    tier[1] = "Affe";             // richtige Antwort
	    tier[2] = "Eule";
	     
	    tier[3] = "Löwe";           // richtige Antwort
	    tier[4] = "Vogel";
	    tier[5] = "Katze";
	     
	    tier[6] = "Maus";
	    tier[7] = "Stier";
	    tier[8] = "Hund";          // richtige Antwort
	    
	    tier[9] = "Adler";
	    tier[10] = "Bär";         // richtige Antwort
	    tier[11] = "Antilope";
	    
	    tier[12] = "Papagei";
	    tier[13] = "Zebra";
	    tier[14] = "Wolf";        // richtige Antwort
	    initGUI();
	     f = new File("ton1.wav");
		
		
	}
	
	private void initGUI() {
		try {
			this.setSize(952, 588);
			getContentPane().setLayout(null);
			{
				ListModel jList1Model = 
					new DefaultComboBoxModel(
							new String[] { tier[0], tier[1], tier[2] });
				jList1 = new JList();
				getContentPane().add(jList1);
				jList1.setModel(jList1Model);
				jList1.setBounds(436, 371, 129, 57);
				jList1.addListSelectionListener(new ListSelectionListener() {
					public void valueChanged(ListSelectionEvent evt) {
						jList1ValueChanged(evt);
					}
				});
				jList1.addMouseListener(new MouseAdapter() {
					public void mouseClicked(MouseEvent evt) {
						
					}
				});
			}
			{
				jTextField1 = new JTextField();
				getContentPane().add(jTextField1);
				jTextField1.setBounds(310, 477, 416, 21);
			}
			{
				jButton1 = new JButton();
				getContentPane().add(jButton1);
				jButton1.setBounds(451, 192, 80, 75);
				jButton1.setOpaque(false);
				jButton1.setContentAreaFilled(false);
				jButton1.addActionListener(new ActionListener() {
					public void actionPerformed(ActionEvent evt) {
						jButton1ActionPerformed(evt);
					}
				});
			}
			{
				jLabel3 = new JLabel();
				getContentPane().add(jLabel3);
				jLabel3.setIcon(new ImageIcon(getClass().getClassLoader().getResource("ed.png")));
				jLabel3.setBounds(243, 285, 475, 80);
			}
			{
				jLabel2 = new JLabel();
				getContentPane().add(jLabel2);
				jLabel2.setIcon(new ImageIcon(getClass().getClassLoader().getResource("ko4.png")));
				jLabel2.setBounds(337, 44, 294, 286);
			}
			{
				jLabel1 = new JLabel();
				getContentPane().add(jLabel1);
				jLabel1.setIcon(new ImageIcon(getClass().getClassLoader().getResource("Jungle-stock1113.jpg")));
				jLabel1.setBounds(-954, -390, 1920, 1080);
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	AudioClip ton;
	private void jButton1ActionPerformed(ActionEvent evt) {
		System.out.println("jButton1.actionPerformed, event="+evt);
		//TODO add your code for jButton1.actionPerformed
		
	
		try{
			sound = Applet.newAudioClip( f.toURL() );
		} catch (MalformedURLException e ) {
			e.printStackTrace();
		}
		sound.play();
		
		
		
	}
			  

	private void jList1ValueChanged(ListSelectionEvent evt) {
		System.out.println("jList1.valueChanged, event="+evt);
		//TODO add your code for jList1.valueChanged
		
		String auswahl=(String) jList1.getSelectedValue();
		jTextField1.setText(auswahl);
		
		if(auswahl.equals(tier[1]) ){
			jTextField1.setText("Deine Antwort ist richtig.");
			
			ListModel jList1Model = 
				new DefaultComboBoxModel(
						new String[] { tier[3], tier[4], tier[5] });
			jList1.setModel(jList1Model);
			
		
		}else
		{
			jTextField1.setText("Das ist leider falsch");
	
		}
		
	}
 

Samuel72

Aktives Mitglied
Vorschlag:

Bilde eine Klasse Frage:
Java:
class Frage {
  String[] antworten;
  int richtig;
  File soundfile;
}
Lege im Hauptprogramm ein Array [c] Frage[][/c] an.
Wähle nun zufällig eine Frage aus.
die JList bekommt ein neues DataModel, welches aus [c]antworten[/c] gebildet wird,
und als Sound wird [c]soundfile[/c] abgespielt.
 

Wichi

Mitglied
Meinst du vllt so etwas :

Java:
	String tier[]=new String[15];
	
	File f;
	AudioClip sound=null;
 
Zuletzt bearbeitet:

Atze

Top Contributor
ähm, gehts etwas dezenter? :)

Samuel hatte dir doch schon einen vorschlag gemacht. kommst du damit zurecht? wenn nicht, wo genau hängst denn?
 

Samuel72

Aktives Mitglied
Hallo Wichi,

tut mir leid, ich bin jetzt recht lange nicht dazugekommen, zu antworten.

Vermutlich seid ihr mit Objektorientierung... noch nicht so vertraut und könnt mit meinem Vorschlag, eine eigene Klasse zu bilden, nicht viel anfangen.

Deshalb ein anderer Vorschlag:

Zunächst einmal müsst ihr die Tondateien so umbenennen, dass sie die richtigen Namen haben
(also etwa "Affe.wav").
Bildet nun ein array [c]String[] tiernamen[/c], welches alle Tiernamen enthält.

Nun könnt ihr aus diesem Array (zufällig) drei Strings auswählen: die richtige und zwei falsche Antworten,
und daraus das DataModel für jlist sowie das File f bestimmen.
Dies geschieht in einer Methode [c]set()[/c].
Diese Methode wird aufgerufen beim Programmstart, sowie nachdem eine richtige Antwort ausgewählt wurde.
 

Wichi

Mitglied
Vielen Dank . Werden versuchen die Vorschläge in die Tat umzusetzen :)


Werde das fertige Programm vllt. hier herein posten , wäre dann sehr erfreut über Feedback bzw Verbesserungsvorschläge.

Grüße an alle :)
 

Neue Themen


Oben