Java Java Programm selbst schreiben

GenK

Lt. Junior Grade
Registriert
März 2008
Beiträge
448
EDIT:
das Programm ist fertig, falls da einer Interesse hat.
https://www.facebook.com/GenksSeriesManagement
( Falls es euch gefällt dürft ihr es natürlich gerne liken, da es mich interessiert, wie viele es denn benutzen :p)



Hi
ich bräuchte etwas Hilfe bei Java bzw. dass mir einer sagt, was ich noch zu lernen habe ;)
Ich wollte für mich ein kleines Programm schreiben, um zu verfolgen bei welcher Fernsehserie ich wie weit geguckt habe
(über 2 Pc`s mit Dropbox verknüpft).
So soll es später aussehen:
12991494ki.jpg

Hatte bisher 1 Semester Info an der Uni. In Java Prgrammieren kann ich aber
sobald es darum geht aus Java eine EXE oder so zu erstellen hörts auch schon auf.

Ich will nicht, dass mir einer von euch die Arbeit abnimmt und mir kurz alles fertig macht.
Am besten wäre es wenn ihr mir sagt, was ich mir noch angucken muss(Vielleicht n link zum richtigen tutorial oder so)
Was ich noch brauche ist:

-Aus Java eine Exe machen( also so dass man ohne eclipse das Programm starten kann)
-GUI erstellen(Panel, Frame, kleines Eingabefenster usw., wurde in den Vorlesungen nur kurz angeschnitten)
-Wenn Klassen erstellt wurden soll der die bis zum nächsten mal speichern



Hier mal das was ich bisher erstellt habe(will erstmal nur das ganz einfache Programm zum laufen bekommen,
verbessern kann ich es später ja immer noch):
__________________________________________
Code:
package serienverwaltungpackage;

import zlwima.support.Input;

public class Main{
	public static void main(String[] args) {

Verwaltung V = new Verwaltung();
V.erstelleSerie(Input.readString());
}
}
__________________________________________
package serienverwaltungpackage;


public class Verwaltung {
	Serie[] Serien = new Serie[100];
	
	int i = 1;
	public void erstelleSerie(String name) {
		Serien[i].setName(name);
		i++;
	}
}
__________________________________________
package serienverwaltungpackage;

public class Serie {
	int Staffel = 0;
	int Folge = 0;
        String Name= "default";
	public void setName(String name){Name=name;}
	public String getNamme(){return Name;}
	public int getStaffel(){return Staffel;}
	public int getFolge(){return Folge;}
	
	
    public void erhöheStaffel() {
		Staffel++;
		Folge = 0;
	}
	public void senkeStaffel() {
		Staffel--;
		Folge = 0;
	}
	public void erhöheFolge() {
		Folge++;
	}
	public void senkeFolge() {
		Folge--;
	}
}
 
Zuletzt bearbeitet:
Aus Java eine Exe machen( also so dass man ohne eclipse das Programm starten kann)
Bei Java sind da (executable) JARs überlich statt EXE. Wenn du zwingend eine EXE haben wolltest, kannst du dir ja sowas anschauen, was ich aber nicht empfehlen würde: http://jsmooth.sourceforge.net/

Das Erstellen einer JAR geht auf unterschiedliche Weisen. Ich würde ein entsprechendes Build-Tool empfehlen, allerdings sind die für Anfänger meist etwas unübersichtlich und es ist ein wenig mit Kanonen auf Spatzen geschossen. Für Java würde ich Apache Maven oder Gradle empfehlen, Gradle dürfte wohl für ein kleines Projekt noch einfacher zu benutzen sein.

-GUI erstellen(Panel, Frame, kleines Eingabefenster usw., wurde in den Vorlesungen nur kurz angeschnitten)
Da würde ich wohl Swing empfehlen. Swing-Tutorials sollten durchaus leicht zu finden sein.

-Wenn Klassen erstellt wurden soll der die bis zum nächsten mal speichern
Stichwort hier: Serialisierung und Persistenz (bzw. englisch: serialization, persistence). Ich würde wohl zum Serialisieren JAXB nehmen, das erlaubt es Objekte in XML zu schreiben und aus XML zu lesen. Im Galileo-Open-Book zu Java dürften dazu genug Beispiele sein. Um JAXB zu verwenden ist die entsprechende Bibliothek dem Projekt hinzuzufügen. Gerade hier können oben genannte Build-Tools auch helfen, da beide sogenanntes Dependency Management mitbringen, mit dem auf relativ einfache Weise Projekt-Abhängigkeiten auf andere Projekte (Bibliotheken etc) aufgelöst werden.

Noch ein Tipp zur Namenskonvention: Variablennamen (Folge, Staffel, Name, Serien) werden in Java üblicherweise klein geschrieben bzw. in selber Konvention wie Methoden. Statt eines statischen Arrays der Größe 100 wäre eine dynamische Liste (z.B. Typ ArrayList) sinnvoller.
 
Du brauchst keine .EXE. Eine Jar wird dir reichen. Eclipse bringt die Funktion unter File -> Export -> Java -> Runnable Jar File bereits mit. Den Rest kann dir bestimmt jemand anderes erklären ;)
 
Yap, natürlich kann man die Runnable JAR via Eclipse machen, hab glaub letztes Mal nur eine JAR gemacht damit, die natürlich dann nicht starten kann... (mangels Start-Informationen in der JAR)
 
GenK schrieb:
Hatte bisher 1 Semester Info an der Uni. In Java Prgrammieren kann ich aber
sobald es darum geht aus Java eine EXE oder so zu erstellen hörts auch schon auf.

Das kannst du nicht ernsthaft ,,Ich kann Java programmieren nennen''. :P

1) http://www.oracle.com/technetwork/java/codeconv-138413.html
2) http://docs.oracle.com/javase/tutorial/uiswing/

Buttons:
http://docs.oracle.com/javase/tutorial/uiswing/components/button.html
http://www.java2s.com/Tutorial/Java/0240__Swing/0100__JButton.htm

Label:
http://docs.oracle.com/javase/tutorial/uiswing/components/label.html
http://www.java2s.com/Tutorial/Java/0240__Swing/0060__JLabel.htm

Layouts:
http://docs.oracle.com/javase/tutorial/uiswing/layout/visual.html


Willst vermutlich deine Sachen auch Speichern und Laden
http://www.mkyong.com/tutorials/java-xml-tutorials/

XML wäre hier ein Kandidat.
 
Zuletzt bearbeitet:
Ich danke euch schonmal bis hierhin und werde mich die Tage mal einarbeiten :P
Ich weiß für euch ist das kleinkram :D aber ich werde mich trotzdem über jeden Pixel, der auch
nur entfernt nach einem Fenster aussieht, freuen =P
 
Zuletzt bearbeitet:
na da programmier doch lieber unter netbeans, das hat einen integrierten gui editor/builder. guis sind da klickerklacker.
und es kann dir eine .exe generieren, um es auf rechnern ohne java ausführen zu können.

swing per hand zu coden ist alles andere als komfortabel.
 
@DonnyDepp: Da die UI eh dynamisch ist, kommt er früher oder später gar nicht umher, Teile von Hand zu programmieren.
Und ich finde, UIs via GUI-Designer zu entwerfen ehrlich gesagt schlimmer als von Hand.
 
Hmm also an einer Stelle komme ich jetzt nicht weiter;
Das ist nicht der ganze Code, aber das Wichtigste denke ich.
Mein Problem ist, dass ich auf einem JPanel ein JLabel und ein JButton speichere.
dann packe ich mehrere JPannels in einen Container(siehe Code unten, auch wenn ich hier nur 1 JPanel hinzufüge)
jetzt will ich im Nachhinein die Zahl, die der JLabel anzeigt, ändern durch drücken des Buttons.
Den Aktionlistener habe ich hinbekommen, aber wie kann ich jetzt auf das JLabel zugreifen.
Also die Staffeln und Folgen ändern sich richtig, nur es wird nicht angezeigt, weil das JLabel sich nicht aktualisiert
und um den zu ändern müsste ich ja drauf zugreifen..

containerMain.getComponent(0)....
irgendwie so? aber da sagt er immer, dass die befehle für JPanel nicht funktionieren weil er ne Komponente zurückgibt.




Code:
public void erstelleGui() {

JFrame frame = new JFrame("Serienverwaltung");
Container containerMain = frame.getContentPane();
containerMain.setLayout(new BoxLayout(containerMain, BoxLayout.PAGE_AXIS));

JPanel panelHinzu  = new JPanel();
JButton minus1      =new JButton("-");
JLabel staffel = new JLabel();
staffel.setText(String.valueOf(Serien[y].getStaffel()));

panelHinzu.add(staffel);
panelHinzu.add(minus1);
containerMain.add(panelHinzu);
}
 
Wenn du deinem JLabel schon so einen schönen Namen gibst, wieso kommst du nicht auf die Idee, über diesen auch darauf zuzugreifen? Damit das allerdings auch außerhalb deiner Methode erstelleGui funktioniert, solltest du das Label auch außerhalb der Methode deklarieren. Das heißt, du legst oben im Klassenrumpf dein Label an und weist ihm ganz einfach in der Methode den Wert zu, den es dort ohnehin schon bekommt.
 
Bzgl. der GUI, bitte bitte schau dir das Design Muster MVC genauer an. Es wird dir definitiv beim Verständnis bei der GUI Programmierung helfen und du wirst besseren Code produzieren.

Ansonsten würde ich nicht mich mit JAXB quälen. Wenn du unbedingt XML Dateien als Format nutzen willst, nutze Java SimpleXML. Ich persönlich würde eher auf ein JSON Format setzen, aber das ist hier Geschmackssache...

Hast du mal drüber nachgedacht nicht gleich eine Webanwendung aufzusetzen?
 
@Smagjus: der container ist ja außerhalb der methode. und dort sind ja die JPanels mit den JLabels drauf. Sollte man doch eigentlich drauf zugreifen können oder nicht? Außerdem habe ich das hier glaube ich etwas falsch geschrieben. Der Teil wo neue Jbuttons und Panels erzeugt werden ist auch in einer eigenen Methode. Sprich das Panel heißt jedes mal panelHinzu.

@CapFuture: Sorry aber ich verstehe nur Bahnhof.:D liegt aber nicht an dir. Wörter in deinem Text wo ich nicht weiß, was das ist:
Design Muster MVC, JAXB, XML Dateien, Java SimpleXML, JSON Format


hier nochmal mein ganzer bisheriger code:
Code:
package serienverwaltungpackage;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import zlwima.support.Input;

public class Main {
	public static void main(String[] args) {

		Verwaltung V = new Verwaltung();
		for (int i = 0; i < 100; i++) {
			V.Serien[i] = new Serie();
		}

		V.Serien[0].setName("The Walking Dead");
		V.Serien[1].setName("Game of Thrones: Das Lied von Feuer und Eis");
		V.Serien[2].setName("Dexter");
		V.Serien[2].staffel = 2;
		
		V.erstelleGui();
		
	}
}
_____________________________________________________________________
package serienverwaltungpackage;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.BoxLayout;
import java.awt.Component;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;


public class Verwaltung implements ActionListener {
	public Serie[] Serien = new Serie[100];
	public String[] ZaehlerStaffel = new String[100];
	public String[] ZaehlerFolge = new String[100];
	Container containerMain;
	int i = 1;

	
	

	public void erstelleGui() {                     //frame und nen Container erstellen, dann Serien hinzufügen
		JFrame frame = new JFrame("Serienverwaltung");
		JLabel labelUeberschrift =new JLabel();
		JPanel panelUeberschrift =new JPanel();
		labelUeberschrift.setText("Serie                                           Staffel                                     Folge        ");
		panelUeberschrift.add(labelUeberschrift);
		Container containerMain = frame.getContentPane();
		containerMain.setLayout(new BoxLayout(containerMain, BoxLayout.PAGE_AXIS));
		
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
		containerMain.add(panelUeberschrift);
		SeriePlus(containerMain,i);                                      //10 Serien Hinzufügen
		SeriePlus(containerMain,i);
		SeriePlus(containerMain,i);
		SeriePlus(containerMain,i);
		SeriePlus(containerMain,i);
		SeriePlus(containerMain,i);
		SeriePlus(containerMain,i);
		SeriePlus(containerMain,i);
		SeriePlus(containerMain,i);
		frame.pack();
		frame.setVisible(true);
	}
	 public void actionPerformed(ActionEvent e) {  //Hier muss noch die refresh funktion rein, aber wie??
		  for(int j=1;j<101;j++){ if(e.getActionCommand().equals(""+j)){
			  
	        	Serien[j].senkeStaffel();
	        	System.out.println(j+". Serie: Staffel:"+Serien[j].getStaffel());}}
		  for(int j=-1;j>-101;j--){ if(e.getActionCommand().equals(""+j)){
			  
	        	Serien[-1*j].erhöheStaffel();
	        	System.out.println(-j+". Serie: Staffel:"+Serien[-j].getStaffel());}}
		  
		  
		}
	public void SeriePlus(Container containerMain, int y){   //erstellt genau eine Serie
		JPanel panelHinzu = new JPanel();
		JLabel zahl= new JLabel();
		JButton minus1 =new JButton("-");
		JButton minus2 =new JButton("-");
		JButton plus1 =new JButton("+");
		JButton plus2 =new JButton("+");
		
		
		JLabel name = new JLabel();
		JLabel staffel = new JLabel();
		JLabel folge = new JLabel();
		JLabel leerzeichen = new JLabel();
		leerzeichen.setText("            ");
		zahl.setText(y+1+".");
		zahl.setPreferredSize(new Dimension(18,20));
		name.setPreferredSize(new Dimension(120,20));
		name.setText(Serien[y].getName());
		folge.setText(String.valueOf(Serien[y].getFolge()));
		staffel.setText(String.valueOf(Serien[y].getStaffel()));
		
		
		
	minus1.setActionCommand(""+i);
        minus1.addActionListener(this);
        
        minus2.setActionCommand("Folge-");  //Action Listener funktioniert bisher nur für die Staffeln
        minus2.addActionListener(this);
        
        plus1.setActionCommand(""+(-1)*i);
        plus1.addActionListener(this);
        
        plus2.setActionCommand("Folge+");   //Action Listener funktioniert bisher nur für die Staffeln
        plus2.addActionListener(this);
        
                panelHinzu.add(zahl);            //Alles in der richtigen Reihenfolge aufs Panel packen
		panelHinzu.add(name);
		panelHinzu.add(minus1);
		panelHinzu.add(staffel);
		panelHinzu.add(plus1);
		panelHinzu.add(leerzeichen);
		panelHinzu.add(minus2);
		panelHinzu.add(folge);
		panelHinzu.add(plus2);
		
		containerMain.add(panelHinzu);   //und das Panel in den Container
		i++;
		
		
	}
	
}

__________________________________________________________________
package serienverwaltungpackage;

public class Serie {
	int staffel = 0;
	int folge = 0;
    String name = "default";
	public void setName(String name1){name=name1;}
	public String getName(){return name;}
	public int getStaffel(){return staffel;}
	public int getFolge(){return folge;}
	
	
    public void erhöheStaffel() {
		staffel++;
		folge = 0;
	}
	public void senkeStaffel() {
		staffel--;
		folge = 0;
	}
	public void erhöheFolge() {
		folge++;
	}
	public void senkeFolge() {
		folge--;
	}
}

vom Aussehen her bin ich schon zufrieden:
13001461rz.jpg
 
GenK schrieb:
@Smagjus: der container ist ja außerhalb der methode. und dort sind ja die JPanels mit den JLabels drauf. Sollte man doch eigentlich drauf zugreifen können oder nicht?
Richtig. Allerdings kannst du deine Komponenten nicht mehr voneinander unterscheiden, um diese nach deinen Vorstellungen ändern zu können. setName() kennst du ja schon. Alternativ kannst du auch die Referenzen auf die JLabels selbst speichern. Bei letzterem wäre das angesprochene MVC-Muster (google ist dein Freund) praktikabler, sonst wirds unübersichtlich (du quetschst alles in eine Klasse).

XML ist eine der Möglichkeiten, die Daten zu speichern. Wenn du keine Lust hast herauszufinden, wie das funktioniert, kannst du auch die einfache Objekt-Serialisierung nutzen (die ist aber nicht dynamisch, eine Änderung am Programm kann die gespeicherten Daten nutzlos machen), eine Einstellungs-Datei (java.util.Properties) verwenden oder du schreibst dir ein eigenes Format.
 
Der Code ist nicht eben klar strukturiert. Das erschwert das Verständnis. Aber am Anfang ist es natürlich erst mal wichtig, überhaupt etwas zum Laufen zu bekommen ;) Du solltest Dich mit MVC bzw. MVP auseinander setzen.

Du kannst auf die Labels zugreifen, indem Du diese als Instanzvariablen speicherst, statt als lokale Variablen der Methode.

Code:
public class Verwaltung implements ActionListener {
    JLabel staffel;
    JLabel folge;

    public void SeriePlus(Container containerMain, int y) {
        ...
	staffel = new JLabel();
        folge = new JLabel();
        ...
    }
}

Ich würde den gewählten Weg mit den Labels und Buttons allerdings für suboptimal halten. Eine Tabelle (oder Liste) wäre für mich die naheliegende Wahl. So etwa in der Form:

manager.png

Damit ist man flexibler, und es skaliert bei vielen Einträgen auch besser (spielt hier keine Rolle, klar). Ein eigener CellRenderer wie im Bild wäre für einen Anfänger wohl erst einmal schwierig umzusetzen. Wenn Du Dich näher mit Swing beschäftigen wolltest, aber vielleicht eine lohnende Übung.

Ich persönlich würde übrigens nicht mehr auf Swing setzen. Für Business-Anwendungen SWT und wenn es fancy sein soll, JavaFX.
 
Du kannst natürlich immer auf die Componenten zugreifen.

Ich würde vermutlich alle Buttons und Labels in nen Array, HashMap, Vector, ... speichern.


Mit PseudoCode dann ungefähr so:
Code:
 public void actionPerformed(ActionEvent e) {

                  // Den Buttons wird dann immer das ActionCommand b_X_p oder b_X_m gesetzt
                  String cmd = e.getActionCommand();
 
                  // musst du hier parsen, bei immer gleichen Strings aber relativ einfach 
                  char direction = /* Ob hoch unter runter , p(lus) oder m(inus) aus dem Command */
                  int row = /* Reihe ist das X im Command */

                  // Nun hol ich mir das JLabel dazu aus der HashMap, Vector, was auch immer..
                  JLabel label = /* getFromHashMapLabel(row); */

                  // jetzt mit if auf direction das label erhöhen oder verkleinern */
                  label.setText(label.getText()+1);
}


So ungefähr würde ich das wohl angehen.


Die Commands für die Buttons kannst du dann natürlich auch dynamisch machen, du weißt ja immer, wie viele Reihen du hast.



Vllt. hilft dir das etwas, und nun kannst du selbst noch ein paar Hirnzellen verballern :P
 
@soares: sagen wir ich mache es so, wie du geschrieben hast. Aber wenn ich jetzt 2 Serien hinzufüge überschreibt das 2. JLabel doch das erste oder nicht?

@dasböselebt: wenn ich jetzt alle JLabels und einer Liste speicher(die global in der klasse verwaltung existiert). und dann von der Liste auf das JPanel speicher(und das wird dann wieder im Container gespeichert). wenn ich dann den Listeneintrag ändere. Verändert sich dann überhaupt das JLabel was angezeigt wird?
 
Ich habe nur flüchtig über den Code geschaut, sorry. Wenn die Methode mehrfach aufgerufen wird, dann würde so in der Tat jeweils überschrieben. Du müsstest in dem Fall in der Tat einen geeigneten Container (List, Map) zum Speichern aller Referenzen verwenden.
 
@soares: ja aber an das was ich in den Container packe komme ich ja nicht mehr ran, also kann es nicht mehr verändern
 
Nicht, wenn du irgendwo Buch über deine UI-Elemente führst..

Das Programm mag trivial aussehen, das Backend zu schreiben ist auch ein Klacks, aber dynamische UI-Geschichten sind es häufig nicht - nicht nur dann, wenn man wenig Erfahrung im Programmieren hat.

Und ehrlich gesagt, das erste was ich machen würde, wäre eine eigene Komponente, die jeweils einen Minus-Button, das Label mit dem Wert und den Plus-Button zusammenfasst...
 
Zuletzt bearbeitet:
Zurück
Oben