Die Klasse Monster

Du übergibst ja schon ein erstelltes Monster-Objekt an den Konstruktor von MonsterCheck, daher brauchst du kein neues mit new erstellen.

Da der Parameter im Konstruktor ebenfalls monster heisst kann man nicht
monster = monster;
schreiben, da du nur den Parameter sich selbst zuweisen würdest. Mit this.monster sagst du dass du das Feld monster der Klasse MonsterCheck meinst und nicht den Parameter den du übergeben hast.

In den Spinner kannst du die Zahlen auch eintippen und musst nicht unbedingt die hoch und runter Buttons benutzen.
 
weil eigentlich müsste ich ja sagen monster = new Monster() aber bei dem this ist es nicht so...
Du hast schon ein neues Object Monster angelegt Und zwar vorher
Java:
      Monster monster = new Monster();
      MonsterCheck check = new MonsterCheck(monster);
      check.init();
Dort in Zeile 1 :D
 
Nochmals vielen vielen Dank für eure Hilfe!
Ich mach jetzt erst mal alles und meld mich dann wieder wenn ich fertig bin :) oder wenn ich wieder Hilfe brauche :rolleyes:
 
Hi!

leider hab ich doch noch paar probleme :( Ich benutze das SpinnerNumberModel weil ich denke das es der nützlichste Spinner in meinem Fall ist ABER

- der kann nur Integer Werte annehmen (also bei den Steps)
- und ich kann den das Number Modell nicht mit setBounds positionieren

mach ich vllt was falsch :confused:

Code:
public class MonsterCheck 
{
	private SpinnerNumberModel spi_food;
	
	private void init()
	{
	    Integer value = new Integer(50); 
	    Integer min = new Integer(0);
	    Integer max = new Integer(100); 
	    Integer step = new Integer(1); 
	    spi_food = new SpinnerNumberModel(value, min, max, step);
             }
}

//Änderung
Das mit dem setBounds hat sich nun gelöst ich musste das NumberModell in einem JSpinner einbetten doch wie Löse ich nun das Problem für die Long und Double Werte kann doch nicht so große Objekte per hand anlegen :confused: und ich würde gerne die Zahlen im Spinner markieren wenn man die Zahl per hand eingeben will das man nicht erst Zahlen löschen muss sondern sie mit der Eingabe gleich überschreibt (vergleichbar mit dem inet exploerer wenn man rein klickt wird die url gleich markiert...) naja ich geh jetzt erst mal feiern und versuchs morgen weiter :P

Grüße
 
Zuletzt bearbeitet:
Der Spinner funktioniert durchaus auch mit Double und Long Werten. Wie gesagt du kannst dort wo die Zahl steht auch einfach was eintippen wie in ein normales Textfeld. Und wenn du die Stepsize entsprechend höcher setzt ist das mit den Buttons da am Rand auch kein großes Problem bis zu 3 Millionen entsprechend schnell vorran zu kommen.

Kürzer ist es übrigens so:
Java:
spi_food = new SpinnerNumberModel(new Integer(50), new Integer(0), new Integer(100), new Integer(5));

Stattdessen kannst du halt auch new Double oder new Long benutzen.

Edit: Wenn du hier mal guckst in der Dokumentation http://java.sun.com/javase/6/docs/api/javax/swing/SpinnerNumberModel.html siehst du auch dass das stimmt was ich so rede ;) Als step kannst du auch Number übergeben und wenn du auf Number klickst siehst du unter "Direct Known Subclasses" auch was alles eine Number ist.
 
Zuletzt bearbeitet:
Hi

jetzt bin ich eigentlich so weit fertig *freu* :D aber einige kleine Fragen hab ich noch

1. Ich will ein Objekt zum Integer parsen klappt aber nicht... also mach ich zuerst nen String dann nen Integer aus dem Objekt geht des auch einfacher?
2. Ich würde gern den Eintrag der JSpinner markieren wenn man rein klickt geht das auch irgendwie (ähnlich der Explorer Ansicht wie in dem post davor schon beschrieben)
3. Ich krieg keine 3 Mrd. bei dem Long hin geht des überhaupt?
4. Könnte ich noch irgendne Rückmeldung bekommen wie die Überprüfung des Textfeld Name ist

auf alle Fälle hier mal mein fertiger Code:
Code:
import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JSpinner;
import javax.swing.JTextField;
import javax.swing.SpinnerNumberModel;

public class MonsterCheck 
{
	private JFrame frame;
	private JButton bt_erstell;
	private JLabel lb_name;
	private JLabel lb_gewicht;
	private JLabel lb_hits;
	private JLabel lb_food;
	private JLabel lb_resist;
	private JLabel lb_magic;
	private JComboBox box_resist;
	private JComboBox box_magic;
	private JSpinner spi_gewicht;
	private JSpinner spi_hits;
	private JSpinner spi_food;
	private JTextField tf = new JTextField();
	private Monster monster = new Monster();
	
	private void init()
	{
		/*Das Fenster*/
		frame = new JFrame("Monster Check");
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setResizable(false);
		
		/*JButton*/
		bt_erstell = new JButton("Erstellen"); 
		
		tf.addKeyListener(new KeyListener()
		{
			public void keyPressed(KeyEvent e) {}
			public void keyReleased(KeyEvent e) {}
			public void keyTyped(KeyEvent e) {
				if(tf.getText().length() > 20){
					tf.setText(tf.getText().substring(0, 19));
				}
			}
		});
		
		/*ActionListener vom JButton*/
		bt_erstell.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent e){
				monster.setName(tf.getText());			
				monster.setGewicht(Double.parseDouble(String.valueOf(spi_gewicht.getValue())));
				monster.setHitPoints(Long.parseLong(String.valueOf(spi_hits.getValue())));
				monster.setFoodUsage(Integer.parseInt(String.valueOf(spi_food.getValue())));
				
				int res_auswahl = box_resist.getSelectedIndex();

				if(res_auswahl == 0){
					monster.setResistTyp("Fire");
				}
				else if(res_auswahl == 1){
					monster.setResistTyp("Lightning");
				}
				else if(res_auswahl == 2){
					monster.setResistTyp("Ice");
				}
				else if(res_auswahl == 3){
					monster.setResistTyp("Nothing");
				}
				
				int ma_auswahl = box_magic.getSelectedIndex();
				
				if(ma_auswahl == 0){
					monster.setMagicAttacker(true);
				}
				else if(ma_auswahl == 1){
					monster.setMagicAttacker(false);
				}
				
				System.out.println(monster.getName());
				System.out.println(monster.getGewicht());
				System.out.println(monster.getHitPoints());
				System.out.println(monster.getFoodUsage());
				System.out.println(monster.getResistTyp());
				System.out.println(monster.getMagicAttacker());
			}
		});
		
		/*Die Labels*/
		lb_name 	= new JLabel("Name:");
		lb_gewicht 	= new JLabel("Gewicht:");
		lb_hits 	= new JLabel("Hit Points:");
		lb_food 	= new JLabel("Food Usage:");
		lb_resist 	= new JLabel("Resist Typ");
		lb_magic	= new JLabel("Magic Attacker");
		
		/*Die ComboBoxen*/
		String resTyp[] = {"Fire", "Lightning", "Ice", "Nothing"};
	    box_resist = new JComboBox();
	    
	    for ( int i = 0; i < resTyp.length; i++ )
	    	box_resist.addItem( resTyp[i] );
	    
		String magic[] = {"Yes", "No"};
	    box_magic = new JComboBox();
	    
	    for ( int i = 0; i < magic.length; i++ )
	    	box_magic.addItem( magic[i] );
	    
	    SpinnerNumberModel mo_gewicht = new SpinnerNumberModel(new Double(100.0), new Double(10.0), new Double(200.0), new Double(0.01));
	    spi_gewicht = new JSpinner(mo_gewicht);
	     
	    SpinnerNumberModel mo_hits = new SpinnerNumberModel(new Long(100), new Long(0), new Long(300000000), new Long(1));
	    spi_hits = new JSpinner(mo_hits);
	    
	    SpinnerNumberModel mo_food = new SpinnerNumberModel(new Integer(50), new Integer(0), new Integer(100), new Integer(1)); 
	    spi_food = new JSpinner(mo_food);
	    
	    tf.setHorizontalAlignment(JTextField.RIGHT);
	    
		/*Positionieren der Elemente*/
	    Container c = frame.getContentPane();
	    c.setLayout( null );
	    
	    int lb_breite = 100;
	    int tf_breite = 150;
	    
	    lb_name.setBounds		( 10, 10, lb_breite, 20);
	    lb_gewicht.setBounds	( 10, 40, lb_breite, 20);
	    lb_hits.setBounds		( 10, 70, lb_breite, 20);
	    lb_food.setBounds		( 10,100, lb_breite, 20);
	    lb_resist.setBounds		( 10,130, lb_breite, 20);
	    lb_magic.setBounds		( 10,160, lb_breite, 20);
		
	    tf.setBounds			(120, 10, tf_breite, 20);
	    spi_gewicht.setBounds	(120, 40, tf_breite, 20);
	    spi_hits.setBounds		(120, 70, tf_breite, 20);
	    spi_food.setBounds		(120,100, tf_breite, 20);
	    
	    box_resist.setBounds	(120,130, tf_breite, 20);
	    box_magic.setBounds		(120,160, tf_breite, 20);
	    
	    bt_erstell.setBounds	(170,190, lb_breite, 20);
	    	    	    
	    /*Container füllen*/
	    c.add(lb_name); c.add(lb_gewicht); c.add(lb_hits); c.add(lb_food);
	    c.add(lb_resist); c.add(lb_magic); c.add(bt_erstell); c.add(box_magic);
	    c.add(box_resist); c.add(tf); c.add(spi_gewicht); c.add(spi_hits); c.add(spi_food);
	    
	    /*Fenster Eigenschaften*/
		frame.setSize(290, 245);
		frame.setVisible(true);
	}
	
	public static void main(String [] args)
	{
		/*Objekt Monster*/
		MonsterCheck monster = new MonsterCheck();
		monster.init();
	}			
}

