Objekt zurück geben

DataFox

Erfahrenes Mitglied
Hallo

Ich bastel gerade zwecks Übung einen Taschenrechner und habe eine Klasse geschrieben, welche die Tasten für den Nummernblock erstellt.

Man übergibt dem Konstruktor einen int (z.b. 5 für die Taste "5"), und zurück kommt ein Button-Objekt, mit dem man dann in einer anderen Klasse weitermachen kann. Soweit die Theorie...

Code:
package viewControl;

import java.awt.*;

public class NumFieldButton {
	
	Button btn;
	
	public NumFieldButton(int num) {
		Button btn = new Button((new Integer(num).toString()));
		
		Color foregroundColor = Color.decode("#ffffff");
		Color backgroundColor = Color.decode("#0000ff");
		
		btn.setForeground(foregroundColor);
		btn.setBackground(backgroundColor);
	}
	
	public Button getNumFieldButton() {
		return btn;
	}
	
}

vermutlich ist mein Ansatz falsch?

In Start.java passiert folgendes:

Code:
package viewControl;

import java.awt.*;
import java.awt.font.*;

public class Start {

	/**
	 * @param args
	 */
	public static void main(String[] args) {

...schnipp...

		Container buttonFieldContainer = new Container();
		buttonFieldContainer.setLayout(new GridLayout(4,4));

		Object[] numFieldButtons = new Object[3];
		for(int i=7; i < 9; i++) {
			numFieldButtons[i] = new NumFieldButton(i);
			buttonFieldContainer.add(numFieldButtons[i].getNumFieldButton());
		}

...schnapp...

die ersten drei Buttons auf dem Nummernblock, also die 7, 8, 9 werden in einer Schleife erstellt.

Wo liegt der Wurm, das ich kein Button-Objekt von der Klasse zurück bekomme? Eigentlich müsste es ja ein NumFieldButton-Objekt sein, das aber alles kann was auch ein Button-Objekt so drauf hat.

Hoffe mir kann jemand helfen. thx

Laura
 
Moin,
am einfachsten wäre das mit ner andern variante..
Wenn du schreibst

public class NumFieldButton extends Button{
....
Kannst du deinen Button in der Klasse beliebig verändern und ihn dann in der andern Klasse einfach als Button verwenden; heißt: du kannst einfach scvhrewiben
add(new NumFieldButton(5));

Diese zeile ist insofern quatsch, da du gar keinen neuen Integer bracuhst,, der existiert ja schon:
Button btn = new Button((new Integer(num).toString()));
Richtig wäre Button btn = new Button(String.valueOf(num));

Hmm ich vermute dass der richtige fehler nicht unbedingt in diesen zeilen liegt^^ sondern woanders; fügst du deunen Container denn auch richtig hinzu bzw hast du probiert ob er angezeigt wird?

Was ist der Zweck des Arrays Object[] numFieldButtons = new Object[3];?
Wenn du später nicht drauf zugreifen willst reciht da vollständig eine for-schleife die dir nacheinander einfach einen neuen Button erstellt....
Sähe in der Theorie so aus wenn du den NumFieldButton von Button ableitest:

Code:
package viewControl;

import java.awt.*;

public class NumFieldButton extends Button{
	public NumFieldButton(int num) {
                this.setText(String.valueOf(num));
		Color foregroundColor = Color.decode("#ffffff");
		Color backgroundColor = Color.decode("#0000ff");
		
		this.setForeground(foregroundColor);
		this.setBackground(backgroundColor);
	}	
}


Code:
package viewControl;

import java.awt.*;
import java.awt.font.*;

public class Start {

	/**
	 * @param args
	 */
	public static void main(String[] args) {

...schnipp...

		Container buttonFieldContainer = new Container();
		buttonFieldContainer.setLayout(new GridLayout(4,4));
		for(int i=7; i < 9; i++) {
			buttonFieldContainer.add(new NumFieldButton(i));
		}

                /*Schau hier nochmal nach ob dein Container richtig angezeigt wird.. ansonsten probiers mal mit dem JPanel*/
...schnapp...

Mfg, Orbit
 
Moin!
Auch nur mal so am Rande: Der "richtige" Fehler liegt hier begraben:


Code:
public class NumFieldButton {
    
    Button btn;
    
    public NumFieldButton(int num) {
        Button btn = new Button((new Integer(num).toString()));
     ...
    }
Du erstellst hier ein neues lokales Button Objekt. Richtig müsste es heißen:
Code:
public class NumFieldButton {
    
    Button btn;
    
    public NumFieldButton(int num) {
       btn = new Button((new Integer(num).toString()));
     ...
    }

Weiterhin kann das auch nicht funktionieren:
Code:
Object[] numFieldButtons = new Object[3];
		for(int i=7; i < 9; i++) {
			numFieldButtons[i] = new NumFieldButton(i);
			buttonFieldContainer.add(numFieldButtons[i].getNumFieldButton());
		}

Entweder musst du bei
Code:
buttonFieldContainer.add(numFieldButtons[i].getNumFieldButton());
nach NumFieldButton casten oder du erstellst gleich ein Array vom Typ NumFieldButton

Dessen allen ungeachtet würde ich es auch eher so machen , wie es Orbit schon demonstriert hat...


*grüssle*
MeinerEiner
 
Zuletzt bearbeitet von einem Moderator:
Super! Ich danke euch. Ich habe jezt meine NumFieldButton-Klasse von der Button-Klasse abgeleitet, so das mit der Instanziierung der Klasse NumFieldButton direkt bzw. indirekt ein Button-Objekt erzeugt wird und ich schön Zugriff auf alle Methoden habe.

Das Tastenfeld erstelle ich jetzt so:

Code:
		Container buttonFieldContainer = new Container();
		buttonFieldContainer.setLayout(new GridLayout(3,3));

		NumFieldButton[] nfbuttons = new NumFieldButton[9];
	
		for(int i = 7; i<=9; i++) {
			nfbuttons[i-1] = new NumFieldButton(i);
			buttonFieldContainer.add(nfbuttons[i-1]);
		}

		for(int i = 4; i<=6; i++) {
			nfbuttons[i-1] = new NumFieldButton(i);
			buttonFieldContainer.add(nfbuttons[i-1]);
		}
		
		for(int i = 1; i<=3; i++) {
			nfbuttons[i-1] = new NumFieldButton(i);
			buttonFieldContainer.add(nfbuttons[i-1]);
		}
		
		centerContainer.add(buttonFieldContainer);

ich bekomme jetzt auch ein Fenster mit diesen neun Buttons. Jetzt werde ich versuchen die Buttons mit Funktion zu "beleben". Vielleicht muss ich euch dazu nochmal befragen, wenn ich nicht weiter komme ;)

Gruß
Laura

Edit: in NumFieldButton.java gibt mir Eclipse eine Warnung aus:
Code:
public class NumFieldButton extends Button {
"The serializable class NumFieldButton does not declare a static final serialVersionUID field of type long"

---> was will Eclipse mir damit sagen?
 
Zuletzt bearbeitet:
Zurück