Java Java Programm selbst schreiben

GenK schrieb:
@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?

Klar, warum sollte es sich nicht ändern können?

Code:
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Vector;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;

public class Test extends JFrame implements ActionListener {

	public static void main(String[] args) {
		Test t = new Test();
	}

	// ***************************
	// ***************************

	private Vector<JLabel> vl = new Vector<JLabel>();
	private GridBagConstraints cons = new GridBagConstraints();

	public Test() {
		this.setSize(200, 200);
		init();
		this.setVisible(true);
		this.setDefaultCloseOperation(EXIT_ON_CLOSE);
	}

	private void init() {
		this.setLayout(new GridBagLayout());
		cons.gridy = 0;
	
		
		JButton b = new JButton("Pressen bitte");
		b.addActionListener(this);
		
		this.add(b, cons);
		
		cons.gridy++;
		vl.add(new JLabel("1"));
		this.add(vl.get(0), cons);
		
		
		this.pack();
	}

	@Override
	public void actionPerformed(ActionEvent e) {		
		vl.add(new JLabel("Neues Label; " +vl.size()));
		cons.gridy++;
		this.add(vl.get(vl.size()-1), cons);
		this.setSize(this.getWidth(), this.getHeight()+20);
		
		
		for(int i = 0;i < vl.size();i++){
			vl.get(i).setText(vl.get(i).getText() + "1");
		}
		
		
		
	}

}

Wie du siehst, drück ich den Button und alles ändert sich. Zwar nicht schön der Code, aber er erfüllt hier seinen Zweck.

Oder hab ich dein Anliegen falsch verstanden?
 
Zuletzt bearbeitet:
Um dir mal was zweites vorzuschlagen, du kannst auch Eclipse RCP verwenden, da ist die Lernkurve etwas steiler.
http://www.vogella.com/articles/EclipseRCP/article.html

1668mib schrieb:
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/
Fällt beim Eclipse RCP dann automatisch raus.

1668mib schrieb:
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.
Hierfür würde ich EMF verwenden. In XML bzw. XMI speicher ist ein Einzeiler. Der generierte Code für deine Models ist sauber geschrieben, du hast ein Notfication Framework, bidirektionale Beziehungen sind kein Problem und es gibt einen UML ähnlichen Editor zum Modellieren. Falls du später dann doch in eine DB mal speichern willst, kannst du deine Model Objekte weiterverwenden und kannst dir sogar deine Pojos für JPA generieren lassen.
Außerdem hast du dann schon jede Menge Vorteil wenn du RCP verwendest mit EMF. DataBinding Support, Undo/Redo usw.
http://www.vogella.com/articles/EclipseEMF/article.html


So solltest du relativ wenig Code schreiben müssen, die UI Widgets und das wars. Databinding, Persistieren (XMI) und Model werden dir geschenkt ;)
 
@Schaltnetze: Der Punkt mit den generierbaren Pojos hat mich jetzt bei dieser Problemstellung überzeugt...
Und ich dachte schon, ich hätte schweres Geschütz empfohlen ...
 
1668mib schrieb:
@Schaltnetze: Der Punkt mit den generierbaren Pojos hat mich jetzt bei dieser Problemstellung überzeugt...

Ja sind Pojos die sofort mit JPA annotiert sind? Du kannst aus einem Model entweder in XML speichern, JPA generieren lassen und kannst noch für die UI Models generieren lassen... Also warum nochmal JaxB? EMF kann genau das gleiche und bietet darüber hinaus viel mehr
 
so jetzt tut das Programm das was ich will :D
hab ne .jar Datei draus gemacht:
http://www.workupload.com/file/oLL7YEL

jetzt sollte er sich nurnoch "merken"/speichern wo ich war, und beim nächsten mal da weitermachen.
Am besten wäre es natürlich, wenn er alles in sich selbst speichert, also in die Jar-Datei.
Muss auch nicht zwingend ne Jar-Datei sein. Hauptsache am ende habe ich eine datei die sich öffnen lässt
und beim schließen abspeichert/schon gespeichert hat.

Welche Möglichkeiten habe ich da?
 
Zuletzt bearbeitet:
Jede - es kommt nur drauf an, was du kannst und wie du es gerne hättest. Am einfach wird es wohl sein, wenn du dir eine spezielle Klasse schreibst, die alle Informationen in Form von Listen und so merkst und diese dann serializierst. Beim Programm start dann laden.
Alternativ natürlich auch XML, JSON, eine DB oder flache Textdateien. In Jar selbst wird nicht möglich sein, den in die eigene laufende kannst du nicht schreiben. ;)

The choice is yours.
 
"in form von listen" zählen dazu auch JPanel Vektoren (JPanel[]) oder kann ich nur schrift speichern?
 
Du solltest nur die Daten speichern! Man kann aber auch javax.swing.JPanel Instanzen serialisieren.

