javafx erste application

Diskutiere javafx erste application im AWT, Swing, JavaFX & SWT Bereich.
R

Robert8

Hallo zusammen,

Ich wollte wissen, ob es möglich ist eine dynamische Erstellung von Buttons zu programmieren, dessen Anzahl abhängig von den Anzahl Einträge innerhalb einer Ordnerdatei ist, welche variieren kann.

Beispiel: Dateiordner "BTNvsBB" hat 95 Elemente=> ich möchte 95 Buttons, welcher je für ein Element steht; Dateiordner "BTNvsCO" hat 80 Elemente=> ich möchte 80 Buttons, welcher je für ein Element steht.

Ausserdem wollte ich wissen, ob es möglich ist die Buttons zu sortieren. Sprich "BTNvsCO" hat 80 Element ohne Selektion=> aber mit Suchkritierum zb. nur Elemente die den Buchstaben A beinhalten => zb. 50 Elemente => und wiederum nur die 50 Elemente werden angezeigt?Ist es also möglich über ein Suchfeld mit Kriterien die Anzahl Buttons zu verändern?

Wie ihr bemerkt, bin ich ein Beginner. Bin dankbar für jede Hilfe.

Freundliche Grüsse
 
L

lam_tr

Hallo zusammen,

Ich wollte wissen, ob es möglich ist eine dynamische Erstellung von Buttons zu programmieren, dessen Anzahl abhängig von den Anzahl Einträge innerhalb einer Ordnerdatei ist, welche variieren kann.

Beispiel: Dateiordner "BTNvsBB" hat 95 Elemente=> ich möchte 95 Buttons, welcher je für ein Element steht; Dateiordner "BTNvsCO" hat 80 Elemente=> ich möchte 80 Buttons, welcher je für ein Element steht.

Ausserdem wollte ich wissen, ob es möglich ist die Buttons zu sortieren. Sprich "BTNvsCO" hat 80 Element ohne Selektion=> aber mit Suchkritierum zb. nur Elemente die den Buchstaben A beinhalten => zb. 50 Elemente => und wiederum nur die 50 Elemente werden angezeigt?Ist es also möglich über ein Suchfeld mit Kriterien die Anzahl Buttons zu verändern?

Wie ihr bemerkt, bin ich ein Beginner. Bin dankbar für jede Hilfe.

Freundliche Grüsse
Es spricht an sich nichts dagegen.

Für das Beispiel 1: Ich denke so in etwa könnte es klappen
Code:
Vbox vbox = new Vbox(5d);

File folder = new File("c:\\");
for(File file : folder.listFiles()){
    vbox.getChildren(new Button(file.getName()));
}
Für die Sortierung hast du die Liste der Kinder vbox.getChildren(), die kannst du dann über https://stackoverflow.com/questions/2477261/how-to-sort-a-collectiont sortieren. Ich denke besser ist es davor die Dateien zu sortieren bevor du die Buttons erstellst.

Wenn du nur gezielte Elemente erstellen willst, dann überprüfe doch davor nach den Namen der Datei oder Verzeichnis oder Element.
 
T

temi

Warum steckst du deine Einträge nicht einfach in ein ListView und das "Klicken" entspräche dann der Auswahl einer Zeile?
 
R

Robert8

Warum steckst du deine Einträge nicht einfach in ein ListView und das "Klicken" entspräche dann der Auswahl einer Zeile?
Danke für deinen Beitrag. Ich kenne mich noch nicht mit JavaFX aus. Bin zur Zeit an den Grundlagen und hol mir hier Denkanstösse ab. Vielen Dank dafür.
Ich habe auch an eine ListView gedacht. In meinem Grundlagenkurs stand, dass ich für Datenstrukturen, deren Reihenfolge egal ist und Objekte nicht doppelt vorkommen auch eine Setstruktur nehmen könnte. Aber eine Liste tuts wohl auch.

Was mir auch noch Probleme bereitet, ist die Sortierfunktion. Ich möchte ein Suchfeld erstellen, welche mir die Listen sortieren kann und dies nicht alphabetisch, sondern nach anderen Suchkriterien. als Beispiel hier ein Pokerspiel die ersten drei Karten "Flopstruktur".

