# Vokabeltrainer in Java



## Tom_ (2. Sep 2010)

Hallo! Zusammen,

ich werde beruflich gearde umgeschult auf Java und bin gerade mal durch den basiskurs. Jetzt versuche ich mir eine nützliche Aufgabe zu stellen um das Programmierer in Java zu lernen.

Mir schwebt folgendes vor:

Vokabeltrainer in Java

3 Spalten Pinyin / Chin.Zeichen / Deutsch
Einstellbar wieviel Zeilen pro seite Angezeigt werden sollen (default 20) 
Schriftgröße, Tabellengröße einstellbar
Anpassbar an anzeigen ( einsatz Tablet-PC )
Über den spalten links zu den Seiten 1,2,3...,n
Jede spalte nach belieben grau abdeckbar 
jede zelle einzeln umschaltbar Grau oder Anzeige.
Sortierfunktion für jede Spalte ( zumindest 1 u. 3)
Suchfunktion
Funktion neues Wort hinzufügen zwingend Pinyin/Chin/deutsch
speichern in Datei oder Datenbank?

Wie aufwendig ist das mit Java und wie ist die herangehensweise? Also mit was beginnt man am besten und wo findet man die benötigten komponenten?
Welche Tools ( plugins ) in Eclips braucht man?
Macht es als anfänger überhaupt sinn sich an so ein Programm zu wagen?

lg
Tom


----------



## Landei (2. Sep 2010)

Das ist "an sich" nicht schwer, aber die Oberflächenprogrammierung (egal ob Swing, SWT oder etwas anderes) ist für Anfänger immer eine Hürde, und es wird oft empfohlen, GUI-Programmierung erst dann zu machen, wenn die eigentliche Sprache einigermaßen sitzt.

Im Prinzip brauchst du:
- eine CVS-artige Datei als "Datenbank", dazu die entsprechende Ein und Ausgabe
- Die Oberfläche. In Swing wäre das ein JFrame mit einer JTable und ein paar JButtons (und / oder Menüs)
- ein paar EventListener, die das Umschalten erledigen

Die Tabelle aufzuteilen ist wahrscheinlich gar nicht nötig: Das Scrollen ist kein Problem, und man kann auch Knöpfe für 20, 50, 100 Sätze nach oben/unten machen. Ich würde eine permanente Suchleiste (die auch nach Wortbestandteilen suchen kann) für sinnvoller halten.

Bevor du fröhlich lospragrammierst würde ich an deiner Stelle mal gucken, was es schon an Open Source bei den Vokabeltrainern gibt, vielleicht ist ja schon etwas dabei, das sich als Basis anbieten würde.


----------



## Tom_ (3. Sep 2010)

Hab mich ein wenig umgeschaut, vokabeltrainer gibt es reichlich aber in einer vollkommen anderen funktinsweise. Möglichwerweise ist das Wort Vokabeltrainer unglückglich gewählt. 
Es soll mehr ein E-Vokabelheft werden, im prinzip will ich damit mein Vokabelheft ersetzen und verbessern. Das Heft löst sich bei täglichen gebrauch nämlich auf und ist wirklich unansehlich, die softwarelösung muss eben irgendwie die biegsamen seiten mit denen ich die spalten abdecke ersetzen, also graue balken.

Einen vokabeltrainer der vokabeln abfragt ist eher eine zusatzfunktion für später, da könnte man theoretisch dann auch die chin. zeichen verlinken zu einer erklärung bzw in die nächste eben aus welchen zeichen sich dieses zeichen zusammensetzt und wo es selbst in anderen zeichen vorkommt oder teil eines wortes ist. Aber so komplex dachte ich es mir für die erste version nicht.


----------



## Landei (3. Sep 2010)

Soweit ich weiß hat Anki so eine Liste im Hintergrund, nur nicht mit "Abdecken". Der "Normalbetrieb" ist aber auch da die üblich Flashcard-Abfrage. 

Vielleicht solltest du das Datei-Format so wählen, dass du es auch mit einem Flashcard-Programm gelesen werden kann.

OT: Ich lerne übrigens Japanisch...


----------



## Tom_ (17. Sep 2010)

Bin eh noch am grübeln was ich alles in die datei speichern soll, ein indikationsfeld wird wohl auch noch dazukommen um eine untermenge an wörtern zu definieren die man speziell trainieren will. Auch eine gliederung nach topic zb. Wohnen, Geld, Tiere usw.. wäre nützlich für den praktischen einsatz.

Japanisch.. klingt auch interessant  , soll leichter sein in der aussprach aber dafür viel mehr wörter haben für unterschiedliche situationen also mehr oder weniger sprachen in der sprache.

Ich werd mir jetzt noch das letzte Modul unserer Basisausbildung geben und dann werde ich mich reinhängen, im moment arbeite ich gerade das java-tut durch um nicht vollkommen ins kalte wasser zu springen. 
Der einstieg in PL1, cobol war wesentlich einfacher.

lg
Tom


----------



## Landei (17. Sep 2010)