Die Verwendung von java.util.Vector ist heutzutage übrigens unüblich.
 
HTML:
<!doctype html>
<html>
	<head>
		<title>Season-Vault</title>
		<script src = "http://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script>	
		<style type = "text/css">
			.center {
				margin: 0 auto;
			}
			.left {
				float: left;
			}
			.clearfix {
				clear: both;
			}
			
			#container {
				max-width: 600px;
			}
		</style>
	</head>
	<body>
		<div class = "center clearfix" id = "container">
			<p id  = "seriesContainer">
			</p>
			<script>
				function GUID () {
					var S4 = function () {
						return Math.floor(Math.random() * 0x10000).toString(16);
					};
					
					return (S4() + S4() + S4() + S4() + S4() +S4() + S4() + S4());
				}
				
				function add(obj) {
					var guid = GUID().toString();
					localStorage[guid] = JSON.stringify(obj);
					return guid;
				}
				
				function append(key, obj) {
					$('#seriesContainer').append('\
						<form class = "seriesForm" id = "' + key + '"> \
							<fieldset> \
							<input type="text" name = "series" class = "left" value = "' + obj.series + '"> \
							<input type="number"  name = "season" class = "left" value = "' + obj.season + '" min="1" max="99"> \
							<input type="number"  name = "episode" class = "left" value = "' + obj.episode + '" min="1" max="99"> \
							<button type="button" class = "left delete">Entfernen</button> \
							</fieldset> \
						</form> \
					');
				}
				
				function clearForm(form) {
					$(':input', form).each(function() {
						var type = this.type;
						var tag = this.tagName.toLowerCase();
						if (type == 'text' || type == 'password' || tag == 'textarea')
							this.value = "";
						else if (type == 'checkbox' || type == 'radio')
							this.checked = false;
						else if (tag == 'select')
						this.selectedIndex = -1;
					});
				};
				
				$(document).ready(function() {
					for (var i = 0; i < localStorage.length; i++) {
						var key = localStorage.key(i);
						var value = localStorage.getItem(key);
						var obj = $.parseJSON(value);
						append(key, obj);
					};
					
					$('#add').click(function() {
						var data = {
							'series' : $('#series').val(),
							'season' : $('#season').val(),
							'episode' : $('#episode').val()
						};
						append(add(data), data);
						clearForm($('#addForm'));
					});
					
					$('.seriesForm > *').change(function() {
						var form = $(this).parent();
						var key = form.attr('id');
						var raw = form.serializeArray();
						var data = {
							'series' : raw[0].value,
							'season' : raw[1].value,
							'episode' : raw[2].value
						};
						localStorage[key] = JSON.stringify(data);
					});
					
					$('button.delete').click(function() {
						var form = $(this).parent().parent();
						var key = form.attr('id');
						localStorage.removeItem(key);
						form.remove();
					});
				});
			</script>
			<form id = "addForm">
				<fieldset>
					<input type="text" id = "series" class = "left" placeholder = "Serie">
					<input type="number"  id = "season" class = "left" value = "1" min="1" max="99">
					<input type="number"  id = "episode" class = "left" value = "1" min="1" max="99">
					<button type="button" class = "left" id = "add">Hinzufügen</button>
				</fieldset>
			</form>
		</div>
	</body>
</html>

Falls noch jemand Interesse an so einer Serienverwaltung hat ;-)

Einfach als .html-Datei lokal auf dem Desktop oder so abspeichern, getestet im aktuellen Chrome, Firefox dürfte wohl auch funktionieren.
 
Zuletzt bearbeitet:
Entfernen funktioniert bei mir nicht, und Sortierung scheint auch eher zufällig zu sein bei mir.
Nett zu sehen, was mit HTML5 so geht. Aber wegen Nutzung des LocalStorages eher sinnlos in meinen Augen - die Daten sollten ja nicht vom genutzten Browser abhängen...
 
Puh, Entfernen tuts bei mir, Sortierung ist aber tatsächlich zufällig. Und jo, mir gings dabei auch darum, einfach mal zu sehen, was HTML5 so alles kann ;-) Langfristig wandern ja sowieso alle Anwendungen in den Browser (siehe die Chromebooks).

[edit:]
Hm, hattest Recht, sobald man eine gerade Anzahl an Einträgen hatte, ging Löschen tatsächlich nicht - sollte aber jetzt gefixt sein.
 
Zuletzt bearbeitet:
Vermutlich sortiert er nach den GUIDs...

Und naja, im Brwoser heißt ja nicht zwangsweise, dass die Daten im LocalStorage gehalten werden...
 
Es funktioniert damit nur exakt in dem einen Browser... wenn man die Aufgabenstellung betrachtet, sieht man, dass das eigentlich gerade nicht sein soll. Zudem finde ich den LocalStorage für "richtige" Persistenz nicht wirklich sinnvoll...
 
Zurück
Oben