Beispielelemente:

zb. ich habe die Elemente
8d2h7h
Ah4c5d
KdAc2d
Qd4h4s
7c5h2h
Jd4cKh
7d7h2c
Ac2c8c
QdQh2c

Sortierfunktion:
1) Alle Flopstrukturen nach einer Karte A => Ah4c5d, KdAc2d, Ac2c8c
2) alle Flopstrukturen höchste Karte K => Jd4cKh
3) alle Flopstrukturen höchste Karte 8 => 8d2h7h
4) alle Flopstrukturen 2karten gleich=> 7d7h2c, QdQh2c
5) alle Flopstrukturen gleiche leihe => Ac2c8c
6) alle Flopstrukturen mit 2 hertzkarten=7c5h2h

=> Ich möchte also ein Suchfeld programmieren )> welches mir zbi 2) bei "K" Tastatureingabe: nur Flops mit höchster Karte "K", falls ich "Q" eingebe nur Flops mit höchster Karte "Q" in den listen angibt.

von der Logik her würde ich FLopstrukur "Flops mit höchster Karte K"=> übersetzen als " if K in flopstruktur x AND not A in flopstrukur x then show..."

=> dh die Sortierlogik ist mir bewusst, aber ich weiss nicht genau, wie ich sie implementieren kann in java. da eine Flopstruktur einerseits mit int (2-9) andersets als char(J-A) und zusätzlich noch die Leihen der einzelnen Karten als char"d=diamond, c=club, h=heart, spade=s" beinhaltet. Kann ich die Flopstrukturen, welche als string gespeichert sind nach einzelen Char, int selektieren?

ein BSP

1595524492744.png

Vielen Dank für Eure Inputs
 
Zuletzt bearbeitet:
mrBrown

mrBrown

Anmerkung am Rande: du scheinst Filtern und Sortieren zu verwechseln. Sortieren ist nur, die Dinge in irgendeine feste Reihenfolge zu bringen, deine Beispiele und Erklärungen zielen aber alle auf das herausfiltern bestimmter Elemente ab.


da eine Flopstruktur einerseits mit int (2-9) andersets als char(J-A) und zusätzlich noch die Leihen der einzelnen Karten als char"d=diamond, c=club, h=heart, spade=s" beinhaltet. Kann ich die Flopstrukturen, welche als string gespeichert sind nach einzelen Char, int selektieren?
Um das ganze schon mal etwas einfacher zu machen: auch '2' - '9' sind chars (eben das Zeichen '2' statt der Zahl Zwei), du kannst also alle gleich behandeln.

Für dein Problem ist es aber sinnvoller, Karten auch wirklich als Karten zu modellieren, die jeweils aus Farbe und Symbol bestehen, und mehrere von diesen nicht als String, sondern in einer sinnvollen Datenstruktur zusammenzufassen.


Für die Umsetzung der Filter-Funktionen bietet sich an, diese auch in entsprechenden Klassen umzusetzen. Ein "Filter" bekommt dann jeweils ein Blatt(?) und prüft, ob der Filter erfüllt ist, für den Anfang bieten sich einfache Dinge wie zB "Enthält bestimmten Wert" an, die sind relativ einfach umzusetzen – für jemanden, der keinerlei Erfahrung hat und erst seit einer Woche Java lernt, ist das relativ ambitioniert, allerdings durchaus auch recht interessant.


EDIT: du kannst das auch alles auf String-Ebene und mit riesigen if-else-Kaskaden umsetzen, dabei bleibt allerdings der Lerneffekt auf der Strecke und es wird alles andere als eine schöne, saubere Lösung.
 
R

Robert8

Anmerkung am Rande: du scheinst Filtern und Sortieren zu verwechseln. Sortieren ist nur, die Dinge in irgendeine feste Reihenfolge zu bringen, deine Beispiele und Erklärungen zielen aber alle auf das herausfiltern bestimmter Elemente ab.
Ja ich hab mich falsch ausgedrückt. Ich möchte eigentlich die Flopstrukturen, welche ich vorher anlege nur filtern.