Dann solltest du dir überlegen, entweder eine kleine Datenbank zu benutzen (JavaDB ist bei Java schon dabei) oder ein strukturiertes Dokumentenformat zu verwenden (XML, JSON, HAML...). Alles andere hieße, das Rad neu zu erfinden.


----------



## Tom_ (19. Okt 2010)

So jetzt habe ich angefangen, also java macht spaß ist viel lebendiger als am host reinzutippen.

Was es schon kann:

3 Textfelder ( Pinyin, Zeichen, deutsch)
1 Button hinzufügen
1 button vorblättern
1 butten zurückblättern
1 Table 20 zeile 3 Spalten, die die vokabel anzeigt

bei start wird kontrolliert ob ein Vokabelfile da ist wenn ja wird es eingelesen und die ersten 20 angezeigt.
Beim hinzufügen springt man zur letzten seite und sieht die neue Zeile auftauchen.

Jetzt würde ich gern einen Filter einbauen, der soll aber schon beim schreiben reagieren. Habe hier http://www.java-forum.org/java-basics-anfaenger-themen/63260-liste-array-filtern.html schon nachgelesen ist mir aber zu wenig info.

Die daten sind intern in einem ArrayList<BibZeile> abgespeichert und 
BibZeile sieht so aus:



```
public class BibZeile {

private int  Laufnummer;	
private String PinYin;
private String ChinZeichen;
private String Deutsch;
public void setDeutsch(String deutsch) {
	Deutsch = deutsch;
}
public String getDeutsch() {
	return Deutsch;
}
public void setPinYin(String pinYin) {
	PinYin = pinYin;
}
public String getPinYin() {
	return PinYin;
}
public void setChinZeichen(String chinZeichen) {
	ChinZeichen = chinZeichen;
}
public String getChinZeichen() {
	return ChinZeichen;
}
public void setLaufnummer(int laufnummer) {
	Laufnummer = laufnummer;
}
public int getLaufnummer() {
	return Laufnummer;
}



}
```

Ich würde jetzt gerne in den textfeldern etwas eingeben und dann buchstabe für buchstabe die neuen ergebnisse in meiner anzeige table anzeigen.
Filter vorerst mal nur auf String deutsch.


würde mich über ein paar tips freuen 

lg
Tom


----------



## Aldimann (19. Okt 2010)

Also ich würde evtl. erstmal das ganze Programmieren ohne Frontend sondern ggf. auf Konsole. Inwiefern das mit Chin. Vok. geht weiß ich nicht, allerdings können die ja später dann einfach noch dazu kommen.

Einfach anfangen später schwieriger werden...

Was ich mir auch gut vorstellen kann ist, wenn du keine Statistiken o.ä. speichern möchtest, das du einfach das ganze über I18N properties machst.
Vorteil wäre du kannst die Abzufragenden Vokabeln relativ einfach in vielen Sprachen relativ problemlos Verwalten.

Ich bin mir allerdings noch nicht sicher wie sauber die Lösung auf diese Art wäre...


----------



## Tom_ (21. Okt 2010)

Befürchte wir habe da unterschiedliche vorstellungen von schwer *g*

hab es gestern noch selbst gelöst über einen keylistener der folgendes aufruft:


```
vorhanden=fuerDeutschFilter.get(n).getDeutsch().toLowerCase().indexOf(eingabeDeutsch);
			
			
			if (vorhanden>=0)
			{
				gefiltert.add(fuerDeutschFilter.get(n));
			}
```

Die anzeige hatte ich schon in einer anderen klasse, das funktioniert schon nur in der gefilterten ausgabe kann ich noch nicht blättern, das versuche ich heute hinzubekommen. 

lg
Tom


----------



## Tom_ (29. Okt 2010)

Würde meine ausgabe gerne nach 2 kriterien sortieren, werde aber mit der gefunden info im internet nicht schlau.

was ich schon kann ist nach einem kriterium:

```
public int compareTo(BibZeile o) {
	
//	return ((String)Deutsch).toLowerCase().compareTo((String)o.Deutsch.toLowerCase());
	 return ((Integer)sortierfeld).compareTo((Integer)o.sortierfeld);

}
```

jetzt hätte ich aber gerne erst nach sortierfeld und dann innerhalb dieser sortierung alpabetisch.

Im sortierfeld steht der int wert an dem der filter den string gefunden hat, je kleiner desto oben, und innerhalb dieser sortierung hätte ich es gern alphabetisch zb.:

wo
wo
was
wie
wann
wer
wessen
wir
wirklich
Wien
Woche
Woche
wohnen
Zwei
Geschwister
ältere Schwester
kleine Schwester
ältere Schwester
jüngere Schwester

sollte so ausschaun:

wann
was
wer
wessen
wie
Wien
wir
wirklich
wo
wo
Woche
Woche
wohnen
Zwei
Geschwister
ältere Schwester
ältere Schwester
kleine Schwester
jüngere Schwester

danke!
lg
Tom


----------



