Vererbung Methoden in klassen auslagern und in mehreren Klassen verfügbar machen

kneubi

Mitglied
Hallo zusammen

Dieses mal eine Frage zu den Basics im Java...

Meine GUI extenden alle die Klasse "javax.swing.JFrame" weil ich die GUIs mit Swing erstellt habe..

Nun habe ich aber z.B. Methoden die mir "Fehlermeldungen" ausgeben falls irgendwo einen Fehleintrag gemacht wurde.. Diese Meldungen gebe ich aktuell mit folgenden Code aus:


Java:
JOptionPane.showMessageDialog(null, strText, strTitel, JOptionPane.ERROR_MESSAGE);

Ich habe aber insgesamt 4 verschiedene GUI's wo ich diese überall verwenden möchte... aus diesem Grund habe ich eine eigene Klasse erstellt mit dem Namen "Messages"

Java:
package Daten;

import javax.swing.JOptionPane;

public class Messages extends javax.swing.JFrame {
	public static void MessageBox( String selection){
		String strTitel ="";
		String strText = "";
		String strSelection = selection;
		if(strSelection == "noPlayerNameNew"){
			strText = "Es konnte kein Spieler angelegt werden da Sie keinen Spielernamen angegeben haben.";
			strTitel = "Kein Spielername eingegeben!";
		}if (strSelection == "noPlayerNameDel"){
			strText = "Es ist kein Spieler vorhanden den man löschen könnte.";
			strTitel = "Kein Spieler vorhanden!";
		}if (strSelection == "noArmyNameNew"){
			strText = "Es konnte keine Armee angelegt werden da Sie keinen Armeenamen angegeben haben.";
			strTitel = "Kein Armeename eingegeben!";
		}if(strSelection == "noArmyNameDel"){
			strText = "Es ist keine Armee vorhanden die man löschen könnte.";
			strTitel = "Keine Armee vorhanden!";		
		}if(strSelection == "noPlayerSelected"){
			strText = "Kein Spieler ausgewählt.";
			strTitel = "Kein Spieler ausgewählt!";
		}if(strSelection == "noArmySelected"){
			strText = "Keine Armee ausgewählt.";
			strTitel = "Keine Armee ausgewählt!";
		}if(strSelection == "noNameGiven"){
			strText = "Bitte geben Sie einen Namen ein.";
			strTitel = "Eingabe fehlt!";		
		}if(strSelection == "noPointsGiven"){
			strText = "Sie haben die Punktekosten nicht angegeben.";
			strTitel = "Eingabe fehlt!";
		}if(strSelection == "notEnoughtIAP"){
			strText = "Sie besitzen nicht genügend IAP!";
			strTitel = "Nicht genügend Punkte";
		}if(strSelection == "notEnoughtTAP"){
			strText = "Sie besitzen nicht genügend TAP!";
			strTitel = "Nicht genügend Punkte";
		}
		JOptionPane.showMessageDialog(null, strText, strTitel, JOptionPane.ERROR_MESSAGE);
	}
}

Wie ihr seht habe ich diese Klasse dem javax.swing.JFrame angehängt damit ich mit meinen GUI's die Methode aufrufen kann...

Gibt es da eine bessere / elegantere Lösung? Wenn ich es im Java richtig verstehe kann eine Klasse nur eine "vererbung" haben... Könnte ich das ganze schöner Lösen?

Ziel meines auslagern ist es dass alle "Fehlerausgaben" zusammengefasst sind und ich diese nicht quer überall im Code 10x anpassen muss.

Vielen Dank für eure Hilfe

Gruss
Kneubi

PS: Ich versuche meinen Code zu optimieren... wenn es elegantere oder Verbesserungsvorschläge gibt bin ich gerne bereit solche auch anzunehmen... ich bin nun seit ca. 4 Monaten am Javaprogrammieren und bringe mir alles selber bei.. Java ist auch meine erste Objektorientierte Programmiersprache die ich lerne... Aktuell schreibe ich immer sehr viel mit "Public"-Variabeln.. diese versuche ich nun möglichst umzubauen... ich habe auch endlich angefangen Getter und Setter zu verwenden...
 