Um das ganze schon mal etwas einfacher zu machen: auch '2' - '9' sind chars (eben das Zeichen '2' statt der Zahl Zwei), du kannst also alle gleich behandeln.

Für dein Problem ist es aber sinnvoller, Karten auch wirklich als Karten zu modellieren, die jeweils aus Farbe und Symbol bestehen, und mehrere von diesen nicht als String, sondern in einer sinnvollen Datenstruktur zusammenzufassen.


Für die Umsetzung der Filter-Funktionen bietet sich an, diese auch in entsprechenden Klassen umzusetzen. Ein "Filter" bekommt dann jeweils ein Blatt(?) und prüft, ob der Filter erfüllt ist, für den Anfang bieten sich einfache Dinge wie zB "Enthält bestimmten Wert" an, die sind relativ einfach umzusetzen – für jemanden, der keinerlei Erfahrung hat und erst seit einer Woche Java lernt, ist das relativ ambitioniert, allerdings durchaus auch recht interessant.




EDIT: du kannst das auch alles auf String-Ebene und mit riesigen if-else-Kaskaden umsetzen, dabei bleibt allerdings der Lerneffekt auf der Strecke und es wird alles andere als eine schöne, saubere Lösung.
[/QUOTE]
 
R

Robert8

Sorry irgendwas mit dem Post ging schief..

Ich habe die Flopstrukturen nun als Klasse definiert mittels einzelner Char :

1595761271806.png



Danach habe ich einige Flopstruktur OBjekte erstellt.

1595761310656.png



Ich bin mir nun nicht sicher in welche Datenstruktur ich die Flopstrukturen ablegen möchte. Ich werde ca 10 listen machen mit 95 bis 1755 Flopstrukturen. Hauptkritierium wäre das schnelle Filtern von der jeweiligen Struktur. ich haben an ein Hashset oder an eine ArrayList gedacht.
Was wäre wohl am sinnvollsten?


Ausserdem wäre ich dankbar, falls mir jemand ein Feedback zu meiner ersten Filterfunktion geben könnte. mir ist immer noch unklar, wie ich das alles in einem Suchfeld definieren kann. Eigentlich möchte ich etwas ähnliches wie die automatische Vervollständigung. Also Tastatureingabe "K" in einem Suchfeld => zeig alle Flopstrukturen der Datenstruktur xy, bei welcher K die höchste Karte ist
1595762318872.png

1595761701649.png


Also wäre jetzt der Ansatz für jede Filterfunktion, welche ich dann später im SuchFeld xy benötige, eine Filterfunktion in der Klasse Flopstrukturen zu definieren?

public static void k_hoch(List<Flopstruktur>){} ; oder was wäre hier überbage parameter?



Btw: wie kann ich sysout besser darstellen, dass Pro Flopstruktur eine Line?

Vielen Dank für eure Hilfe <3
 
mrBrown

mrBrown

Ich habe die Flopstrukturen nun als Klasse definiert mittels einzelner Char :
Stell dir vor, jemand spielt kein Poker, und du sollst es ihm erklären:

Erklärst du das mit "Auf dem Tisch liegt eine Flopstruktur und das sind 6 Zeichen" oder doch eher anders? :) (Davon hängt dann der ganze Rest ab, deshalb geh ich da nur kurz drauf ein)

Ich bin mir nun nicht sicher in welche Datenstruktur ich die Flopstrukturen ablegen möchte. Ich werde ca 10 listen machen mit 95 bis 1755 Flopstrukturen. Hauptkritierium wäre das schnelle Filtern von der jeweiligen Struktur. ich haben an ein Hashset oder an eine ArrayList gedacht.
Was wäre wohl am sinnvollsten?
Prinzipiell geht beides, theoretisch ist es vermutlich am sinnvollsten, einen eigenen Wrapper zu schreiben, damit du nicht direkt mit List/Set arbeiten musst.

Ausserdem wäre ich dankbar, falls mir jemand ein Feedback zu meiner ersten Filterfunktion geben könnte.
[...]
Also wäre jetzt der Ansatz für jede Filterfunktion, welche ich dann später im SuchFeld xy benötige, eine Filterfunktion in der Klasse Flopstrukturen zu definieren?

