Sammlung von Anfängerfragen für mein erstes Programm

mcbert

Mitglied
Hallo Java-Freunde,

ich bin neu hier und auch noch relativ frisch was die Javaprogrammierung angeht.
Da sich mir momentan ein paar Fragen stellen, auf die ich nicht so wirklich Antworten habe, möchte ich diese hier gerne mal los werden.

1) Entwicklungsumgebung
An sich find ich ja Eclipse fein, allerdings bring ich unter OSX gerade kein drag&drop GUI Builder Plugin zum laufen und arbeite nun erstmal mit Netbeans.
=> wie macht Ihr so eure GUI's? oder codiert Ihr wirklich mit GridLayout etc. die ganze GUI selbst?

2) Programmaufbau
Ich schreibe gerade eine SW mit der ich remote function calls zu einem Server machen möchte und anschliessend die Antwort wieder anzeigen. D.h. die Maske soll wie folgt aussehen:
1. Teil: Serverbindungen (Hostname, Port ....) erstmal als Textfeld später wohl mit Configdatei.
2. Teil: Sendeinformation, auch ein Textfeld + Button "senden"
3. Teil: Serverantwort eine Textarea die sowohl die Anfrage als auch die Antwort enthält.
Aus meiner Sicht bringe ich hier momentan nur umständlich OO-Ansätze unter.
Rein von der Logik her hab ich hier nur 1 Klasse. Diese macht:
- die GUI,
- fängt Button events ab,
- baut die Serververbindung auf,
- schickt den call ab
- verarbeitet die Antwort

Ist das so ok? An sich könnte ich evtl. eine eigene Klasse "ServerVerbindung" machen, anschliessend ein Objekt davon welches im Konstruktor die Verbindungsdaten (Host etc.) aufnimmt und mit diversen Methoden den Verbindungsaufbau, Datenversand, Datenempfang übernimmt.
Wäre dieser Ansatz besser?

3) bestehende Klassen
somit auch zu meiner dritten und letzten Frage fürs erste ;-) die oben genannte Klasse "ServerVerbindung" ist ja nichts was nur ich brauche. Wie findet man am dümmsten bestehende Klassen welche ich lediglich einbinden muss?

Vielen Dank im Voraus
 
Willkommen,

nun... zum 1. Punkt: ich würde dir raten am Anfang definitiv mit dem Code die GUIs erstellen. Später, wenn du dann verstehst, wie und was da passiert, kannst du einfachheitshalber auf GUI-Bilder umsteigen, aber Grundlagen musst du dir definitiv aneignen.

3. Auch hier gilt das gleiche. Vor allem das Aufbauen einer Verbindung und das Senden von Daten ist nicht das Schwierigste, deswegen würde ich an deiner Stelle es am Anfang selber machen, damit du weißt wie das geht. Später kannst du ja dann deine eigene Klasse einbinden 😉

2.
2. Teil: Sendeinformation, auch ein Textfeld + Button "senden"
Öhm... meinst du den Inhalt des Textfeldes und die "ID" des Buttons?
Das ganze in nur einer Klasse zu schreiben ist wirklich nicht das wahre. Selbst die GUI würde ich ggf. aufteilen (aber dazu musst du dir paar Theorie-Sachen angucken, z.B. MVC). Aber wenigstens die Connection-Klasse kannst du auslagern.
 
Also ganz ehrlich, ohne GridBagLayout kommst du nicht aus wenn du wirklich mal ein professionelles Programm erstellen willst. Übrigens kannst du auch einen GUI Builder benutzen der eben GridBag benutzt: The Software Vault GUIDE: Advanced GUI Builder for Swing

Du solltest definitiv mehr Klassen erstellen 🙂 Zumindest eine für die GUI (schau dir mal das MVC Patter an), eine für die Logik und einen Controller. Oder du kannst es für den Anfang auch so handhaben dass du Controller & View (also die GUI) zusammen schmeißt.

Ich denke der Ansatz mit der eigenen Klasse wäre schon gut. Musst dir eben immer überlegen: "Könnte ich das irgendwo anders noch einmal benutzen?" Falls ja, dann lagere es in eine eigene Methode oder eben eigene Klasse aus.