Du kannst auch ein "Service" machen: ein Objekt welches eine oder mehrere "showErrorMessage"-Methode anbietet und herumgereicht wird. Ist vielleicht für diesen Fall jetzt etwas Übertrieben, aber kann gerade bei komplexeren Probleme interessant werden. Wenn du noch was lustiges machen willst, wie mehrere Fehlermeldungen zusammenfassen, oder ein Log schreiben, würde ich auf jeden Fall Richtung "Service" gehen.

P.S. benutz lieber eine Enumeration um Fehlerzustände abzubilden, mit Strings vertippt man sich so schnell... den Text kannst du direkt in der Enumeration speichern.
 
Zuletzt bearbeitet von einem Moderator:
Hallo erstmal und vielen Dank für deine Antwort.

Ich nehme an mit der "Map" Meinst du eine Hash-Map?

Habe mir das Thema Hash-Map bereits einmal angeschaut, bisher habe ich aber nur mit ArrayLists gearbeitet... bin es mir gewohnt mit Indexen zu arbeiten... Hash-Map ist ja sozusagen eine ArrayList nur hat man noch einen "Referenznamen" anstatt eines Indexes?


Könntest du mir vielleicht noch einen Link zu einem einfachen Enumerationbespiel zukommen lassen? bzw. einen "minimalcode"? Ich bin gerade bei im Internet an der suche wie dies funktioniert.. da ich eine Enumeration noch nie verwendet habe... allerdings bisher noch nichts gefunden das für mich verständlich ist...In Java gibts wohl für alles bereits irgendetwas "vordefiniertes" das man verwenden kann.. nur sollte man wissen wie dies heisst und funktioniert

WAs mir noch eingefallen ist... wenn ich anstatt "extends" einen Import meiner Klasse mache.. funktioniert dies identisch?

Ich habe nie ganz begriffen was der unterschied zwischen "import" und "Extends" ist...
 