public static void k_hoch(List<Flopstruktur>){} ; oder was wäre hier überbage parameter?
Mit dem Ansatz wirst du nicht weit kommen, du müsstest allein 13 solcher Funktionen schreiben, nur um nach der höchsten Karte zu filtern – du bräuchtest also mindestens den gesuchten Wert (also in dem Fall 'K') als Parameter, dann würde das gesamte if so aber schon nicht mehr klappen.

Du müsstest also einen anderen Weg finden (dazu mehr, wenn das erste beantwortet ist :) )


BTW: Code bitte als Text, nicht als Screenshot :)
 
J

JustNobody

Also Code bitte nicht als Bild sondern in Code-Tags posten. (Oberhalb des Eingabefeldes das Dropdown mit den drei Punkten und dann Code)

Und was genau besagt dieses c1, c2, c3, s1, s2, s3? Sind das stehende Begriffe als solches in der Problemdomäne? Wenn nicht: sinnvolle Namen verwenden!

Was für Werte können die annehmen? Sind da generell alle char Werte möglich oder ist das ein eng begrenzter Bereich? Dann wäre da als Datentyp z.B. eine Enum besser.

Und was das filtern angeht: Da wäre ggf. ein Filtern über ein Stream denkbar. Den Check selbst würde ich in eine Methode auslagern. isWhatever() (also sinnvoll benannt) und dann könnte man dass in einem stream mit .filter (f -> f.isWhatever()) verwenden ....
 
J

JustNobody

Stell dir vor, jemand spielt kein Poker, und du sollst es ihm erklären:
Ok, also trifft es https://donkpedia.org/wiki/Flopstruktur - das hatte ich gefunden weil mir das als solches nichts sagte ... aber war mir nicht sicher ... Mir geisterte auch Flip/Flop und so im Kopf herum und war am grübeln, ob es Flopstrukturen oder so gab (evtl. mit einem anderen Namen ... wer weiss, wer das was wie verändert hat als Name :) )
 
R

Robert8

Stell dir vor, jemand spielt kein Poker, und du sollst es ihm erklären:

Erklärst du das mit "Auf dem Tisch liegt eine Flopstruktur und das sind 6 Zeichen" oder doch eher anders? :) (Davon hängt dann der ganze Rest ab, deshalb geh ich da nur kurz drauf ein)
Ein Flop besteht aus 3 Karten, die jeweils eine Leihe haben:

c = Card = Karte "2-9, T,J,Q,K,A" => Werte die sie einnehmen können
s =suite= Leihe "c=club, d=diamond,h=heart, s=spade" =>Werte die sie einnehmen können

C1: erste Karten S1: Leihe der ersten Karte

ein FLOP struktur setzt sich deshalb zusammen aus "c1s1, c2s2,c3s3"


Mit dem Ansatz wirst du nicht weit kommen, du müsstest allein 13 solcher Funktionen schreiben, nur um nach der höchsten Karte zu filtern – du bräuchtest also mindestens den gesuchten Wert (also in dem Fall 'K') als Parameter, dann würde das gesamte if so aber schon nicht mehr klappen.

Du müsstest also einen anderen Weg finden (dazu mehr, wenn das erste beantwortet ist :) )
Ja ich bräuchte vieler dieser Funktionen, um die höchste Karte zu definieren und müsste natürlich das if danach anpassen. zb q hoch dann wiederum Karten auf Q suchen und ungleich K,A etc.=> extrem aufwendig admit.

Was für einen Weg würdest du einschlagen? eine Flopdefinition über string gäbe wahrscheinlich weniger probleme beim filtern?🤒
 
J

JustNobody

Also machen c und s keinen Sinn. Benenne die Variablen entsprechend.
Und wenn das ein Flop ist: Warum heißt die Klasse Flopstruktur? Es ist ein Flop und damit sollte die Klasse so heißen.
Ein Flop hat drei Karten. Warum ist da dann nicht
Code:
private Card card1;
private Card card2;
private Card card3;
definiert?