Hmm, gute Frage, wo bekommt man Klassen her die man einfügen kann? Im Netz suchen und anpassen 😀
 
Danke für die Infos,

an sich hab ich mich schon mit den Layouts beschäftigt, da mir klar war, dass man darum nicht rum kommt. Eine drag & drop Oberfläche nimmt einem halt vieles ab, vorallem das trial and error bis es auch mal so aussieht wie man es haben wollte.

Danke für den Guide link, die Videotutorials sind sehr gut dort und der Kollege hält sich ja auch an das MVC Konzept. Das trennen des ganzen macht wirklich Sinn allerdings muss ich mich jetzt erstmal noch ein wenig mehr einlesen wie das mit der Kommunikation zwischen den Klassen funktioniert.

Hab jetzt:
- eine Main Klasse welche die GUI startet,
- eine GUI Klasse, die sich nur um das Layout kümmert
- eine Controller Klasse welche die ausgelösten events verarbeitet.

was schon geht, ist dass die GUI events in der Controller Klasse auslöst. Unklar ist mir gerade noch, wie der Controller wieder was an die GUI zurückgibt. Vermutlich auch mit Listener aber da muss ich nochmal nachforschen.

Vielen Dank erstmal, die nächsten Fragen werden folgen ;-)
 
Benötige wohl doch noch ein wenig Unterstützung wenn ich mich an das MVC Modell halte.
Hab jetzt 3 Klassen:
- t_start (startet die Applikation)
- t_gui (erstellt die Oberfläche)
- t_controler (soll die Logik enthalten)

t_start.java:
Java:
import javax.swing.JFrame;
public class t_start {
	public static void main(String[] args) {
		JFrame gui = t_gui.create_gui(new t_controler());
		gui.pack();
		gui.setLocationRelativeTo(null);
		gui.setVisible(true);	
	}

}

t_gui.java:
Java:
import java.awt.event.ActionListener;
import java.beans.EventHandler;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;


public class t_gui {
	static JTextField txt_b = new JTextField(10);	
	
	public static JFrame create_gui(t_controler t_controler) {
		JFrame frame = new JFrame("test");
		JPanel panel = new JPanel();
		JTextField txt_a = new JTextField(10);
		
		JButton btn_trans = new JButton("copy to textfield");
		btn_trans.addActionListener(EventHandler.create(ActionListener.class, t_controler, "transfer"));
//		txt_b.addActionListener(EventHandler.create(ActionListener.class, t_controler, "update"));
		
		panel.add(txt_a);
		panel.add(txt_b);
		panel.add(btn_trans);
		
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.add(panel);
		return frame;
	
	}
	
	public static void set_txt_b(String new_text) {
		txt_b.setText(new_text);
	}
}

t_controller.java:
Java:
public class t_controler {
	String str_a = "";
	String str_b = "";
	
	public String getStr_a() {
		return str_a;
	}
	public void setStr_a(String strA) {
		str_a = strA;
	}
	public String getStr_b() {
		return str_b;
	}
	public void setStr_b(String strB) {
		str_b = strB;
	}

	public void transfer() {
		str_b = str_a;
		update();
		System.out.println("Transfer-Action performed");
	}
	
	public void update () {
		System.out.println("Update-Action performed");
	}

}