## Landei (29. Okt 2010)

```
int result = ((String)Deutsch).toLowerCase().compareTo((String)o.Deutsch.toLowerCase());
if (result == 0) { //wenn beide gleich sind
	 result = ((Integer)sortierfeld).compareTo((Integer)o.sortierfeld);
}
return result;
```


----------



## Tom_ (29. Okt 2010)

@Landei danke! funktioniert.

lg
Tom


----------



## Tom_ (2. Nov 2010)

hallo!

Jetzt fürchte ich beginnt der komplizierte part  . Für die eingabe der Zeichen wird ein standardtool herhalten müssen, so etwas hat jeder auf seinem rechner der chinesisch benutzt. 
Das Problem ist es gibt inputmethoden im internet zu finden aber die müsste man erstens mitschicken und sie bei jedem programmstart wieder aktivieren, ich hätte die methode wenn, dann lieber fix auf dem jtextfeld hängen. Es gibt zwar die methode addinputmethdelistener aber keine wie auch immer geartete verständliche schritt für schritt anleitung wie man so eine methode erstellt.

2. warscheinlich "leichteres" problem bei der pinyin eingabe sollte immer wenn ein selbstlaut eingegeben wird eine auswahl erscheinen welche die entsprechnden töne dazu anbietet zb einggabe "a" auswahl a ā á ǎ à
Welche "java-bausteine" sind dafür am besten geeignet?

lg
Tom


----------



## noobadix (2. Nov 2010)

Von der Variante, die InputMethod durch Java einzustellen rate ich ab, habe damit schlechte Erfahrungen gemacht. Dadurch wird die InputMethod vom Betriebssystem verändert. Der Benutzer muss diese also installiert haben, was bei manchen LinuxSystemen gar nicht so trivial zu machen ist und u.U. hat der Anwender dazu nicht die Berechtigung.

Ideal wäre es, denke ich, wenn du zur Darstellung die passende Font mitliefern und die Eingabe durch ein virtuelles Keybord, also Buttons, realisieren würdest.


----------



## Tom_ (2. Nov 2010)

Ja, denke ich auch. In der reihenfolge der buttons muss dann allerdings noch ein bisschen logik stecken nämlich die häufigsten zeichen zuerst und nicht mehr als 10 also 0-9 auf einmal sprich ein button zum weiterblättern. Die anzeige muss sich auch selbst aktualisieren können also wenn man nur die silbe zb "wo" eintipt ist die auswahl größer als "wo3" .

 Die meisten lösungen im netz funktionieren zwar auf ihre weise sind aber weit weg von userfreundlich, das ist einer der schwerpunkte bei meinen programm. Einfach u. Intuitiv dafür eben spezialisiert auf chinesisch.

Das pinyin problemchen habe ich mit einem keylistener gelöst der jetzt eben a1 a2 o3 usw in das lautzeichen verwandelt, das ist auch angenehmer beim schreiben.
In einer fernen ausbaustufe sollen die zeichen automatisch in pinyin übersetzt werden und diese lösung nur noch eine korrekturmöglichkeit sein.

Wobei ich anmerken muss der substring von java ist einfach strange!! *g*


----------



## Tom_ (4. Nov 2010)

Wieder einmal Hallo! 

Mein inputfile sieht so aus:
an	安 案 按 廠 暗 岸 黯 俺 闇 鞍 庵 諳 氨 銨 盦 犴 桉 唵 菴 峖 鵪 痷 啽 侒 豻 堷 洝 儑 韽 荌 玵 婩 晻 匼 錌 垵 媕 腤 雸 萻 匎 昂 肮 盎 骯 腌 卬 軮 醠
an1	安 廠 鞍 庵 諳 氨 銨 盦 桉 峖 鵪 痷 侒 韽 垵 媕 腤 萻
an2	啽 玵 雸
an3	俺 銨 唵 堷 晻
an4	案 按 暗 岸 黯 闇 犴 桉 菴 豻 洝 儑 荌 婩 匼 錌 匎
ang	昂 肮 盎 骯 腌 卬 軮 醠
ang1	肮 骯 腌
ang2	昂 卬
ang3	軮
ang4	盎 醠
ao	奧 傲 澳 囂 熬 遨 凹 懊 翱 拗 敖 嗷 坳 鏖 螯 鰲 聱 柪 鼇 獒 廒 襖 鏊 滶 芺 奡 驁 媼 扷 蔜 謷 爊 隞 摮 磝 擙 镺 詏 璈 墺 嶴
ao1	熬 凹 坳 柪
ao2	囂 熬 遨 翱 敖 嗷 鏖 螯 鰲 聱 鼇 獒 廒 滶 蔜 謷 爊 隞 摮 磝 璈
ao3	襖 芺 媼 镺
ao4	奧 傲 澳 懊 拗 坳 鏊 奡 驁 扷 擙 詏 墺 嶴

also jede zeile ein String.

