ich habe mir ein Adressbuch in Java vorgenommen und die Variablen aus der Textdatei einzulesen ist kein Problem, allerdings hapert es dann an dem dynamischen Einfügen.
Ich habe ein Menü, eine Adressliste, eine Kontaktinformation und eine Seite zum Hinzufügen von Kontakten.
Beim Hinzufügen werden die Werte der Textfelder ausgelesen und in einer bestimmten Reihenfolege aufgelistet, separiert durch Semikolons.
Nun habe ich ein Problem damit es so auslesen zu lassen, dass man mit einer Vorlage für die Kontaktinformation alle Kontakte anzeigen zu lassen.
Wie man sieht funktioniert es mit zwei Beispielpersonen, aber es ist sehr undynamisch und die adressliste soll einen neuen Button hinzufügen, wenn man eine neue Person addet. Es soll auf 200 Kontakte erweitert werden.
Versuch mal, die Zeilen in der Länge zu begrenzen und solche, die kürzer sind, auf diese Länge zu bringen. In der Textdatei kann man dann mittels RandomAccessFile ganz einfach auf die jeweiligen “Records” springen.
Das Ganze gab’s von mir im alten Forum schonmal, allerdings als Binärversion.
import java.io.RandomAccessFile;
import java.util.Comparator;
import java.util.Set;
import java.util.TreeSet;
public final class IndexSequenziell {
public static void main(String[] args) {
try {
RandomAccessFile raf = new RandomAccessFile("data.rel", "rw");
Record r1 = new Record("vorn", "nachn", 111, 22, "red");
System.out.println("r1 = " + r1);
Set<Long> indices = new TreeSet<>();
long pos = raf.getFilePointer(); // Position in Datei für Index sichern
indices.add(pos);
Record.write(r1, raf);
raf.seek(pos + Record.LENGTH); // auf naechsten Eintrag zeigen (padding)
//...
raf.seek(pos); // Position aus dem Index
Record r2 = Record.read(raf);
System.out.println("r2 = " + r2);
} catch (IOException e) {
e.printStackTrace();
}
}
}
class Record {
public static final int LENGTH = 3 * 20 * 4 + 2 + 2 * 4;
public static final Comparator<Record> NACHNAME_ASC = new Comparator<Record>() {
@Override
public int compare(Record o1, Record o2) {
return o1.nachname.compareToIgnoreCase(o2.nachname);
}
};
public static final Comparator<Record> NACHNAME_DESC = new Comparator<Record>() {
@Override
public int compare(Record o1, Record o2) {
return o2.nachname.compareToIgnoreCase(o1.nachname);
}
};
String vorname;
String nachname;
int alter;
int anzahlFinger;
String farbe;
private Record() {
}
public Record(String vorname, String nachname, int alter, int anzahlFinger,
String farbe) {
if (vorname.length() > 20) {
throw new IllegalArgumentException("vorname zu lang");
}
if (nachname.length() > 20) {
throw new IllegalArgumentException("nachname zu lang");
}
if (farbe.length() > 20) {
throw new IllegalArgumentException("farbe zu lang");
}
this.vorname = vorname;
this.nachname = nachname;
this.alter = alter;
this.anzahlFinger = anzahlFinger;
this.farbe = farbe;
}
static Record read(RandomAccessFile file) throws IOException {
Record r = new Record();
synchronized (file) {
long pos = file.getFilePointer();
r.vorname = file.readUTF();
r.nachname = file.readUTF();
r.alter = file.readInt();
r.anzahlFinger = file.readInt();
r.farbe = file.readUTF();
if (file.getFilePointer() - pos > LENGTH) {
throw new IOException("record ungueltig");
}
return r;
}
}
static void write(Record r, RandomAccessFile file) throws IOException {
synchronized (file) {
long pos = file.getFilePointer();
file.writeUTF(r.vorname);
file.writeUTF(r.nachname);
file.writeInt(r.alter);
file.writeInt(r.anzahlFinger);
file.writeUTF(r.farbe);
if (file.getFilePointer() - pos > LENGTH) {
throw new IOException("record zu lang");
}
}
}
@Override
public String toString() {
return "Record{" + "vorname=" + vorname + ", nachname=" + nachname
+ ", alter=" + alter + ", anzahlFinger=" + anzahlFinger
+ ", farbe=" + farbe + '}';
}
}```
[quote=Spacerat]Versuch mal, die Zeilen in der Länge zu begrenzen und solche, die kürzer sind, auf diese Länge zu bringen. In der Textdatei kann man dann mittels RandomAccessFile ganz einfach auf die jeweiligen “Records” springen.[/quote]Sorry, aber dass ist 'ne ganz schlechte Idee. Irgendwann hat man das Problem, dass man eines der Felder zu klein gewählt hat…
[quote=Xemper;71504]Wie man sieht funktioniert es mit zwei Beispielpersonen, aber es ist sehr undynamisch und die adressliste soll einen neuen Button hinzufügen, wenn man eine neue Person addet. Es soll auf 200 Kontakte erweitert werden.[/quote]200 Datensätze kann man locker im Arbeitsspeicher vewalten. Die Marschrichting ist also:
alle Datensätze einlesen (Eigene Objekte in einer [JAPI]List[/JAPI])
Datei immer komplett überschreiben.
Von CSV als Dateiformat würde ich abraten. XML ist viel besser zu lesen und es gibt haufenweise Unterstützung für’s Lesen und Schreiben…
Danke für die schnellen antworten, aber mein Problem besteht eher darin diese Kontaktseite neu mit den anderen Daten auszutauschen, wenn ich auf den Pfeil nach Rechts klicke… Mein neuer Code:
kontakt.setDefaultCloseOperation(JFrame.
EXIT_ON_CLOSE);
kontakt.setLayout(
null);
kontakt.setSize(400,600);
kontakt.setLocation(50,50);
kontakt.setResizable(
false);
JButton b7 =
new JButton("<-");
b7.setBounds(1,1,100,40);
JButton b8 =
new JButton("->");
b8.setBounds(300,1,100,40);
JButton b9 =
new JButton("Menü");
b9.setBounds(100,1,200,40);
kontakt.add(b7);
kontakt.add(b8);
kontakt.add(b9);
kontakt.setVisible(
false);
b9.addActionListener(
new ActionListener(){
public void actionPerformed(ActionEvent ae) {
kontakt.setVisible(
false);
menue.setVisible(
true);
}});
b4.addActionListener(
new ActionListener(){
public void actionPerformed(ActionEvent ae) {
}});
b8.addActionListener(
new ActionListener(){
public void actionPerformed(ActionEvent ae) {
zeilennummer++;
System.
out.println(zeilennummer);
System.
out.println(v);
kontakt.setVisible(
false);
kontakt.setVisible(
true);
}});
}
}
OT:[quote=Unregistered]kontakt.setLayout(null);[/quote]Ich möcht wirklich mal wissen, wie man als Anfänger auf so eine krude Idee kommt. ich habe nach 15 Jahren Java-Programmieren erst hier im Forum erfahren, dass sowas geht…
[HR][/HR]
[quote=Unregistered;71517]JButton b8 =new JButton("->");[/quote]Zuerst solltest Du vernünftige Namen für Deine Elemente vergeben. b8 ist nichtssagend, nachRechts versteht man sofort.
[quote=Unregistered;71517]b8.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent ae) { zeilennummer++; System.out.println(zeilennummer); System.out.println(v); kontakt.setVisible(false); kontakt.setVisible(true); } });[/quote]hier müssten die Felder in der Form kontakte neu besetzt werden. das tust Du aber nicht.
Also so schlecht kann meine Idee ja nicht sein, viele andere Datenbanken arbeiten auch so. Andererseits ists richtig, dass es bei wenig Datensätzen auch mit Collections oder Maps funktioniert, welche im Speicher gehalten werden.
Aber anscheinend geht’s hier ja gar nicht um die Datenhaltung, sondern eher darum, die einzelnen Datensätze nacheinander anzuzeigen. Dazu muss dann, wie TT schon sagt, das Objekt “kontakte” aktualisiert werden. Dazu muss man es aber nicht verschwinden und wieder auftauchen lassen, sondern dessen Daten ändern und die Komponente revalidieren.
[QUOTE=Timothy_Truckle;71520]OT:Ich möcht wirklich mal wissen, wie man als Anfänger auf so eine krude Idee kommt. ich habe nach 15 Jahren Java-Programmieren erst hier im Forum erfahren, dass sowas geht…
[/QUOTE]
Das war das einzige was ich bei ein jahr swing lernen benutzt hab. Erst nach diesem jahr hab ich erfahren das es so etwas wie „layout manager“ gibt
Frag mich lieber nicht wer mir diesen mist beigebracht hat ^^
[QUOTE=mymaksimus]Das war das einzige was ich bei ein jahr swing lernen benutzt hab. Erst nach diesem jahr hab ich erfahren das es so etwas wie “layout manager” gibt :D[/QUOTE]Äehm… Impliziert die Methode “setLayout(LayoutManager mgr)” nicht schon irgendwie, dass es solche einfach geben muss?
du willst lieber nicht wissen was ich damals für ein noob war.
ich lerne jtezt seit ungefährt 4 jahren java:
in den ersten 2,5 jahren habe ich ungefährt 0.01% von dem gelernt, was ich heute kann…
ich hab erst dann angefangen zu verstehen was das eigentlich alles ist, objekte, methode und und…
Aber naja, ich war damals 10
Ich habe jetzt noch mal ganz von neu angefangen und es klappt so weit auch, bloß dass das zertrennen des Strings an den Semikolons nicht überschreibt, das heißt ich habe mir zwar den Inhalt der 2. zeile auslesen lassen, aber lasse ich mir den Vornamen ausgeben, so wird mir Max und nicht Maxine angezeigt… bitte helft mir xD
Evtl. denkst du ja, dass zwar der richtige Datensatz, dieser jedoch gekürzt angezeigt wird. Wenn du Maxine z.B. mal in Moritz (o.ä.) umtaufst, wirst du evtl. (ganz bestimmt) feststellen, dass es evtl. gar nicht am Lesen der Datei hapert, sondern schlicht daran, dass du (wie gesagt) die Anzeige gar nicht akualisierst.
Ich habe das Problem nun gelöst… Danke an alle, die mir geholfen haben… Aber eine Frage habe ich noch.
Kann ich JLabels bei einem Klick auf einen Button in JButtons umwandeln?