Danke schon mal

Grüße
 
Hi,

da hast ja ganz gut was gelernet in den letzten Tagen.

1. Ich will ein Objekt zum Integer parsen klappt aber nicht... also mach ich zuerst nen String dann nen Integer aus dem Objekt geht des auch einfacher?

Zu deiner ersten Frage:
In diesem Fall geht das einfacher, denn das Object was du bekommst ist schon ein Double, Integer etc und du musst es nur casten. Es wird nur als Object zurückgegeben weil es ja theoretisch alles sein könnte.

Folgendes geht also auch:
Java:
monster.setGewicht((Double)spi_gewicht.getValue());

Gleiches gilt auch für deine Comboboxen. Dort kannst du auch
Java:
String selected = (String) combo.getSelectedItem();

Dann brauchst du das nicht über den Index machen, weil du dann ja z.B. die Resistenztypen an zwei Stellen ändern müsstest wenn es denn mal geändert werden soll.

Schöner wäre es noch ein enum zu benutzen. Kannst ja deinen Lehrer mal nach fragen oder selber nachlesen.

2. Ich würde gern den Eintrag der JSpinner markieren wenn man rein klickt geht das auch irgendwie (ähnlich der Explorer Ansicht wie in dem post davor schon beschrieben)

Klar geht das. Frag mich nicht wie ;) Hab eigentlich mit Swing nicht viel zu tun.