Wie setze ich es am besten um, in erster linie suche ich nach dem ersten teil zb.: ao4 und dann will ich in der zeile ao4 die zeichen einlesen. Das Problem ist, ich kenne die anzahl der zeichen nicht also kann ich jetzt keine classe erstellen, die die struktur abbildet. 
Ein einfaches Stringarray reicht auch nicht, da mir nur die index und die equal methode einfällt um einen string zu finden. Bei equals stellt sich das problem, das ich die erste silbe abtrennen müsste in einen eigenen string, bei index, das ich zu viele treffer habe.
Gibt es da eine praktischere variante?

danke
lg
Tom


----------



## ARadauer (4. Nov 2010)

> Das Problem ist, ich kenne die anzahl der zeichen nicht also kann ich jetzt keine classe erstellen, die die struktur abbildet.


warum?


----------



## Tom_ (4. Nov 2010)

ARadauer hat gesagt.:


> warum?



Das passendste wäre ein String array aber muss man da nicht die anzahl der elemente angeben?
Jedes zeichen wäre ein element.

Wie würdest Du es machen?

lg
Tom


----------



## Landei (5. Nov 2010)

Mit String[] array = line.split(" ") bekommst du ein Array der einzelnen Teile. array[0] ist die Aussprache, und den Rest kannst du in eine Liste oder (mit System.arraycopy) in ein neues Array packen. Wo ist das Problem?


----------



## ARadauer (5. Nov 2010)

> Das passendste wäre ein String array aber muss man da nicht die anzahl der elemente angeben?


warum keine ArrayList?

arrays sind halt unflexible... dafür haben wir in java ein paar ganz bequeme collections mit denen man sehr flexibel arbeiten kann..


----------



## Tom_ (5. Nov 2010)

da bin ich auf der leitung gestanden, habe es jetzt erst einmal in ein anderes format gebracht um speicher zu sparen:

an;安案按廠暗岸黯俺闇鞍庵諳氨銨盦犴桉唵菴峖鵪痷啽侒豻堷洝儑韽荌玵婩晻匼錌垵媕腤雸萻匎昂肮盎骯腌卬軮醠
an1;安廠鞍庵諳氨銨盦桉峖鵪痷侒韽垵媕腤萻
an2;啽玵雸
an3;俺銨唵堷晻
an4;案按暗岸黯闇犴桉菴豻洝儑荌婩匼錌匎
ang;昂肮盎骯腌卬軮醠
ang1;肮骯腌
ang2;昂卬
ang3;軮
ang4;盎醠

und dann eine klasse mit zwei strings gemacht die dann als objekt pro zeile in einem arraylist abgelegt wird.

lg
Tom


----------



## Tom_ (8. Nov 2010)

ok, ich hätte gern ein fenster ( Jframe?) das ich mit buttons füllen kann und das sich unter einem textfeld positioniert. Erst wollte ich einen Jframe zu einem Jfram add'en aber das hat er mir verweigert.
Was muss ich verwenden?


danke!
lg
Tom


----------



## Gast2 (8. Nov 2010)

Using Top-Level Containers (The Java™ Tutorials > Creating a GUI With JFC/Swing > Using Swing Components)


----------



## noobadix (8. Nov 2010)

http://www.java-forum.org/codeschnipsel-u-projekte/107792-virtualkeyboard.html

Die Lösung mit dem PopUp find ich sehr schön.


----------



## Tom_ (9. Nov 2010)

Hab mich jetzt für ein Jpanel entschieden. Dem habe ich alle gewünschten buttons zugewiesen und es zum jframe geadded. Soweit so gut nur ein kleines Problem mit der Aktualisierung des jframes. Die anzeige ändert sich nämlich erst, wenn ich irgendetwas anderes mache in meinem jframe als zb die sichtbarkeit eines buttons ändern.
Mach ich nichts dergleichen bleibt mein jpanel mit den button unsichtbar.

Hab ich einen fehlergemacht oder weiß ich nur was nicht?

lg
Tom


----------



## Landei (9. Nov 2010)

Manchmal hilft schon, den JPanel fertig zu bestücken, bevor man ihn zum Frame hinzufügt. Falls nicht, kann man mal versuchen, repaint() aufrufen. In Härtefällen vorher noch ein invalidate().


----------



## Tom_ (10. Nov 2010)

*g* das hab das repaint jetzt direkt am panel.repaint() aufgerufen ..schwups und dann wars ganz weg.


----------



## Landei (10. Nov 2010)

Code?


----------



## JohannisderKaeufer (10. Nov 2010)

Das mit dem repaint(), damit hab ich auch immer noch das ein oder andere Problem.

SwingUtilities.updateComponentTree("die zu aktualisierende JComponent"); war bei mir dann oft erfolgreicher. 

Wichtig ist auch, das gerade beim aktualisieren von Komponenten(Hinzufügen von neuen Komponenten) darauf geachtet wird, das die Änderungen im Event-Dispatching-Thread ablaufen.


----------



## Gast2 (10. Nov 2010)

JohannisderKaeufer hat gesagt.:


