# Zufällige Auswahl innerhalb eines Arrays und Arrays aus JLabel füllen



## keeplaughing (10. Jul 2011)

Hallo, 
ich hab ein paar kleinere Probleme (ich hoffe jedenfalls, dass sie klein sind)
das thema des programms ist genetik und ich bin mittlerweile auch soziemlich soweit, dass es das macht, was ich will, nur manchmal hab ich noch das problem, dass ich die itemStateChanged-Events zu voll mache, da ich extrem viele variablen habe (kann man das irgendwie umgehen?)
Vorschau1
hier kann man aus jeder reihe (bis auf die letzte) jeweils einen button auswählen und dementsprechend ändert sich dann "Coatcolor" und "Genotype"
Vorschau2
so sieht das ganze nachher aus

ich möchte einen Button erstellen, der bei Klick/Aktivierung zufällig aus einem Array auswählt. (Random Gender) hier habe ich nur zwei möglichkeiten (männlein o. weiblein) aus denen zufällig gewählt werden soll, das ergebnis soll dann in einem JLabel ausgegeben werden

Button erstellen und mit ActionListener belegen ist kein Problem, ActionPerformed ruft dann meine methode auf, aber da hapert es dann.

ich habe bisher immer nur von Math.Random gelesen und das ist irgendwie zu kompliziert für mein vorhaben

der 2. button (Random color) soll genau das gleiche machen, allerdings mit variabler anzahl an möglichkeiten, die zuvor mit einem anderen button (Show all possibilities) bestimmt werden 

dieser soll nämlich zwei JLabels (Genotype) auslesen und kombinieren können und ich muss gestehen, ich habe keine ahnung wie ich das lösen soll

also wenn bei Genotype einmal "Ee Aa" und einmal "ee nCr" steht, dann sollen als möglichkeiten
Ee
Ee Aa 
Ee Aa nCr
Ee nCr
ee
ee Aa
ee Aa nCr
ee nCr
rauskommen
von denen "Random color" dann eine zufällig auswählt

ich dachte mir, ich könnte multidimensionale arrays mit den genotypen füllen und dann aus jedem array eines per zufall auswählen und dann ausgeben bzw alle ausgeben

wäre das möglich oder gibt es noch eine elegantere lösung?
und wie genau programmiere ich den random teil und das einlesen der codes ins array

ich bin für jede hilfe sehr dankbar, programmiere an dem programm seit etwa 2 wochen und hab schon über 20.000 zeilen quellcode und immernoch ist kein ende in sicht^^


----------



## Marco13 (10. Jul 2011)

Klingt chaotisch, vielleicht würden ein paar Codezeilen helfen... Aber zum "random" kannst du dir mal zwei Dinge ansehen, die vielleicht nützlich sein könnten: 
Collections (Java Platform SE 6)
bzw.
Random (Java Platform SE 6)


----------



## keeplaughing (10. Jul 2011)

klingt chaotisch ist gut xD
das progrmm soll eingentlich ja ganz einfach sein, aber ich muss für jede möglichkeit was einbauen und so entstehen ganz schnell mal die 20.00 zeilen^^

dankeschön, les ich mir durch

ich hab in der hinsicht dieser programmteile noch nichts programmiert, weil ich nicht weiter wusste, tut mir leid


----------



## keeplaughing (10. Jul 2011)

also zum Random hab ich jetzt was gefunden und es funktioniert, danke für den Tipp

[JAVA=42]private void randomGender(){
		// TODO Auto-generated method stub
		Random rnd = new Random();
		int z = rnd.nextInt(9);
		if(z==1||z==3||z==5||z==7){
			gender.setText("Gender:   Filly");
		}
		else if(z==0||z==2||z==4||z==6||z==8){
			gender.setText("Gender:   Colt");
		}

	}[/code]

aber wie ich das mit dem auslesen machen kann, davon hab ich immernoch keinen plan^^


----------



## Marco13 (10. Jul 2011)

Ohne das Programm zu kennen, und ohne den Hauch einer Ahnung zu haben, was genau da gemacht wird, behaupte ich mal ganz frech, dass man diese 20000 Zeilen auch auf 500 Zeilen reduzieren könnte. Und um meine Kristallkugel mal auf eine Probe zu stellen: Du hast Checkboxen/Labels in der Form

```
private JCheckBox checkBox_Ee;
private JCheckBox checkBox_Ee_Aa;
private JCheckBox checkBox_Ee_Aa_nCr;
private JCheckBox checkBox_Ee_nCr;
private JCheckBox checkBox_ee;
private JCheckBox checkBox_ee_Aa;
private JCheckBox checkBox_ee_Aa_nCr;
private JCheckBox checkBox_ee_nCr;
```
richtig? 


"Labels auslesen" in dieser Form macht nicht sooo viel Sinn - man kann sich mit label.getText() den Text des Labels holen, aber ... ich glaube, das würde hier auch nicht so viel bringen. Poste den Code am besten mal (vielleicht irgendwo als ZIP hochgeladen oder so - hier ins Forum wird er nicht passen  )


----------



## keeplaughing (10. Jul 2011)

ich hab radiobuttons
(siehe oben hab ich nen Link von dem aufbau)

auf 500 zeilen reduzieren wird schwierig, da allein das instantiieren der radiobuttons und das platzieren schon 500 zeilen hat, aber mir wäre es nur recht^^