Wie bekomme ich das ganze jetzt so hin, dass wenn der Button gedrückt wird, der Text von der 1. Textbox in die 2. übertragen wird. Wenn ich es richtig verstanden habe, will ich ja den Controller so unabhängig wie möglich haben (d.h. ich möchte nicht über eine public Methode in der Gui Klasse zugreifen um das Textfeld zu ändern sondern lediglich eine Art Event auslösen welcher von der GUI-Klasse über eine Art Listener wieder aufgenommen wird.
 
also
1. deine Klassennamen sind nicht wirklich gut gewählt
2.momentan willst einfach nur nen fenster mit button der den text von Textfield a zu Textfield b kopiert?seh ich das richtig?ich würde einfach nen ButtonListener und setText() verwenden:
Java:
import java.awt.event.ActionListener;
import java.beans.EventHandler;
 
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
 
 
public class t_gui {
    static JTextField txt_b = new JTextField(10);   
    
    public static JFrame create_gui(t_controler t_controler) {
        JFrame frame = new JFrame("test");
        JPanel panel = new JPanel();
        JTextField txt_a = new JTextField(10);
        
        JButton btn_trans = new JButton("copy to textfield");
        //btn_trans.addActionListener(EventHandler.create(ActionListener.class, t_controler, "transfer"));/*entweder es ist quatsch oder zu hoch fuer mich ich versteh das auf alle fälle nicht...*/
        btn_trans.addActionListener( new ActionListener() { 
              public void actionPerformed( ActionEvent e ) { 
                   txt_a.setText(txt_b.getText());
                   txt_a.setText("");
             } 
        } );
        
        panel.add(txt_a);
        panel.add(txt_b);
        panel.add(btn_trans);
        
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(panel);
        return frame;
    
    }
    
    public static void set_txt_b(String new_text) {
        txt_b.setText(new_text);
    }
}
 
Zuletzt bearbeitet:
Hallo,

ist auch nur ein schnelles Beispiel, wo es nicht auf Namen etc. ankommen soll.

Ziel ist eigentlich nur, nachzuvollziehen wie ich die Logik in der Controller-Klasse gestallten muss, damit diese unabhängig von der GUI-Klasse funktioniert.
Dein Ansatz wäre mir an sich schon bekannt, hat aber den Nachteil, dass du Business-Logik in der GUI-Klasse hast.
Für den einfachen Fall ist das sicherlich akzeptabel aber für kompliziertere Sachen scheint der Weg über eine eigene Klasse geschickter zu sein.
 
Auch bei so einem kleinen Beispiel sollte man die NamingConventions beachten. Bei sowas wie
Code:
... create_gui(t_controler t_controler) {
rollen sich zumindest mir die Fußnägel hoch.
Code:
... createGui(Controller controler) {
(das macht schon Sinn für die Lesbarkeit - Code wird höchstens einmal geschrieben, aber was du hier gepostet hast potentiell hunderte Male gelesen)

Aber zur eigentlichen Frage: Bei dieser Umsetzung des Model-View-Controller Patterns fehlt mir persönlich eine relativ wichtige Sache ... ... ... ... ...
 
Ich persönlich finde (ganz subjektiv) dieses Tutorial ... etwas seltsam (hatte ich auch mal in diesem Beitrag erwähnt). Ich fand vom Gesamtbild, der Übersicht und der Vermittlung der Grundidee her eigentlich das hier ganz gut MVC Pattern , aber einige Punkte bei der Implementierung würde ich auch anders amchen.
Ich werde deswegen hier mit meiner Tradition fortfahren, bei jeder neu aufkommenden MVC-Diskussion auf den Beitrag zu verlinken, in dem ich in der vorhergehenden MVC-Diskussion auf den Beitrag der vorhergehenden MVC-Diskussion verlinkt habe: http://www.java-forum.org/allgemein...vc-funktionsweise-controllers.html#post549888 😀
 
Sorry Jungs,

ich habs aber immer noch nicht. Das heisst ich hänge in der GUI-Klasse an mein Textfeld einen PropertyChangeListener:

Java:
                    txt_b.addPropertyChangeListener(
				new PropertyChangeListener(){
					public void propertyChange(PropertyChangeEvent e)
					{
						System.out.println("property changed:" + e.getPropertyName());
						if (e.getPropertyName().equals("transfer")) {
							System.out.println("property fired");
						}
					}

				}
			);

Und auf der anderen Seite löse ich ein Event in meiner Controller Klasse aus nachdem der Button gedrückt wurde:

Java:
      private PropertyChangeSupport pCS = new PropertyChangeSupport(this);
      .....
            public void transfer() {
		String old = this.str_b;
		str_b = str_a;
		pCS.firePropertyChange("transfer", old, str_b);
	}

Aber irgendwo hängt es noch, da nur einmal beim Laden der GUI ein "PropertyChange" ausgelöst wird, allerdings nicht wenn ich den Button drücke.
Bin für Tips dankbar
 
Naja, du versuchst mir mit dem Model-View-Controller Entwurfsmuster auseinanderzusetzen... du hast eine View-Komponente und Controller-Komponente erstellt... welche fehlt dir noch?
 

Zurück
Oben