> Wichtig ist auch, das gerade beim aktualisieren von Komponenten(Hinzufügen von neuen Komponenten) darauf geachtet wird, das die Änderungen im Event-Dispatching-Thread ablaufen.



Das sollte bei JEDER UI Aktion so sein...


----------



## Tom_ (10. Nov 2010)

ok... hab das thema "Event-Dispatching-Thread" jetzt einmal kurz in wiki überflogen, sieht aus als ob das sowieso alles automatisch in diesem thread läuft, werde ich mir noch genauer durchlesen.
@landei code kommt noch


----------



## JohannisderKaeufer (10. Nov 2010)

SirWayne hat gesagt.:


> Das sollte bei JEDER UI Aktion so sein...



Impliziert aber nicht, das es auch wirklich so gemacht wird.

Es gibt aber auch Aktionen die Threadsafe sind, beispielsweise das setText einer jTextComponent.


----------



## Gast2 (10. Nov 2010)

JohannisderKaeufer hat gesagt.:


> Impliziert aber nicht, das es auch wirklich so gemacht wird.
> 
> Es gibt aber auch Aktionen die Threadsafe sind, beispielsweise das setText einer jTextComponent.



Ja wenn sie Threadsafe laufen sie ja schon im EDT ... Darum hab ich ja gesagt dass jede UI Aktion da drin laufen soll nicht nur adden und removen von komponenten


----------



## Tom_ (11. Nov 2010)

```
public static String buttonZeichen;
	public static void buttonErstellen(String chinZeichen) {
		int a = chinZeichen.length();
		buttonZeichen=chinZeichen;
		JButton z1 = null;
		JButton z2 = null;
		JButton z3 = null;
		JButton z4 = null;
		JButton z5 = null;
		JButton z6 = null;
		JButton z7 = null;
		JButton z8 = null;
		JButton vor3 = new JButton(">");
		JButton zurueck3 = new JButton("<");
		GuiHauptseite.zeichenAuswahl.removeAll();
		
		  if (a>=1)
		  {
		    z1 = new JButton("1:"+chinZeichen.substring(0,1));  
		  }
		  if (a>=2)
		  {
		    z2 = new JButton("2:"+chinZeichen.substring(1,2));  
		  }
		  else
		  {
			z2 = new JButton("2: ");  
		  }
		  if (a>=3)
		  {
		    z3 = new JButton("3:"+chinZeichen.substring(2,3));  
		  }
		  else
		  {
			z3 = new JButton("3: ");  
		  }
		  if (a>=4)
		  {
		   z4 = new JButton("4:"+chinZeichen.substring(3,4));  
		  }
		  else
		  {
			z4 = new JButton("4: ");  
		  }
		  if (a>=5)
		  {
		    z5 = new JButton("5:"+chinZeichen.substring(4,5));  
		  }
		  else
		  {
			z5 = new JButton("5: ");  
		  }
		  if (a>=6)
		  {
		    z6 = new JButton("6:"+chinZeichen.substring(5,6));  
		  }
		  else
		  {
			z6 = new JButton("6: ");  
		  }
		  if (a>=7)
		  {
		    z7 = new JButton("7:"+chinZeichen.substring(6,7));  
		  }
		  else
		  {
			z7 = new JButton("7: ");  
		  }
		  if (a>=8)
		  {
		    z8 = new JButton("8:"+chinZeichen.substring(7,8));  
		  }
		  else
		  {
			z8 = new JButton("8: ");  
		  }
		
		vor3.setPreferredSize(new Dimension(13,21));
		zurueck3.setPreferredSize(new Dimension(13,21));
		z1.setPreferredSize(new Dimension(31,21));
		z2.setPreferredSize(new Dimension(31,21));
		z3.setPreferredSize(new Dimension(31,21));
		z4.setPreferredSize(new Dimension(31,21));
		z5.setPreferredSize(new Dimension(31,21));
		z6.setPreferredSize(new Dimension(31,21));
		z7.setPreferredSize(new Dimension(31,21));
		z8.setPreferredSize(new Dimension(31,21));
		vor3.setMargin(new Insets(0,0,0,0));
		zurueck3.setMargin(new Insets(0,0,0,0));
		z1.setMargin(new Insets(0,0,0,0));
		z2.setMargin(new Insets(0,0,0,0));
		z3.setMargin(new Insets(0,0,0,0));
		z4.setMargin(new Insets(0,0,0,0));
		z5.setMargin(new Insets(0,0,0,0));
		z6.setMargin(new Insets(0,0,0,0));
		z7.setMargin(new Insets(0,0,0,0));
		z8.setMargin(new Insets(0,0,0,0));
		vor3.addActionListener(new Vor3ActionListener());
		zurueck3.addActionListener(new Zurueck3ActionListener());
		GuiHauptseite.zeichenAuswahl.add(zurueck3);
		GuiHauptseite.zeichenAuswahl.add(z1);
		GuiHauptseite.zeichenAuswahl.add(z2);
		GuiHauptseite.zeichenAuswahl.add(z3);
		GuiHauptseite.zeichenAuswahl.add(z4);
		GuiHauptseite.zeichenAuswahl.add(z5);		
		GuiHauptseite.zeichenAuswahl.add(z6);
		GuiHauptseite.zeichenAuswahl.add(z7);
		GuiHauptseite.zeichenAuswahl.add(z8);
		GuiHauptseite.zeichenAuswahl.add(vor3);

//an der stelle habe ich das prob eben mit einem sichbarkeitsprofil gelöst 
// die anweisung GuiHauptseite.zeichenAuswahl.repaint();
//hat das panel ganz verschwinden lassen

		ButtonSichtbarkeit.setChinausw();

	}
```