also ein ausschnitt von dem wie ich es mache (das ist jetzt eine einzige farbkombination mit 3 aktiven genen)

```
else if(foxRB.isSelected()==true && (noagoutiRB.isSelected()==true || heterobayRB.isSelected()==true || homobayRB.isSelected()==true 
						|| heterosealbrownRB.isSelected()==true || homosealbrownRB.isSelected()==true) 
						&& (heterodunRB.isSelected()==true || homodunRB.isSelected()==true)
						&& heterocreamRB.isSelected()==true && nochampagneRB.isSelected()==true && (nosilverRB.isSelected()==true || heterosilverRB.isSelected()==true 
						|| homosilverRB.isSelected()==true)&& (noflaxenRB.isSelected()==true || heteroflaxenRB.isSelected()==true || homoflaxenRB.isSelected()==true) 
						&& nosootyRB.isSelected()==true 
						&& nogreyRB.isSelected()==true && nowhiteRB.isSelected()==true && noroanRB.isSelected()==true 
						&& norabicanoRB.isSelected()==true && notobianoRB.isSelected()==true && nooveroRB.isSelected()==true
						&& nosabinoRB.isSelected()==true && nosplashRB.isSelected()==true && noleopardRB.isSelected()==true){
					color.setText("Dunalino");
					if(foxRB.isSelected()==true){
						code.setText("ee");
						}
					if(heterocreamRB.isSelected()==true){
					    code.setText(code.getText()+ " nCr");
					}
					if(heterodunRB.isSelected()==true){
					    code.setText(code.getText()+ " Dd");
					}
					else if(homodunRB.isSelected()==true){
						code.setText(code.getText()+ " DD");	
					}
					if(noflaxenRB.isSelected()==true){
						code.setText(code.getText()+ " flfl");
					}
					else if(heteroflaxenRB.isSelected()==true){
						code.setText(code.getText()+ " Flfl");
					}
					if(heterobayRB.isSelected()==true){
						code.setText(code.getText()+ " Aa");
					}
					else if(homobayRB.isSelected()==true){
						code.setText(code.getText()+ " AA");
					}
					else if(heterosealbrownRB.isSelected()==true){
						code.setText(code.getText()+ " Ata");
					}
					else if(homosealbrownRB.isSelected()==true){
						code.setText(code.getText()+ " AtAt");
					}
					if(heterosilverRB.isSelected()==true){
						code.setText(code.getText()+ " Zz");
					}
					else if(homosilverRB.isSelected()==true){
						code.setText(code.getText()+ " ZZ");
					}
				}
```

also ich brauch ja irgendwas um an diesen "code" ranzukommen, damit ich die kombinieren kann, nur wie ist da die frage

das einzige was mir einfällt, wäre eben ein multidimensionales Array


----------



## Marco13 (11. Jul 2011)

keeplaughing hat gesagt.:


> auf 500 zeilen reduzieren wird schwierig, da allein das instantiieren der radiobuttons und das platzieren schon 500 zeilen hat, aber mir wäre es nur recht^^



Topp, die Wette gilt! :smoke: 

Aber im Ernst: GUI-Code kann schon recht aufgebläht sein, das mag stimmen. Trotzdem gehe ich davon aus, dass hier SO viele "reguläre" Anteile enthalten sind, dass man sich das meiste (er)sparen könnte. Ich vermute einfach, dass man das Instantiieren (beim richtigen Ansatz) auch in einer 10-zeiligen Schleife machen (und das Platzieren ohnehin dem LayoutManager überlassen) könnte. 
Abgesehen davon... eigentlich ist das, was man damit bedient, ja wohl irgendwie... eine Art... naja, sozusagen eine "Maschine", die Regeln verarbeitet. Also, das eigentlich aufwändige und komplizierte "sollte" ja das Datenmodell und die Verarbeitung dieser Codes sein (das GUI ist ja "nur" die Oberfläche).

Sowas wie diese if-Abfrage hatte ich schon fast erwartet. Es ist schwierig, das einzuschätzen, solange man nicht im Thema drin ist, und weiß, WAS genau dort gemacht wird. Aber ganz vordergründig betrachtet wird aufgrund irgendeiner komplizierten Kombination von angeklickten Radiobuttons ein String zusammengebaut. Dort scheint gar kein "Datenmodell" in dem Sinne zu existieren? ???:L

Aber mal ganz oben ansetzen: Wo kommen denn diese "Regeln" her? (Die, die beschreiben bei welchen Checkboxen welcher Code-String zusammengebaut wird)


EDIT: Ach ja, falls dir das alles egal ist: Mit code.getText() könnte man sich den Text holen, und den dann z.B. mit string.split oder einen StringTokenizer zerlegen, aber ... das führt so ja alles zu nichts...


----------



## keeplaughing (11. Jul 2011)

das sind bestimmte regeln aus der genetik
das kann ich dir aber nicht so auf die schnelle erklären

