Zugriff über mehrere Klassen hinweg - wie?

DataFox

Erfahrenes Mitglied
Hallo

Ich habe die Klassen für meinen Taschenrechner in 3 Pakete verteilt:

- model

- view

- control

Das "dumme" daran ist, das ich die einzelnen Elemente des Taschenrechners durch eigens dafür gebaute Klassen gebaut habe.

Im Package "control" finden sich die Klassen:

Display.java
Calculator.java [Hauptklasse mit main()-Methode]
InputField.java


im Package "view":

DisplayLine.java
CalculatorWindow.java
NumFieldButton.java


In der Hauptklasse, also Calculator.java, wird der ganze Taschenrechner zusammengeschustert. Das mehrzeilige Display wird durch instanziierung der Display-Class erzeugt, dann wird das InputField instanziiert, dann kommen die Knöpfe, usw.

Das Problem:
Ich habe aus der NumFieldButton-Klasse keinen Zugriff auf das Texteingabefeld!
Das Texteingabefeld wird ja in der main()-Methode instanziiert, von wo aus auch unter anderem die Klasse zur generierung des Keypads (NumFieldButton) instanziiert wird.

Ich hoffe ihr versteht was ich meine... es macht wahrscheinlich keinen Sinn in der InputField-Klasse ein statisches value anzulegen, und dann an jeder anderen Stelle in anderen Klassen immer wieder ein InputField zu instanziieren nur um auf den value zugreifen zu können...wie würdet ihr das machen Oder habe ich in Bezug auf Sichtbarkeiten von Klassen, Objekten und Variablen irgend etwas verpasst?

Hoffe ihr könnt mir helfen :)

danke
Laura
 
Du kannst auch etwas unsaubere methode verwenden und bei der Instanziierung von NumFieldButton disere Klasse auch das InputField mitgeben.

Oder, was etwas sauberer ist, erzeug dir einen Listener.
 
hmm... genau an der Stelle mit dem Listener hänge ich fest.


Hier mal die relevanten Klassen...

Calculator.java im Package control
Code:
package control;

import view.*;

public class Calculator {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		new CalculatorWindow();
	}
	
	public void handleInputEvent() {
		
	}
	
}
oben: enthält die main()-Methode und instanziiert ein Taschenrechnerfenster


CalculatorWindow.java im Package view
Code:
package view;

import java.awt.*;

import control.*;


/*
 * 
 * Hier wird der Taschenrechner grafisch zusammengebaut
 * 
 */

public class CalculatorWindow extends Frame {
	
	// The serializable class CalculatorWindow does not declare a static final serialVersionUID field of type long
	private static final long serialVersionUID = 4749297103003880957L;

	public CalculatorWindow() {
		super("Mein Taschenrechner 1.0");
		
		pack();
		setLayout(new BorderLayout(10,10));
		setSize(300,480);
		setResizable(false);
		
		addWindowListener(new WindowClosingAdapter(true));
		
		// Display mit 5 Zeilen starten
		Display display = new Display(5);
		
		Panel displayPanel = new Panel();
		Color panelBgColor = Color.decode("#113311");
		displayPanel.setLayout(new GridLayout(display.getNumLines() + 1,0,1,1));
		displayPanel.setBackground(panelBgColor);
		
		// Zeilen des Displays auf das Panel legen
		for(int i=0; i<=(display.getNumLines() - 1); i++) {
			displayPanel.add(display.getDisplayLine(i));
		}
		
		// Eingabefeld erzeugen
		InputField input = new InputField();
		displayPanel.add(input);
				
		Container centerContainer = new Container();
		centerContainer.setLayout(new FlowLayout(FlowLayout.CENTER));
		
		Container buttonFieldContainer = new Container();
		buttonFieldContainer.setLayout(new GridLayout(4,3,5,5));
		
		Container bottomContainer = new Container();
		bottomContainer.setLayout(new FlowLayout(FlowLayout.CENTER));
			
		NumFieldButton[] nfbuttons = new NumFieldButton[10];
	
		for(int i = 7; i<=9; i++) {
			nfbuttons[i] = new NumFieldButton(i);
			buttonFieldContainer.add(nfbuttons[i]);
		}

		for(int i = 4; i<=6; i++) {
			nfbuttons[i] = new NumFieldButton(i);
			buttonFieldContainer.add(nfbuttons[i]);
		}
		
		for(int i = 1; i<=3; i++) {
			nfbuttons[i] = new NumFieldButton(i);
			buttonFieldContainer.add(nfbuttons[i]);
		}
		
		nfbuttons[0] = new NumFieldButton(0);
		buttonFieldContainer.add(nfbuttons[0]);
		
		centerContainer.add(buttonFieldContainer);
		
		Label headerLabelVersion = new Label("V 1.0");
		headerLabelVersion.setFont(new Font("System", Font.PLAIN, 9));
		
		Label footerLabel = new Label("viel spaß beim rechnen!");
		footerLabel.setFont(new Font("System", Font.ITALIC, 9));
		
		bottomContainer.add(footerLabel);
				
		add(displayPanel, "North");
		add(centerContainer, "Center");
		add(bottomContainer, "South");
		
		setVisible(true);
	}

}