----------



## Gast2 (11. Nov 2010)

Du solltest dringend erstmal ein Tutorial durchmachen...

Deine if else sind total fürn arsch in deiner for schleife... Debug da mal durch  
früher oder später wird er immer in den 1. teil reingehen so ist dein else überflüssig...
und du instanzierst die buttons dann auch mehrmals...


----------



## Tom_ (11. Nov 2010)

@SirWayne
es kommen immer zwischen 1 und 8 zeichen je nach dem wieviele zeichen noch in der auswahl sind bzw. auch beim blättern muss die anzahl nicht zwingend durch 8 teilbar sein. Für diese fälle steht jetzt einmal blank als text.

Diese methode wird immer mit einem string zwischen 1 u. 8 aufgerufen, die aufteilung erfolgt in den aufrufenden methoden ( beim blättern zum beispiel )

zb.: silbe wo3
bei eingabe w sind es 410 zeichen  so sind es beim durchblättern auf der letzten seite nur noch 2 beschriftet + 6 blank
bei wo noch 23 also 1 blanker button 
bei wo3 schließlich stehen nur noch 3 zeichen zur auswahl und 5 blank.

Das funktioniert auch bereits einwandfrei, den code kann man auch kürzer schreiben wenn man für die buttonnummer und die substringwerte variablen verwendet.

zu den blankbutton wird dann in folge auch kein aktionlistener geadded ( soweit bin ich noch nicht, arbeite im moment an der auswahl über die tasten 1-8). 

Durch das removeall, dachte ich gehen die bestehenden referenzen verloren und der garbage collector kümmert sich um die "toten" objekte. Die neu instanzierten stehen dann wieder im panel.

genaugenommen ist mein ganzes wissen aus dem tutorial und wo mir das tutorial nicht weitergeholfen hat habe ich gegoogelt, was oft wieder zu diesem forum führt.


lg
Tom


----------



## Gast2 (11. Nov 2010)

Mach mal ein KSKB wie dein Aufbau ist...

Okay das ist gewollt, dass du leere Buttons anzeigen lassen willst?

Schaur dir mal die Ausgaben an, was deine for schleife macht du machst viel zuviele Buttons...


```
public class Test {

	
	
	public static void main(String[] args) {
		int a = 4;
		
		for(int i = 0;i<=8;i++)
		{
		  if (a>=1)
		  {
		   System.out.println("a1");
		  }
		  if (a>=2)
		  {
			  System.out.println("a2");
		  }
		  else
		  {
			  System.out.println("a2 leer");
		  }
		  if (a>=3)
		  {
			  System.out.println("a3");
		  }
		  else
		  {
			  System.out.println("a3 leer");
		  }
		}

	}
	
}
```


----------



## Tom_ (11. Nov 2010)

ok! alles klar, jetzt seh ich was du meinst *g* wird gleich behoben

danke!


----------



## Tom_ (11. Nov 2010)

Also die forschleife ist total überflüssig, keine ahnung warum ich die dahingeschrieben habe. Ist jetzt raus.


----------



## Gast2 (11. Nov 2010)

Und wie gesagt mach mal ein kleine KSKB. 
Dabei kommt man meistens schon selber auf den Fehler.


----------



## Tom_ (15. Nov 2010)

Hallo!

mir ist klar wie man einen pfad für ein file angibt, ist es möglich es so zu definieren, dass java das file wie eine klasse behandelt wird und es in einem der packeges stehen kann?
Damit egal wo man das Programm dann am pc hinkopiert oder es verschiebt es das inputfile findet.

lg
Tom


----------



## Andi_CH (15. Nov 2010)

Das Programm sucht das file dort wo der Pfad hinzeigt - es ist doch egal wohin man das Programm kopiert ???:L

Es sei denn du kopierst das Programm und das File zusammen irgendwohin - dann musst du halt den Pfad nicht absolut (C:/gaga/gugus.file) sondern relativ (../../gaga/gugus.txt) angeben.

(Das hat aber eher mit Betriebssystem als mit Java zu tun)

[EDIT] Wenn du keinen Pfad angibst wird das file im Directory . gesucht.


----------



## Tom_ (15. Nov 2010)

Das findet er mir nicht:
BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("PinYinInput2.txt"), "UTF-8"));

die vrzeichnisstruktur sieht so aus:
C:\workspace\JavaTraining\src\fis\th\vokabelheft