Wie bereits angedeutet, solltest Du eine Methode haben, die über Enums "getrieben" wird und nicht über String gehen.
Methoden sollten auch mit einem Kleinbuchstaben beginnen und ein Verb darstellen.
Java:
 public static void showMessageBox((ErrorCode errorCode)
Weiterhin kannst Du dir MessageFormat und auch ResourceBundles näher anschauen, da doch recht häufig Parameter übergeben werden, die in Fehlermeldungen eingefügt werden wollen. Diese Texte möchte man aber praktisch nie im Java-Code, sondern besser in ResourceBundles ausgelagert haben.

"Meine" Message-Klasse würde von gar nichts erben!
Java:
public class Messages
 
Zuletzt bearbeitet:
WAs mir noch eingefallen ist... wenn ich anstatt "extends" einen Import meiner Klasse mache.. funktioniert dies identisch?

Ich habe nie ganz begriffen was der unterschied zwischen "import" und "Extends" ist...

Import: Auf die importierte Klasse kann zugegriffen werden ohne den vollen Namen zu benutzen.

z.B. kannst du nach dem import von javax.swing.JOptionPane diese so benutzen:

Java:
JOptionPane.irgendEineMethode()

ohne den Import müsstest du den vollen Klassennamen angeben:

Java:
javax.swing.JOptionPane.irgendEineMethode()

Extends dagegen ändert tatsächlich deine aktuelle Klasse und drückt soviel aus wie "Meine Klasse verhält sich wie die Klasse von der ich erbe" bzw "Meine Klasse ist ein Spezialfall der Klasse von der ich erbe"

Erben von JFrame ist übrigens kein guter Stil (http://www.java-forum.org/blogs/firephoenix/182-leidige-extends-jframe.html)

Auf alle Fälle empfehle ich dir, dich genauer in die Objektorientierung einzuarbeiten:
Galileo Computing :: Objektorientierte Programmierung - Das umfassende Handbuch

Dann wird auch schnell klar, wann man wie erbt, bzw wann das erben nicht sinnvoll ist.

Weitere Sprachgrundlagen (imports, Klassenaufbau, ...) findet man per google relativ gut.

Gruß
 
Mit "x extends y" baust du eine "x ist ein y" Beziehung.
Mit "import x.y.z" sagst du dem Compiler, dass wenn er ein "z" sieht, er in wirklichkeit ein "x.y.z" sieht.

Imports nehmen dir Schreibarbeit ab, haben aber ansonsten keinen Einfluss. Extends (Vererbung) geht *viel* tiefer, sie hat einen Einfluss wie die Daten in deinem Programm fliessen.


Ich habe zwar meinen Text editiert, aber ja, eine HashMap wäre ok. Der Vorschlag von turtle find ich allerdings besser als meine eigener.

Eine Enumeration kann ganz einfach sein:
Java:
public enum ErrorCode{
  NO_PLAYER_NAME,
  NO_PLAYER_SELECTED
}

Und eine Map könnte so aussehen:
Java:
Map<ErrorCode, String> errors = new HashMap<ErrorCode, String>();
 ...
// initialisieren, kann irgendwo geschehen.
errors.put( ErrorCode.NO_PLAYER_NAME, "Wo ist der Spieler?" );
errors.put( ErrorCode.NO_PLAYER_SELECTED, "Selektier mal einen Spieler!" );

...

// und so wird das benutzt
ErrorCode code = ... // Parameter einer Methode
String message = errors.get( code );

ResourceBundles würden ganz ähnlich funktionieren, sie sind auch wie eine Map aufgebaut.
 
Danke für eure Informationen....

Ich habe es wie folgt umgebaut:

Klasse "Messages" im Package "Daten"

Java:
package Daten;

import javax.swing.JOptionPane;

public class Messages{
	public static void showMessageBox(Error selection){
		JOptionPane.showMessageDialog(null, selection , "Fehler!", JOptionPane.ERROR_MESSAGE);
	}
	
	static public enum Error {
		noPlayerNameNew,noPlayerNameDel,noArmyNameNew,noArmyNameDel,noPlayerSelected,noArmySelected,noNameGiven,noPointsGiven,noSizeGiven,notEnoughtIAP,notEnoughtTAP
	}
		
	public static String word(Error selection){
		String strText="";
		switch (selection){
			case noPlayerNameNew:
				strText = "Es konnte kein Spieler angelegt werden da Sie keinen Spielernamen angegeben haben.";
				break;
			case noPlayerNameDel:
				strText = "Es ist kein Spieler vorhanden den man löschen könnte.";
				break;
			case noArmyNameNew:
				strText = "Es konnte keine Armee angelegt werden da Sie keinen Armeenamen angegeben haben.";
				break;
			case noArmyNameDel:
				strText = "Es ist keine Armee vorhanden die man löschen könnte.";
				break;
			case noPlayerSelected:
				strText = "Kein Spieler ausgewählt.";
				break;
			case noArmySelected:
				strText = "Keine Armee ausgewählt.";
				break;
			case noNameGiven:
				strText = "Bitte geben Sie einen Namen ein.";
				break;
			case noPointsGiven:
				strText = "Sie haben die Punktekosten nicht angegeben.";
				break;
			case noSizeGiven:
				strText = "Geben Sie bitte die neue Einheitengrösse an.";
				break;
			case notEnoughtIAP:
				strText = "Sie besitzen nicht genügend IAP!";
				break;
			case notEnoughtTAP:
				strText = "Sie besitzen nicht genügend TAP!";
				break;
		}
		return strText;
	}

}

In der Klasse "MainGUI" im Package "GUI" rufe ich so die Fehlermeldung auf:
Java:
import Daten.Messages;
import Daten.Messages.Error;

Messages.showMessageBox(Error.noPlayerNameNew);

Hattet ihr dies so gemeint oder habe ich etwas komplett falsches verstanden?
 
Warum nicht einfach...?
Java:
public enum ErrorCode{
    NO_PLAYER_NAME("Wo ist der Spieler?"),
    NO_PLAYER_SELECTED("Selektier mal einen Spieler!");

    public final String text;

    private ErrorCode(String text) {
        this.text = text;
    }
}
Java:
public void showDialog(ErrorCode errorCode) {
    JOptionPane.showMessageDialog(null, errorCode.text, "Error!", JOptionPane.ERROR_MESSAGE);
}
 
Das Beispiel anhand ich den Code geändert habe war in der "komplizierten" variante ... Vielen Dank für deine Korrektur.. 🙂

Ich habe zumindest erreicht was ich wollte. Vielen Dank für eure Hilfe.
 

Neue Themen


Zurück
Oben