wenn irgendwo no...RB steht, dann steht das dafür, dass das Gen inaktiv ist, hetero...RB teilaktiv, homo...RB aktiv
manche gene bewirken keine veränderung im fell, weil sie entweder nur auf rot verändern (flaxen) oder nur auf schwarz (bay, seal brown, silver), allerdings kann ein tier, welches das gen nicht zeigt auch ein träger dieses gens sein, deshalb brauch ich diese etlichen if-konstrukte (dort wird zwat der "code" verändert, aber nicht die fellfarbe (Coatcolor)

hm, mit dir an meiner seite kann ich bestimmt so eine maschine entwickeln
ich bin allerdings irgendwas zwischen blutiger anfänger und ich kann ein bisschen java, kenne mich aber nicht mit den fachbereichen aus
deshalb hab ich auch nur irgendwie versucht das ganze zum laufen zu bringen, hauptsache es funktioniert

achja zu dem LayoutManager, ist das nicht im endeffeckt wieder genausoviel tipparbeit?


----------



## Marco13 (11. Jul 2011)

Es geht nicht darum, die Regeln zu verstehen, sondern nur darum, zu wissen, wie sie formuliert sind und wie sie abgearbeitet werden. Oder anders: 

_wenn irgendwo no...RB steht, dann steht das dafür, dass das Gen inaktiv ist, hetero...RB teilaktiv, homo...RB aktiv... manche gene bewirken keine veränderung im fell, weil sie entweder nur auf rot verändern (flaxen) oder nur auf schwarz (bay, seal brown, silver), _

Und woher weißt du das?

Falls meine Vermutung, dass in deinem bisherigen Code ganz oft sowas wie
someCB.setBounds(x,y,w,h);
vorkommt, könnten LayoutManager das doch einfacher machen - im speziellen das GridLayout. Aber schon das erstellen der Checkboxen könnte eventuell(!) weitgehend automatisiert werden.


----------



## keeplaughing (11. Jul 2011)

"Und woher weißt du das?"
Ich hab mir ne ganze menge wissen über genetik angelesen

die regeln sind eigentlich ganz einfach, im genotyp werden nur aktive gene abgebildet, mit außnahme des fuchs und flachxen-gens, da diese rezessiv sind
und nach dem genotyp richtet sich die fellfarbe (Coatcolor)

jap genau, knapp 60x
...setBounds();

ich dachte mir, dass wenn ich das mit dem Layoutmanager mache kann ich die buttons nicht so platzieren, wie ich es möchte, oder geht da doch so viel?


----------



## Marco13 (11. Jul 2011)

Erstmal eine Kleinigkeit: 
[c]if (cb.isSelected() == true) { ... } [/c]
ist das gleiche wie
[c]if (cb.isSelected()) { ... } [/c]
und
[c]if (cb.isSelected() == false) { ... } [/c]
ist das gleiche wie
[c]if (!cb.isSelected()) { ... } [/c]
aber das nur nebenbei, lohnt sich jetzt vermutlich nicht, das überall zu ändern - da gibt's wichtigeres. Nämlich z.B. ob es irgendwelche Möglichkeiten gibt, diese Regeln so zu beschreiben, dass sie leichter automatisch verarbeitet werden können, als über einen Haufen händisch hingeschriebene if's. Das Beispiel, was du gepostet hattest, beschreibt ja...

```
WENN (ein Haufen Bedingungen erfüllt sind) DANN ist es ein "Dunalino"
    UND wenn zusätzlich foxRB ist, dann ist es zusätzlich "ee"
    UND wenn zusätzlich heterocreamRB ist, dann ist es zusätzlich "nCr"
...
```

Inwieweit sind denn z.B. die "zusätzlichen" Bedinungen (foxRB und so) abhängig oder unabhäng davon, dass des "Dunalino" ist? 

Eine grob ("Brainstorming-artig") angedeutete Möglichkeit, wie man das kompakter und allgemeiner (und leichter verarbeitbar und ggf. auch leichter erweiterbar, und vor allem: Getrennt vom GUI!) beschreiben könnte, KÖNNTE sowas sein wie

```
Race race = new Race("Dunalino");
race.addCondition( fox );
race.addCondition((noagouti | heterobay | homobay | heterosealbrown | homosealbrown) );
race.addCondition((heterodun | homodun) );
race.addCondition( heterocream );
race.addCondition( nochampagne );
race.addCondition((nosilver | heterosilver | homosilver) );
race.addCondition((noflaxen | heteroflaxen | homoflaxen) );
race.addCondition( nosooty );
race.addCondition( nogrey );
race.addCondition( nowhite );
race.addCondition( noroan );
race.addCondition( norabicano );
race.addCondition( notobiano );
race.addCondition( noovero );
race.addCondition( nosabino );
race.addCondition( nosplash );
race.addCondition( noleopard );

race.addSpecific(fox, ee);
race.addSpecific(heterocream, nCr);
...
```
(wirklich nur GANZ grob angedeutet!) Vermutlich könte man das auch noch eleganter und kompakter beschreiben, indem man das ganze (also, diese Bedinungen und Regeln) in einer Datei speichert und dann ausliest - dann bräuchte man bei neuen Bedingungen nicht hunderte Zeile if-Abfragen einzufügen, sondern könnte die Änderungen in der Datei machen. 

Also, Möglichkeiten gibt's da etliche, und die meisten sind eleganter als if-Absfragen auf Basis von RadioButtons  Welche die geschickteste ist, ist aber schwer zu sagen, solange man nicht die Spezifika der Domäne kennt - also solange man nicht weiß, welche Regeln es gibt, und wie sie verarbeitet werden können.

BTW, zu den Layouts: Das sieht im Moment erstmal nach einem einfachen GridLayout aus - also, alle RadioButtons sind ja einfach in ein "Gitter" einsortiert!?


----------



## keeplaughing (11. Jul 2011)

was meine schleife beschreibt ist

WENN (Bedingungen erfüllt) DANN ist die FELLFARBE DUNALINO
ist foxRB ausgewählt wird der CODE des GENOTYPS auf "ee" gesetzt
ist heterocreamRB ausgewählt wird der CODE um " nCr" erweitert

das muss ich haben, weil es gerade in dieser schleife nicht nur den grundsätzlichen Genotyp zu einer farbe gibt (in diesem Fall "ee Dd nCr"), sondern manche gene keine wirkung auf die basis haben (dominant und rezessiv, falls dir das was sagt), diese möglichkeiten muss ich alle mit einbauen und dafür sind die ganzen ifs

ich verstehe nicht so ganz, was genau du meinst
wenn ich eine neue variable "Fellfarbe" erstelle, dann hab ich da ja auch die ganzen bedingungen, also weniger tipparbeit wirds sowieso glaub ich nicht mehr^^


----------



## Marco13 (11. Jul 2011)

Ganz allgemein geht es eben darum, nicht die spezifische Information über eine Konfiguration mit vielen if's zu bauen, sondern die Information zu strukturieren, und zu beschreiben, wie diese Information verarbeitet wird. 

Dass "Dunalino" eine Fellfarbe ist, und dass es FELLFARBE und GENOTYP gibt, ist doch schonmal ein Beispiel von dem, was man wissen müßte. 

Ist der String, der da zusammengebaut wird, immer nach einem bestimmten Muster aufgebaut, wie zum Beispiel 

```
String = "Dunalino     ee        nCr  ... "
             ^         ^         ^
         FELLFARBE     GENOTYP   CODE ... (evtl. weitere...)
```
(wobei vielleicht einzelne Teile dieser Information auch "leer/unbekannt" sein könnten). Dann wäre es ja so, dass dort etliche verschiedene _Arten von Information_ (also eben Fellfarbe und Genotyp) "gemischt" drin stehen. Könnte man das, was am Ende in diesem String steht, irgendwie strukturiert in eine Klasse packen? Z.B. eine Klasse machen mit Methoden wie

```
class Rasse 
{
    Fellfarbe getFellfarbe() { ... }
    Genotyp getGenotyp() { ... }
    Code getCode() { ... }
}
```
Wie man dominant und rezessiv dann noch modellieren könnte, müßte man sich noch überlegen (für sowas wie [c]einGenotyp.istRezessiv()[/c] oder so...) wenn man eine konkretere Idee davon hat, WIE man das aufbauen könnte. Diese Idee habe ich (noch?) nicht, aber... von dem wenigen, was ich dort im oberflächlichsten Sinne verstanden zu haben glaube, wäre es doch unter anderem das Ziel (oder _ein_ Ziel, oder zumindest praktisch oder interessant) sowas zu machen wie

```
Rasse sir = new BraunerHaflinger();
Rasse dam = new SchwarzWeißGestreifterAraber(akaZebra);
Rasse fohlen = sir.mate(dam);
showPropertiesInGUI(fohlen);
```
(also vereinfacht gesagt: Mit diesen Eigenschaften "rumzurechnen"...)...?


----------



## Marco13 (11. Jul 2011)

Ah ja, bin gerade mal dem Link auf horsetesting.com gefolgt: Inwiefern soll das zu erstellende Programm davon abweichen?


----------



## keeplaughing (11. Jul 2011)

an sich hat mein programm mehr möglichkeiten bzw. in dem von horsetesting.com fehlen einige variationen
außerdem kommt zu meinem ja noch hinzu, dass eine fellfarbe der möglichkeiten per zufall gewählt werden kann sowie das geschlecht ausgewürfelt werden kann

so in etwa
also die fellfarbe und der genotyp sind 2 strings, bzw. Labels code ist nur ein label in dem dann der tatsächliche genotyp steht, in genotyp steht nur "genotyp:"

JLabel coatcolor ... JLabel color
"Coatcolor:" ... z.B. "Fuchs"
JLabel genotype ... JLabel code
"Genotype:" ... "ee"

also bei einer Klasse für die Farbe (Rasse ist hier völlig schnuppe) wären nur color und code von belang

ja genau, es geht darum, dass das programm die möglichkeiten ausrechnet
genau wie du es meintest
ich gebe die informationen für die eltern ein, z.b.
Sire = Dunkelbrauner
Dam = Fuchs
und möchte dann rausbekommen, dass das fohlen
Rappe, Dunkelbrauner, Dunkelfuchs, Fuchs oder Brauner sein kann

das einzige woran es harpert ist eben das kombinieren der eltern fellfarben


----------



## Marco13 (11. Jul 2011)

Ja, wie angedeutet: Man könnte das jetzt "irgendwie" machen. Falls du es nur "irgendwie" machen willst (und egal ist, wie...) dann sag' nochmal möglichst genau, was gerade (rein technisch) nicht geht.
Ansonsten... was ist der "Code" genau?


----------



## keeplaughing (11. Jul 2011)

der code ist einfach das Label, die z.B. "Ee Aa" ausgibt

mir wär natürlich lieb das ganze so einfach wie möglich zu gestalten, das hab ich mit meinen anfängerkenntnissen gemacht, was rauskam ist ein programm, das lediglich zwei labels je nach kombination der radiobuttons ändert, genau das wollte ich ja auch, aber das auf den inhalt der labels zugreifen und die kombinieren krieg ich so nicht hin

allerdings hab ich so viele bedingungen, dass ich immer meine itemstatechange-methode überlade

also wenn ich das richtig verstehe brauche ich eine methode, die die verknüpfungen der radiobuttons verarbeitet (hab ich ja versucht mit meinen ellenlangen ifs) und dann den dementsprechenden genotyp und die fellfarbe ausgibt

müsste ich da für jede fallfarbe eine eigene methode erstellen? dann hab ich später ja wieder milliarden zeilen quellcode

sowie die verarbeitende methode (rechner)


----------



## Michael... (11. Jul 2011)

Ich hab's jetzt nicht wirklich genau verstanden.
Wie viele verschiedene Attribute müssen denn vom Anwender angeben werden Fellfarbe, Genotyp...?
Für ein Attribut existieren beliebig viele Radiobuttons von denen (pro Attribut) nur eine selektiert werden kann?
Dann brauchst Du keine "ellenlange" If Konstrukte - eigentlich benötigt man dafür kein einziges if.

Und keine Angst für sowas sind keine milliarden Zeilen Code notwendig, das sollte sich mit wenigen hundert Zeilen umsetzen lassen.

Hier noch was zu RadioButtons - falls noch nicht bekannt:
How to Use Buttons, Check Boxes, and Radio Buttons (The Java™ Tutorials > Creating a GUI With JFC/Swing > Using Swing Components)


----------



## Marco13 (12. Jul 2011)

Nochmal: Ich weiß nicht, wie man das, was du da vorhast, am besten modelliert. Ich weiß auch nicht, wie viele Zeilen man sich spart. In diesem Fall ist es vielleicht tatsächlich so, dass man einmal diese if's runterprogrammiert, und dann bleibt das bis ans Ende aller Tage so, und es funktioniert und alles ist gut.

Aber üblicherweise verwendet man ja Computer, um Dinge zu automatisieren und zu verallgemeinern. Diesen if's würde es ja entsprechen, z.B. in irgendeiner Tabelle nachzuschauen, die man sich ausgedruckt hat :autsch: Und in diesem Fall mag das vielleicht für dich im ersten Moment unrealistisch und sehr weit gegriffen (und vermutlich auch vollkommen irrelevant) sein, aber ... so ein Programm könnte man ja (FALLS es möglich ist, das so allgemein zu beschreiben - das weiß ich nicht!) in seiner allgemeinsten Form vielleicht auch für Kühe oder Hühner anwenden... Auch da werden """nur""" irgendwelche Eigenschaften kombiniert und rezessiv oder dominant vererbt, und am Ende ist das Tier eben schwarz oder weiß.... Aber nochmal: Davon habe ich keine Ahnung :bahnhof:

Was eher relevant sein KÖNNTE, wäre eventuelle Änderungen oder Erweiterungen - eben neue "Variationen", von denen du ja sagtest, dass es die auf horsetesting.com nicht gibt. Wenn dich in zwei Monaten jemand per Mail anschreibt, und sagt: "Hey, da Fehlt eine Variation: Ein weißer Araber und ein brauner Kaltblut ergeben einen Hellgelben Haflinger" - denkst du dann "Oh nein, noch eine 200-zeilige if-Abfrage ... wie ging das alles denn nochmal?", oder sagst du: "Kein Problem, ist in 5 Minuten eingebaut" ?

Und zum dritten mal, weil ich nicht irgendwelche unberechtigten Illusionen wecken will, die dann nicht erfüllt werden können: Ich habe keine Ahnung davon, und weiß nicht, wie gut man das alles kürzen, verallgemeinern und einfacher machen kann. Vielleicht hast du schon die einfachste Variante gefunden. (Glaube ich aber nicht  )

_der code ist einfach das Label, die z.B. "Ee Aa" ausgibt_

Und was bedeutet das, Ee und Aa? Was gibt es da noch alles?


----------



## keeplaughing (12. Jul 2011)

das einzige was man als nutzer kann ist radiobuttons auswählen und buttons klicken, man gibt nichts ein oder ähnliches

ich habe...lass mich überlegen...20 auswahlgruppen davon sind 17 buttonsgroups mit 3 bzw. 5/7 auswahl möglichkeiten(je nur eins möglich) und dann noch drei einzelne buttons
diese kann ich alle auf verschiedenste art und weise kombinieren (es gibt eine vorauswahl(alles inaktiv))
je nach kombination ändern sich die inhalte zweier JLabels, das eine ist code, welche etwas wie z.B. "Ee Aa" ausgibt, das andere ist color, welches den zugehörigen Namen zum code ausgibt (in diesem fall "Brauner")

also das einzige neue wasa ich da jetzt finde ist, dass ich für mehrere buttons (eine buttongroup?) nur einen actionlistener brauche, das könnte evtl ganz praktisch sein, sollte ich diesen actionlistener für alle meine buttons nutzen können(da bin ich mir noch nicht sicher, ob das geht. sieht für mich nur danach aus, dass ich einen listener für eine group nutzen kann)


----------



## Marco13 (12. Jul 2011)

OK, hab' nochmal planlos in dem anderen Programm rumgeklickt: Die Dinge, die man beim zweiten Eingabefeld auswählen kann, hängen ja irgendwie vom ersten ab: Bei manchen Auswhlen erscheint z.B. 

```
Agouti (Bay/Black)
   Unknown
   Non-Agouti (aa)
   Heterozygous (Aa)
   Homozygous Agouti (AA)
```
und bei anderen nicht. (Und da gibt's ja echt "Zebra Dan" :autsch: :lol: ). Bei anderen erscheinen solche Optionen wie "Red Factor (Extension)", "Roan" oder andere, jeweils mit verschiedenen Auswahlmöglichkeiten. Ganz am Ende erscheint das nochmal aufgelistet in einer Tabelle, und darunter diese Prozentangaben. Ich gehe mal davon aus, dass die tatsächliche Berechnung (z.B. diese Prozentangaben) NICHT von deinem Programm abgedeckt ist (und auch nicht davon abgedeckt sein soll) und wenn doch: Wo kommen die denn her?

Aber was am Ende ausgegeben werden soll, hat sich mir ohnehin noch nicht erschlossen. Wie auch immer: Gibt es irgendeine Regel, bei welcher Auswahl im ersten Menü welche der Punkte auf der zweiten Seite erscheinen? Also die Information:
"Wenn "Red Dun" "Splash" gewählt ist, soll es die Optionen
Agouti (Bay/Black)
Silver Dilution
Dun Dilution
Splash
geben"
?
Bei dir sieht das aus, als könnte man immer alles auswählen... oder ist das absicht?


----------



## Marco13 (12. Jul 2011)

(Das war gleichzeitig zu deinem Post, aber nicht ganz unpassend  )


----------



## keeplaughing (12. Jul 2011)

was gibts da alles noch?
(hast du dir die links im eingangspost angeguckt?)
wie man auf dem bild sehen kann habe ich nen ganzen schwung buttons^^ 20 gruppen um genau zu sein, die ALLE miteinander kombinierbar sind, d.h. ich habe immer mindestens 17 und maximal 20 ausgewählt (3 sind einzelne, von denen man keins, eins, zwei oder alle drei auswählen kann)


----------



## keeplaughing (12. Jul 2011)

aaaalso...nu gehts los
frau in ihrem fachgebiet xD

nehmen wir mal dein beispiel
du wählst "Red Dun" und "Splash"
das red (basis) steht IMMER für "ee"
das dun bedeutet entweder "Dd"(heterozyt) oder "DD"(homozyt) -> 1. auswahlmöglichkeit
splash kann ebenfalls heterozyt oder homozyt sein -> 2. auswahlmöglichkeit

dann gibt es noch gene die auf der basis red nicht zusehen sind, aber trotzdem da sein können
dazu gehört Agouti, das gen für ein braunes pferd, wenn die basis nicht red sonden black ist 
aa(nicht da), Aa (heterozyt), AA (homozyt) -> 3.auswahlmöglichkeit
silver sieht man ebenfalls nicht auf der basis red, kann aber auch da sein
zz(nicht da), Zz (heterozyt), ZZ (homozyt) -> 4. auswahlmöglichkeit

bei mir kann man schon zu beginn auswählen ob das gen nicht vorhanden, heterozyt oder homozyt ist


----------



## Marco13 (12. Jul 2011)

Ah, so beim gefühlt zehnten Ansehen passt das auch: Jede einzelne _Zeile_ aus deinem Eingabefeld steht für eins dieser... "Dinger" ("Red Factor", "Agouti", "Sabino" usw) von horsetesting. Aber... wen man da z.B. "Bay Sabino" auswählt, kommen nur die eben genannten drei Eingabemöglichkeiten?! Und bei dir sollen immer alle auswählbar sein? (Und die Beschriftungen wie "Samino" usw, und die Option "Unbekannt" gibt es nicht...?)


----------



## Marco13 (12. Jul 2011)

Irgendwie überschneiden sich die Posts dauernd  Ich schau morgen nochmal.


----------



## keeplaughing (12. Jul 2011)

genau richtig, jede _Zeile_ steht für ein Gen
die erste zeile ist die Basis "ee" ist die Basis Rot/Fuchsfarben, "Ee" und "EE" sind die Basis Schwarz
alle darauf folgenden Zeilen sind Modifikationsgene die aufhellen oder verdunkeln

wie schon vorher beschrieben haben einige Gene nur auf eine bestimmte Basis eine sichtbare wirkung (A(At) und Z auf Schwarz(Ee o. EE), Fl nur auf Rot(ee))

die meisten gene wirken heterozyt und homozyt gleich (daher immer die abfrage "unknown", "hetero", "homo"), lediglich das Cr-gen (Cream) wirkt in heterozyter ausführung anders als in homozyter ausführung (z.B. hetero -> Palomino (goldgelb & weiße mähne); homo -> Cremello (weißbeige mit rosa haut))

die "Patn" haben nur wirkung, wenn "Lp" zumindest heterozyt sind (Tigerscheck- bzw. appaloosa-gen) -> Pippi-Langstrumpf-Pferd

soweit dazu, das sollte für die verständnis-zwecke reichen

*Das Programm* soll so funktionieren, dass wenn ich einen x-beliebigen RadioButton auswähle, oben der dazugehörige Fellfarbenname und der ausgewählte genotyp angezeigt wird
(wäre vllt. einfacher, wenn ich unten einen button "berechne fellfarbe" oder ähnliches hinsetzte, da ich dann nicht für jeden radiobutton einen itemlistener brauche (oder wäre hier ein actionlistener für die radiobuttons passender?), aber ich möchte schon gerne bei meinem konzept bleiben)


----------



## Marco13 (12. Jul 2011)

OK, weiter oben hatte ich ja schonmal gefragt


> Das Beispiel, was du gepostet hattest, beschreibt ja...
> 
> ```
> WENN (ein Haufen Bedingungen erfüllt sind) DANN ist es ein "Dunalino"
> ...



Wenn ich die neuen Informationen da jetzt richtig verstanden habe, klingt das, als wäre der Teil der if-Abfragen, die den "code" zusammenbauen, immer gleich? (Vielleicht mit wenigen Ausnahemn/Spezialfällen). Also KÖNNTE man das theoretisch unterteilen in

```
String farbe = berechneFarbeAufBasisDerRadiobuttons();
String code = berechneCodeAufBasisDerRadiobuttons();
```
?!


(BTW: Ich denke auch, dass dort alles sofort aktualisiert werden könnte, wenn man die Auswahl ändert (d.h. dass man keinen "Berechne!"-Button braucht). Die eventuell komplizierte Verwaltung der Listener kann man sicher noch zusammenkürzen).

Poste vielleicht nochmal eine zweite, andere if-Abfrage (wie die weiter oben für "Dunalino"), und vielleicht einen "repäsentativen" (d.h. nicht zu kurzen, aber nicht notwendigerweise vollständigen) Teil des codes, wo die RadioButtons erstellt und mit Listenern und ButtonGroups verdrahtet werden.


----------



## keeplaughing (12. Jul 2011)

hier schonmal die zweite if-schleife
die farben "Bay" und "Seal Brown" (eine schleife, weil itemstatechange voll war xD

```
else if ((heteroblackRB.isSelected()==true || homoblackRB.isSelected()==true) 
						&& (heterobayRB.isSelected()==true || homobayRB.isSelected()==true || heterosealbrownRB.isSelected()==true || homosealbrownRB.isSelected()==true) 
						&& nodunRB.isSelected()==true 
						&& nocreamRB.isSelected()==true 
						&& nochampagneRB.isSelected()==true 
						&& nosilverRB.isSelected()==true  
						&& (noflaxenRB.isSelected()==true || heteroflaxenRB.isSelected()==true || homoflaxenRB.isSelected()==true) 
						&& nosootyRB.isSelected()==true
						&& nogreyRB.isSelected()==true 
						&& nowhiteRB.isSelected()==true 
						&& noroanRB.isSelected()==true 
						&& norabicanoRB.isSelected()==true 
						&& notobianoRB.isSelected()==true 
						&& nooveroRB.isSelected()==true
						&& nosabinoRB.isSelected()==true 
						&& nosplashRB.isSelected()==true 
						&& noleopardRB.isSelected()==true){
					
					if(heteroblackRB.isSelected()==true){
						code.setText("Ee");
					}
					else if(homoblackRB.isSelected()==true){
						code.setText("EE");
					}
					if(heterobayRB.isSelected()==true){
						color.setText("Bay");
						code.setText(code.getText()+ " Aa");
					}
					else if(homobayRB.isSelected()==true){
						color.setText("Bay");
						code.setText(code.getText()+ " AA");
					}
					else if(heterosealbrownRB.isSelected()==true){
						color.setText("Seal Brown");
						code.setText(code.getText()+ " Ata");
					}
					else if(homosealbrownRB.isSelected()==true){
						color.setText("Seal Brown");
						code.setText(code.getText()+ " AtAt");
					}
					if(noflaxenRB.isSelected()==true){
						code.setText(code.getText()+ " flfl");
					}
					else if(heteroflaxenRB.isSelected()==true){
						code.setText(code.getText()+ " Flfl");
					}
			    }
```

ich geb mal ein beispiel nur an "Bay" und "Seal Brown"

erstellen der buttons

```
JRadioButton noagoutiRB = new JRadioButton("aa");
	JRadioButton heterobayRB = new JRadioButton("Aa");
	JRadioButton homobayRB = new JRadioButton("AA");
	JRadioButton heterosealbrownRB = new JRadioButton("Ata");
	JRadioButton homosealbrownRB = new JRadioButton("AtAt");
```

dann mit panel.add(); aufs Panel und mit xyRB.setBounds(x,y,b,h); platzieren
buttongroup erstellen und vorauswahl setzen

```
ButtonGroup a = new ButtonGroup();
        a.add(noagoutiRB);
        a.add(heterobayRB);
        a.add(homobayRB);
        a.add(heterosealbrownRB);
        a.add(homosealbrownRB);
        noagoutiRB.setSelected(true);
```

wenn ich die buttons jetzt mit den listenern verdrahten möchte hab ich

```
xyRB.addItemListener(new ItemListener(){
			@Override
			public void itemStateChanged(ItemEvent arg0) {
                               //unzählige if-konstrukte
                        });
```

damit das programm mir oben anzeigt welchen code und welche fellfarbe ich habe muss dieses eine if (s.o.) mit allen dort aufgeführten buttons verknüpft werden, nur dann ändert sich der code und die fellfarbe wenn ich die passende kombination eingestellt habe


----------



## Michael... (12. Jul 2011)

Man sollte sich überlegen, ob es nicht Sinn macht (vor allem für die spätere Verwendung) die Merkmale in einer eigenen Klasse zu definieren.

Folgend ein Bsp ohne viele ifs.
Der "Code" wird einfach anhand der selektierten RadioButton erzeugt. Bei der Farbe kann man eventuell mit einer Mapping Tabelle arbeiten oder anhand eine Codeanalyse (da weiß ich allerdings nicht worauf es ankommt)


```
import java.awt.*;
import java.awt.event.*;

import javax.swing.*;
public class GenCalc extends JFrame {
	
	public final GenoType[] genoTypeList = new GenoType[]{
			new GenoType("red factor", new String[] {"ee", "Ee", "EE"}),
			new GenoType("agouti", new String[] {"aa", "Aa", "AA"}),
			new GenoType("roan", new String[] {"rr", "Rr", "RR"}),
			new GenoType("cream", new String[] {"crcr", "Crcr", "CrCr"})
	};
	
	private JPanel optionPan;
	private JLabel label;
	private ButtonGroup[] groupList;
	
	public GenCalc() {
		label = new JLabel("Select genotypes");
		optionPan = new JPanel(new GridLayout(0, 3));
		optionPan.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));
		this.getContentPane().setLayout(new BorderLayout(10, 10));
		this.getContentPane().add(optionPan);
		this.getContentPane().add(label, BorderLayout.NORTH);
		
		groupList = new ButtonGroup[genoTypeList.length]; //Anlegen einer ButtonGroup zu jedem Merkmal
		for (int i=0; i<genoTypeList.length; i++) {
			groupList[i] = createButtonGroup(genoTypeList[i]);
		}
	}
	
	//Hilfsmethode zum Erzeugen der ButtonGroups pro Merkmal
	private ButtonGroup createButtonGroup(GenoType genoType) {
		ButtonGroup group = new ButtonGroup();
		for (int i=0; i < genoType.getCodes().length; i++) { //Schleife zum Erzeugen der RadioButtons
			JRadioButton check = new JRadioButton(genoType.getCode(i));
			check.setActionCommand(genoType.getCode(i));
			check.addActionListener(new ActionListener() {
				public void actionPerformed(ActionEvent e) {
					displaySelection();
				}
			});
			group.add(check);
			optionPan.add(check);
		}
		return  group;
	}
	
	//Zusammensetzen des Anzeigetexts
	private void displaySelection() {
		StringBuilder buffer = new StringBuilder();
		for(int i=0; i<groupList.length; i++) {
			if (groupList[i].getSelection()!=null) {
				buffer.append(" ");
				buffer.append(groupList[i].getSelection().getActionCommand());
			}
		}
		label.setText(buffer.toString());
	}
	
	class GenoType {
		private String desc;
		private String[] code;
		
		public GenoType(String desc, String[] code) {
			this.desc = desc;
			this.code = code;
		}
		
		public String[] getCodes() {
			return code;
		}
		
		public String getDescription() {
			return desc;
		}
		
		public String getCode(int value) {
			if (value<=code.length)
				return code[value];
			else
				return "";
		}
	}
	
	public static void main(String[] args) {
		JFrame frame = new GenCalc();
		frame.pack();
		frame.setLocationRelativeTo(null);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setVisible(true);
	}
}
```


----------



## keeplaughing (12. Jul 2011)

also das mit der genotypelist hatte ich mir witzigerweise auch schon vorher gedacht
das ist doch ein multidimensionales array, oder verstehe ich das jetzt falsch?

Bsp.: [ee] [aa] [dd] [chch] [crcr] [FlFl] [zz] [stysty] [gg] [ww] [rnrn] [rbrb] [toto] [oo] [sbsb] [splspl] [lplp] [kein pattern]
wäre jetzt Chestnut und das einzige, was beim genotyp angegeben werden würde wäre "ee"


----------



## Michael... (12. Jul 2011)

keeplaughing hat gesagt.:


> also das mit der genotypelist hatte ich mir witzigerweise auch schon vorher gedacht
> das ist doch ein multidimensionales array, oder verstehe ich das jetzt falsch?


Indirekt ja. In erster Line ist ein GenoType Array. Ein GenoType Objekt wiederum enthält u.a. ein String Array. Man hätte das aber auch anders lösen können.
Dadurch ist zumindest die Codeerzeugung unabhängig von der Anzahl der Merkmale und somit beliebig erweiterbar.

Die Ermittlung und Anzeige des Farbnamen würde ich erst als zweiten Schritt angehen. Je nachdem wieviele Kombinationsmöglichkeiten es gibt (wobei das bei 20 Merkmalen einige sind) könnte man sich einmalig eine Tabelle definieren, in der man einfach anhand der Codesequenz die Farbe nachschlagen kann. Eventuell sind ja auch nicht alle Merkmale für den Farbnamen relevant.
Alternativ könnte man auch nach Mustern suchen. Wenn der Rotfaktor 
	
	
	
	





```
ee
```
 unabhängig von den restlichen Codes immer 
	
	
	
	





```
Chestnut
```
 ergibt. Würde es ja ausreichen zu prüfen, ob die Codesequenz eben mit 
	
	
	
	





```
ee
```
 beginnt. Aber das wäre wie bereits gesagt m.M. der zweite Schritt.


----------



## keeplaughing (12. Jul 2011)

ah gut, das mit dem GenoType [] hab ich jetzt auch verstanden

oh man ich bin doch noch viel mehr blutiger anfänger als ich befürchtet hab xD

also ich dachte mir, dass man anstelle der beiden kleinen buchstaben z.B. "aa" einfach " " setzen kann, dann fällt das ja schonmal raus und ist in der Codesequenz dann schon gar nicht mehr enthalten und würde das ganze noch ein wenig vereinfachen


----------