Da sind alle packeges drinn und jetzt auch das PinYinInput2.txt file.
Wenn ich es so angebe:  C:\workspace\JavaTraining\src\fis\th\vokabelheft findet er es natürlich, aber das bringt es nicht wirklich.

lg
Tom


----------



## Gast2 (15. Nov 2010)

getRessourceAsStream() wird dir da helfen:
getResourceAsStream : Java Glossary


----------



## Tom_ (15. Nov 2010)

EikeB hat gesagt.:


> getRessourceAsStream() wird dir da helfen:
> getResourceAsStream : Java Glossary



@EikeB

Tur mir leid, verstehe ich nicht. 

BufferedReader br = new BufferedReader(new InputStreamReader(this.class.getResourceAsStream( "PinYinInput2.txt" )));
Cannot use this in a static context

Ich weiß dann auch nicht welchen klassennamen ich angeben soll, der packeg name alleine reicht nicht, da will er eine klasse erstellen.


----------



## Andi_CH (15. Nov 2010)

Und warum bringt es das nicht? Es gibt nun mal nichts anderes als absolute und realtive Pfade

Ein File ist nun mal keine Klasse, sondern ein File - wenn du eine Klasse willst mach eine Klasse und pack deine Daten da rein und lies sie aus.

Aber ich lasse mich gerne davon überzeugen, dass ich mich geirrt habe, wenn es einen anderen Weg gibt.


----------



## Andi_CH (15. Nov 2010)

Tom_ hat gesagt.:


> @EikeB
> 
> Tur mir leid, verstehe ich nicht.
> 
> ...


Vielleicht musst du es einfach in einen dynamischen Kontext rein tun, dann dürfte es gehen .... aus düftigen Requirementsumschreibungen und Mikrocodeschnipseln ist es immer schwierig etwas herauszufinden ....


----------



## Landei (15. Nov 2010)

Tom_ hat gesagt.:


> BufferedReader br = new BufferedReader(new InputStreamReader(this.class.getResourceAsStream( "PinYinInput2.txt" )));
> Cannot use this in a static context



Nimm this.getClass()..., denn class geht _nur _nach dem Klassennamen (z.B. MeineKlasse.class).


----------



## Tom_ (15. Nov 2010)

@landei er nimmt mir das this. nicht.

habe jetzt im netz diese lösung gefunden:

```
File chinBib = new File("PinYinInput2.txt");  
				String path = chinBib.getAbsolutePath();  
				BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(path), "UTF-8"));
```

Die funktioniert jetzt zwar, macht aber 2 probleme.

Beim ausführen mit eclips sucht er unter diesem pfad:
C:\workspace\JavaTraining\PinYinInput2.txt

Beim exportieren in ein ausführbares jar file sucht er hier ( wo ich es ursprünglich wollte):
C:\workspace\JavaTraining\src\fis\th\vokabelheft

ergebnis: in Eclips läuft es aber das exportierte jar-file liest die datei nicht ein.


----------



## Tom_ (15. Nov 2010)

ok! Danke  

Ist gelöst, das file braucht er im verzeichnis von dem jar file. Das andere problem mit den pfaden hat ein refresh gelöst.


----------



## Tom_ (16. Nov 2010)

Also Java ist schon etwas eigenwillig, in der Firma schreibt es in utf8 raus und jetzt das jar-file zuhause plötzlich in ANSI, hätte von der tastatur abbeißen können vor ärger nach dem ich eine stunde Vokabeln eingetipt habe für nichts... 

Hab im Forum schon gefunden, man kann utf8 auch beim schreiben erzwingen aber nach was richtet sich java standardmäßig?


----------



## noobadix (16. Nov 2010)

Standardmäßig wird afaik die Codierung verwendet, die das OS benutzt, darum sollte sowohl beim Lesen als auch beim Schreiben die Codierung angegeben werden. 
Übrigens aufpassen, wenn man die Speicherdatei mit einem Editor bearbeitet und dann speichert, da kann sich die Codierung ändern, womit du aber deine Arbeit retten kannst!


----------



## Tom_ (18. Nov 2010)

Hab das jetzt gefunden und eingebaut:

```
BufferedWriter out = new BufferedWriter(new OutputStreamWriter
                (new FileOutputStream("Vokabeln.txt",true),"UTF8"));
```

Das einzige was mich stört, dass der nicht erkennt wenn er das erste mal in ein file schreibt.

der hier:

```
PrintWriter fileWriter = new PrintWriter(new FileWriter("Vokabeln.txt",true));
```

kann println und schreibt immer eine neue zeile egal zu welchem zeitpunkt.

Bei meiner version, muss man jetzt out.newLine(); davor setzen und dadurch entsteht mir eine leerzeile am anfang der datei, stört jetzt funktionell nicht ist aber auch nicht schön.
Habe auch out.write("/n"+variable); Probiert dann schreibt er zwar in einer neuen Zeile aber auch das "/n" .


----------