3. Ich krieg keine 3 Mrd. bei dem Long hin geht des überhaupt?

Du kannst dir mit Integer.MAX_VALUE bzw Long.MAX_VALUE angeben lassen was die größte zur Verfügung stehende Zahl ist die in den Datentyp reinpasst. Bei Long ist gaaaanz viel Platz kannst dir ja mal anschauen. Du musst nur dran denken dass du zur Angabe eines Long ein großes L hinter die Zahl schreiben musst, ansonsten ist es ein Integer. Dann klappts auch mit den 3 Milliarden.

4. Könnte ich noch irgendne Rückmeldung bekommen wie die Überprüfung des Textfeld Name ist

Das hast du doch schon wunderbar hinbekommen. Nur denk nochmal über die > 20 nach. Denk dabei immer daran dass man bei einer Länge anfängt bei 1 zu zählen, bei einem Index aber bei 0.
 
Morgen!

Also erst mal vielen vielen Dank das du mir geholfen hast, vor allem so lang :D nun haben wir es hinter uns gebracht war ja ne schwere geburt :)

Nur zu dem hier noch:
"In diesem Fall geht das einfacher, denn das Object was du bekommst ist schon ein Double, Integer etc und du musst es nur casten. Es wird nur als Object zurückgegeben weil es ja theoretisch alles sein könnte."

Folgendes geht also auch:
Code:
monster.setGewicht((Double)spi_gewicht.getValue());
Das Casten in dem Fall ging irgendwie nicht aber das Casten für die Comboboxen war ne super Lösung :)

Aber jetzt haben wir alles geschafft nochmals danke für die tolle Hilfe ;)

Grüße!
 
Zurück