Und Card kann dann sowas wie value (?? card bezeichnet die Karte selbst ... trifft da die Bezeichnung Wert zu? Oder gibt es da einen anderen Begriff?) und suite haben.

Und das sind dann keine char Werte sondern natürlich Enums, denn Du hast z.B. club, diamond, heart und spade. Nutz das entsprechend im Code und keine solchen Abkürzungen.

Visualisierungen kannst Du immer noch so machen. Es spricht nichts dagegen, in der enum auch entsprechende Werte zu definieren. Falls notwendig kannst Du dann tatsächlich so tolle Ausgaben machen wie "Ac" oder so. Aber im Code halte ich das für unleserlich. (Und wenn, dann wären diese Literale an einer Stelle als Konstanten definiert und im Code wäre dann die Konstante. Also sowas wie
public static final String CARD_ACE = "A";
if (someCard == CARD_ACE) doSomething();
Aber meiner Meinung nach gehört dies in eine Enum. Aber man kann hier beim Design gerne eine andere Meinung vertreten...
 
mrBrown

mrBrown

Ein Flop besteht aus 3 Karten, die jeweils eine Leihe haben:

c = Card = Karte "2-9, T,J,Q,K,A" => Werte die sie einnehmen können
s =suite= Leihe "c=club, d=diamond,h=heart, s=spade" =>Werte die sie einnehmen können

C1: erste Karten S1: Leihe der ersten Karte

ein FLOP struktur setzt sich deshalb zusammen aus "c1s1, c2s2,c3s3"
Einfachster Ansatz um sowas zu modellieren: In Textform erklären und alle Nomen (in diesem Fall fett) markieren.

Aus jedem Nomen dann eine Klasse machen, also: Flop, Karte, Leihe, Wert:
Java:
class Flop {}
class Karte {}
class Leihe {}
class Wert {} //nennst du oben auch Karte, da Karte auch schon was anderes meint einfach mal Wert genannt
Dann alle Beziehungen raussuchen (in diesem Fall unterstrichen), und in den Klassen eintragen:

Java:
class Flop {
  Karte erste;
  Karte zweite;
  Karte dritte;
}
class Karte {
  Wert wert;
  Leihe leihe;
}
class Leihe {}
class Wert {}

Und dann noch die Klassen, die nur eine feste Menge an Werten annehmen können (hier kursiv), als Enum modellieren:

Java:
class Flop {
  Karte erste;
  Karte zweite;
  Karte dritte;
}
class Karte {
  Wert wert;
  Leihe leihe;
}
class Leihe {CLUB,DIAMOND,HEART, SPADE}
class Wert {ONE, TWO, ..., KING, ACE}
Schon ist das ganz wunderbar modelliert und es lässt sich problemlos damit arbeiten: :)

Java:
new Flop(new Karte(KING, CLUB), new Karte(TWO, HEART), new Karte(ACE, DIAMOND));
Wenn nötig kannst du dir dann auch noch einfache Funktionen schreiben, die einen String "kc2had" bekommen und dann ein Flop-Objekt zurückgeben bzw ein Flop-Objekt entsprechend ausgeben.



Was für einen Weg würdest du einschlagen?
Karten lassen sich doch sortieren – wenn es dir um die höchste geht, musst du zB einfach nur das Maximum der drei Karten suchen, und die Karte kannst du dann vergleichen mit deinem gesuchten.

Ein Filter kann dabei zb so aussehen:

Java:
class HighestCardFilter {
  /** Der gesuchte höchste Wert */
  Wert wert; 
  HighestCardFilter(Wert wert) {
    this.wert = wert;
  }

  boolean matches(Flop flop) {
    Wert highest = //höchste Karte des Flops finden, siehe zb Comparator & Comparable
    return highest == wert;
  }

}
Java:
HighestCardFilter filter = new HighestCardFilter(KING)
Flop flop = new Flop(new Karte(KING, CLUB), new Karte(TWO, HEART), new Karte(ACE, DIAMOND));
if (filter.matches(flop)) {
  System.out.println(flop);
}
 
Thema: 

javafx erste application

Passende Stellenanzeigen aus deiner Region:
Anzeige

Neue Themen

Anzeige

Anzeige
Oben