## Tom_ (19. Nov 2010)

Hallo! Zusammen,

Bei meiner Jtabel ist es jetzt möglich durch einen klick auf den spaltenheader die spalte abzudecken, in dem ich beim cellrenderer einfach hintergrund und vordergrung auf die selbe farbe setze. Soweit so gut! Leider lassen sich die spalten verschieben und man muss manchmal öfter klicken bevor java weiß was man von ihm will, es wechselt in den "verschiebemodus" und deckt die spalte nicht ab oder auf. Der effekt ist auch nicht 100% wiederholbar da es irgendwie mit dem klicken zusammenhängt.

Jetzt habe ich zu dem thema folgendes gefunden; http://www.java-forum.org/awt-swing-swt/52258-jtable-spalten-verschieben-deaktivieren.html 
in dem dieser befehl vorgeschlagen wird myJTable.getTableHeader().setReorderingAllowed(false) . Das problem dabei ist, nach der deaktivierung ist es nicht mehr möglich die ganze spalte abzudecken. Es tut sich erst einmal gar nichts und wenn man dann die zellen anklickt die gefärbt sein sollten, kann man sie nahezu einzeln umfärben.
Hat da jemand eine idee/lösung?

lg
Tom


----------



## Tom_ (22. Nov 2010)

Ich hab jetzt die not zur tugend gemacht und die ausgabe sowie die logik für das abdecken an die jeweilige, nun beliebige, spaltenposition angepasst. Sprich es steht jetzt in jeder spalte immer das drinn was auch drauf steht.

Jetzt würde ich allerdings gern die vom user neu definierte reihenfolge abspeichern und beim nächsten neustart die spalten gleich in der reihenfolge darstellen.

Zu dem probelm gefunden habe ich :


```
GuiHauptseite.anzeigeTable.getColumnName(0).equalsIgnoreCase("A")
```

Damit läßt sich feststellen welche spalte sich gerade wo befindet. JAVA vergibt automatisch die namen "A" "B" "C" für meine 3 spalten.


```
System.out.println(GuiHauptseite.anzeigeTable.col1.getModelIndex());
```

Gibt mir die spaltennummer, die sich beim verschieben aber nicht ändert !!

Es verschiebt sich demnach nur der header.

Ich würde jetzt gern zb: dem modelindex 0 die spalte "C" zuweisen 1 -> "B" 2->"C" ... also eigentlich genau das was der user mit der mous durch drag and drop macht.

Konnte das leider nicht finden/oder nicht herauslesen.

Geht das?

lg
Tom


----------



## Tom_ (22. Nov 2010)

habs GuiHauptseite.anzeigeTable.getColumnModel().moveColumn(0, 1);

http://www.java-forum.org/awt-swing-swt/26172-columns-jtable-umsortieren.html

falscher suchbegriff beim ersten versuch


----------



## Tom_ (14. Dez 2010)

Hallo! Zusammen,

nach langer Zeit habe ich mal wieder etwas nicht finden können.

Ich Speicher den text aus einer Jtextarea in einem file ab das ca. so aussieht

*******
0;kopf;0;Dies ist eine testgruppe mit vieeeel text.
Dieser Text enthÃ¤lt mindestens einen Zeilenumbruch und geht Ã¼ber mehrere zeilen, er sit auch lang genug um in dem Scrollpanel zu scrollen.
1;test;0;Noch keine Beschreibung.
2;test2;0;Noch keine Beschreibung.
**************
die letzten 2 zeilen sind so wie ich es erwarte.

Bei der ersten Zeile habe ich in der jtextarea einmal enter gedrückt und somit eine neue zeile erzeugt.

Wie kann ich das einlesen, so dass ich einfach den String wieder in die JTextarea setzen kann. Das Problem ist, das er nach dem enter beim einlesen auch eine zweite zeile beginnt und die kann ich so gar nicht verdauen.

```
while ((zeile = br.readLine()) != null)
				{
					if (zeile.length()!= 0)
				   	{
					zeilelesen = new GruppenZeile();
					String[] spalten = zeile.split(";");
					System.out.println(zeile);
					System.out.println(spalten[0]);						
					zeilelesen.setLaufNummer(Integer.parseInt(spalten[0]));
					zeilelesen.setGruppenName(spalten[1]);
		            zeilelesen.setAnzahlWoerter(Integer.parseInt(spalten[2]));
		            zeilelesen.setGruppenBeschreibung(spalten[3]);
		           GruppenTabelle.setAlleGruppen(zeilelesen);
				   	}
				}
```

plötzlich steht in spalte null der text aus der 2.zeile der ja noch in die erste gehört und im programm wird natürlich nur der text vor dem enter angezeigt.

lg
Tom


----------



## Tom_ (6. Sep 2011)

So dir erste brauchbare version ist da, wer es sich anschauen will 

https://rapidshare.com/files/2960326434/Vokabeltrainer_v1.05.rar

Schriftart udg für chin zeichen wird mitgeliefert und automatisch geladen.

lg
Tom


----------