NumFieldButton.java im Package view
Code:
package view;

import java.awt.*;
import java.awt.event.*;

public class NumFieldButton extends Button {
	
	// The serializable class NumFieldButton does not declare a static final serialVersionUID field of type long
	private static final long serialVersionUID = 4749297103003880957L;
		
	public NumFieldButton(int num) {
		this.setLabel(String.valueOf(num));
		this.setFont(new Font("System", Font.BOLD, 25));
		
		Color foregroundColor = Color.decode("#ffffff");
		Color backgroundColor = Color.decode("#0000ff");
		
		this.setForeground(foregroundColor);
		this.setBackground(backgroundColor);
		
		this.addActionListener(new numButtonActionListener());
	}
	
	class numButtonActionListener implements ActionListener {
		public void actionPerformed(ActionEvent e) {
			System.out.println("Taste gedruekt");
			// ...hier will ich jetzt eigentlich auf die InputField-Klasse zugreifen
// Die InputField-Klasse erbt von TextField, ist also ein TextField
		}
	}
		
}


InputField.java im Package control
Code:
package control;

import java.awt.*;

public class InputField extends TextField {
	// The serializable class InputField does not declare a static final serialVersionUID field of type long
	private static final long serialVersionUID = 4749297103003880957L;
		
	//neu eingegebenes Zeichen an Eingabe hängen
	public void add(String symbol) {
		String currentInput = getText();
		currentInput.concat(symbol);
		setText(currentInput);
	}
	
	//letztes Zeichen löschen
	public void delete() {
		String currentInput = getText();
		if(currentInput.length() > 0) {
			setText(currentInput.substring(0, currentInput.length() - 2));
		}
	}
}


Was ich noch nicht ganz schnalle ist, wie das große Applikationen machen. Da gibt es doch hunderte Klassen nur für das GUI, die irgend etwas darstellen, z.b. Menüs, Formulare usw... wie kann ich von jeder beliebigen Klasse aus z.B. auf ein ganz bestimmtes Eingabefeld zugreifen?

Ich will ja nicht in jeder Klasse die Klasse für das Eingabefeld oder Formular neu instanziieren, denn das bringt ja nicht viel - ausser einen riesen Overhead. Irgendwas sagt mir ich muss etwas mit dem Schlüsselwort static machen.

komm iwi nicht weiter :confused:

Gruß
Laura
 
Hi,

google mal nach Design Patterns und dort Speziel Eventreporting, gibts auch Speziel erklärt für Java, das dürfte auch dass sein was du suchst

hmf
 
Mit dem Abfangen der Events habe ich ja keine Probs :)

Es ist nur ein bissl umständlich auf eine Klasse aus einem anderen Paket zuzugreifen. Lookie:

Code:
Calculator.getCalculatorWindow().getDisplay().update(operationType, inputNumber, result);

Ich hangel mich auf diese weise immer quer durch die Pakete und Klassen, in dem ich immer über die Mein-Methode auf die Klasse zugreife, welche das GUI erzeugt (also den Taschenrechner). Und von da aus dann auf die Elemente wie z.b. das Display oder die Tasten... schätze mal das kann man auch ein bisschen schlauer machen. Habe überall get-Methoden drin damit die instanziierten Klassen bzw. deren Objekte durchgereicht werden können. Ist das dumm oder schlau?

Gruß
Laura
 
Prinzipjel ist es klug geter und seter zu verwenden...
Das "durchhangeln" ist normal, wenn du es noch etwas scalierbarer machen möchtest empfehle ich Interface zu benutzen...

gruß
 
Auch das arbeiten mit Generics hat beim Durchhangel einige Vorteile. Zum Beispiel spart man sich bei internen Datenstrukturen das Parsen, wenn man Elemente aus der Struktur holt.

Bsp:

Code:
ArrayList<Person> meineFamilie =  new ArrayList<Person>();
...

Angenommen die Klasse Person definiert nun eine public Objektmethode

public String getName();

so kann man bei den Elementen in der ArrayList einfach per
Code:
meineFamilie.get(i).getName();

zugreifen.

Arbeite man auf Grund der JavaVersion (Genereics werden glaube ich erst seit 1.5 unterstützt) ohne generics säh das ganze ca so aus.

Code:
ArrayList meineFamilie = new ArrayList();

Person ich = (Person) meineFamilie.get(i);

ich.getName();
 

Neue Beiträge

Zurück