ArrayList mit eigenen Objekten in JavaFX sortieren und ausgeben

Encera

Aktives Mitglied
Hallo zusammen,
ich versuche ein kleines Programm zu erstellen, bei welchem ich Personen-Objekte einer ArrayList hinzufüge. Das qanze Funktioniert über Ein TextField, in welchem man den Namen der Person einfügen soll. Aus diesem Namen wiederum erfolgt dann die Erstellung des Objekts und dieses wird dann eben der ArrayList übergeben und in einer neuen Stage über ein Label ausgegeben.
Allerdings möchte ich die Liste gerne Alphabetisch sortieren lassen bevor sie ausgegeben wird. Ich habe versucht das ganze mittels des "Comaparable" Interfaces umzusetzen allerdings erfolgt die Ausgabe unsortiert nach Reihenfolge des hinzufügens. Villeicht könnt ihr mir ja weiterhelfen :)

Java:
[/B]
public class MREAddingPeople extends Application {

    
    
    @Override
    public void start(Stage primaryStage) throws Exception {

        //Stage2
            GridPane root2 = new GridPane();
            Label ranking = new Label();
            root2.add(ranking, 1, 1);
            Scene scene2 = new Scene(root2, 800, 700);
            Stage stage2 = new Stage();
            stage2.setScene(scene2);
            
            
        //Stage1
                GridPane root = new GridPane();
                TextField nameField = new TextField("Name");
                Button save = new Button("Save");
                root.add(nameField, 1, 1);
                root.add(save, 1, 2);
                Scene scene = new Scene(root, 800, 700);
                primaryStage.setScene(scene);
                primaryStage.show();
                

        //-----------------------------------------------------------------------
        class Participant implements Comparable {
            String name;
            
            public Participant(String name) {
                
                this.name = name;
                }

            @Override
            public int compareTo(Object o) {
                
                return name.compareTo(name);
            }    
        }
        //------------------------------------------------------------------------
        ArrayList<Participant> participantList = new ArrayList();
        
        //------------------------------------------------------------------------
        
        
        EventHandler<MouseEvent> saveClicked = new EventHandler<MouseEvent>() { //Click on save-Button and creation of new Person(Participant)
            //Teilnehmer = Participant

            @Override
            public void handle(MouseEvent event) {
                    Participant teilnehmer = new Participant(nameField.getText());
                        participantList.add(teilnehmer);
                        Collections.sort(participantList);
                        
                    
                    //Label LabelX = new Label();
                    for(int i = 0; i < participantList.size(); i++) {
                        Text label = new Text();
                        label.setText(participantList.get(i).name);
                        root2.add(label, 2, i);
                    }
                    
                    //root2.add(LabelX, 1, 1);
                    stage2.show();
                    

                }

            
        };
        
        
        save.addEventHandler(MouseEvent.MOUSE_CLICKED, saveClicked);      
    }


    public static void main(String[] args) {
        launch(args);       

    }    
}

[B]

PS: Es scheint auch so als würde bei der Ausgabe selbst etwas nicht ganz zu stimmen da die alten Objekte wohl immer wieder überschrieben werden (sieht zumindest so aus). Villeicht hat da auch wer ne Idee :)
 

Anhänge

  • Name.PNG
    Name.PNG
    2 KB · Aufrufe: 1
  • Ausgabe.PNG
    Ausgabe.PNG
    7,8 KB · Aufrufe: 2

Robert Zenz

Top Contributor
Java:
return name.compareTo(name);

Oder anders ausgedrueckt:

Java:
return this.name.compareTo(this.name);

Du solltest natuerlich gegen den Namen des anderen Objekts vergleichen.
 

Encera

Aktives Mitglied

Jw456

Top Contributor
Java:
            @Override
            public int compareTo(Object o) {
               
                return this.name.compareTo(o);
               
                // ob hier überhaupt der aufruf von sich selbst das richtige ist
                // du willst zwei Strings vergleichen
               
               
               
            }
 
Y

yfons123

Gast
Java:
public class MREAddingPeople extends Application {

    
    
    @Override
    public void start(Stage primaryStage) throws Exception {

        //Stage2
            GridPane root2 = new GridPane();
            Label ranking = new Label();
            root2.add(ranking, 1, 1);
            Scene scene2 = new Scene(root2, 800, 700);
            Stage stage2 = new Stage();
            stage2.setScene(scene2);
            
            
        //Stage1
                GridPane root = new GridPane();
                TextField nameField = new TextField("Name");
                Button save = new Button("Save");
                root.add(nameField, 1, 1);
                root.add(save, 1, 2);
                Scene scene = new Scene(root, 800, 700);
                primaryStage.setScene(scene);
                primaryStage.show();
                

        //-----------------------------------------------------------------------
        // diese klasse befindet sich in der start methode ? warum das überhaupt geht frag ich mich schon..
        class Participant implements Comparable {
            String name;
            
            public Participant(String name) {
                
                this.name = name;
                }

            @Override
            public int compareTo(Object o) {
                
                return name.compareTo((Participant)o.name);
            }   
        }
        //------------------------------------------------------------------------
        //diese arraylist befindet sich in start ??? why??
        ArrayList<Participant> participantList = new ArrayList();
        
        //------------------------------------------------------------------------
        
        
        EventHandler<MouseEvent> saveClicked = new EventHandler<MouseEvent>() { //Click on save-Button and creation of new Person(Participant)
            //Teilnehmer = Participant

            @Override
            public void handle(MouseEvent event) {
                    Participant teilnehmer = new Participant(nameField.getText());
                        participantList.add(teilnehmer);
                        Collections.sort(participantList);
                        
                    
                    //Label LabelX = new Label();
                    for(int i = 0; i < participantList.size(); i++) {
                    // klar.. nen ein "Text" label, wenn es Label als klasse gibt
                        Text label = new Text();
                        label.setText(participantList.get(i).name);
                        root2.add(label, 2, i);
                    }
                    // hier mal ein sysout einfügen obs intern überhaupt sortiert ist
                    // vllt liegts auch an dem i zugriff
                    System.out.println(participantList);
                    
                    //root2.add(LabelX, 1, 1);
                    stage2.show();
                    

                }

            
        };
        
        
        save.addEventHandler(MouseEvent.MOUSE_CLICKED, saveClicked);     
    }


    public static void main(String[] args) {
        launch(args);       

    }   
}
 

Jw456

Top Contributor
Java:
public class MREAddingPeople extends Application {

   
   
    @Override
    public void start(Stage primaryStage) throws Exception {

        //Stage2
            GridPane root2 = new GridPane();
            Label ranking = new Label();
            root2.add(ranking, 1, 1);
            Scene scene2 = new Scene(root2, 800, 700);
            Stage stage2 = new Stage();
            stage2.setScene(scene2);
           
           
        //Stage1
                GridPane root = new GridPane();
                TextField nameField = new TextField("Name");
                Button save = new Button("Save");
                root.add(nameField, 1, 1);
                root.add(save, 1, 2);
                Scene scene = new Scene(root, 800, 700);
                primaryStage.setScene(scene);
                primaryStage.show();
               

        //-----------------------------------------------------------------------
        // diese klasse befindet sich in der start methode ? warum das überhaupt geht frag ich mich schon..
        class Participant implements Comparable {
            String name;
           
            public Participant(String name) {
               
                this.name = name;
                }

            @Override
            public int compareTo(Object o) {
               
                return name.compareTo((Participant)o.name);
            }  
        }
        //------------------------------------------------------------------------
        //diese arraylist befindet sich in start ??? why??
        ArrayList<Participant> participantList = new ArrayList();
       
        //------------------------------------------------------------------------
       
       
        EventHandler<MouseEvent> saveClicked = new EventHandler<MouseEvent>() { //Click on save-Button and creation of new Person(Participant)
            //Teilnehmer = Participant

            @Override
            public void handle(MouseEvent event) {
                    Participant teilnehmer = new Participant(nameField.getText());
                        participantList.add(teilnehmer);
                        Collections.sort(participantList);
                       
                   
                    //Label LabelX = new Label();
                    for(int i = 0; i < participantList.size(); i++) {
                    // klar.. nen ein "Text" label, wenn es Label als klasse gibt
                        Text label = new Text();
                        label.setText(participantList.get(i).name);
                        root2.add(label, 2, i);
                    }
                    // hier mal ein sysout einfügen obs intern überhaupt sortiert ist
                    // vllt liegts auch an dem i zugriff
                    System.out.println(participantList);
                   
                    //root2.add(LabelX, 1, 1);
                    stage2.show();
                   

                }

           
        };
       
       
        save.addEventHandler(MouseEvent.MOUSE_CLICKED, saveClicked);    
    }


    public static void main(String[] args) {
        launch(args);      

    }  
}
das ist doch ok so er setzt den Listener und übergibt die Methode.
 
Y

yfons123

Gast
Java:
                        Collections.sort(participantList);
                      
                  
                    //Label LabelX = new Label();
                    for(int i = 0; i < participantList.size(); i++) {
                    // klar.. nen ein "Text" label, wenn es Label als klasse gibt
                        Text label = new Text();
                        label.setText(participantList.get(i).name);
                        root2.add(label, 2, i);
                    }
                    // hier mal ein sysout einfügen obs intern überhaupt sortiert ist
                    // vllt liegts auch an dem i zugriff
                    System.out.println(participantList);
 

Encera

Aktives Mitglied
[CODE lang="java" title="Update 1"]public class MREAddingPeople2 extends Application {



@Override
public void start(Stage primaryStage) throws Exception {

//Stage2
GridPane root2 = new GridPane();
Label ranking = new Label();
root2.add(ranking, 1, 1);
Scene scene2 = new Scene(root2, 800, 700);
Stage stage2 = new Stage();
stage2.setScene(scene2);


//Stage1
GridPane root = new GridPane();
TextField nameField = new TextField("Name");
Button save = new Button("Save");
root.add(nameField, 1, 1);
root.add(save, 1, 2);
Scene scene = new Scene(root, 800, 700);
primaryStage.setScene(scene);
primaryStage.show();


//-----------------------------------------------------------------------
class Participant implements Comparable<Participant> {
String name;

public Participant(String name) {

this.name = name;
}
//Diese Methode war falsch implementiert hab das jetzt mal behoben
@Override
public int compareTo(Participant o) {
return this.name.compareTo(o.name);

}


}
//------------------------------------------------------------------------
ArrayList<Participant> participantList = new ArrayList();
//Collections.sort(participantList);

//------------------------------------------------------------------------


EventHandler<MouseEvent> saveClicked = new EventHandler<MouseEvent>() { //Click on save-Button and creation of new Person(Participant)
//Teilnehmer = Participant

@Override
public void handle(MouseEvent event) {
Participant teilnehmer = new Participant(nameField.getText());
participantList.add(teilnehmer);
Collections.sort(participantList);




//Label LabelX = new Label();
for(int i = 0; i < participantList.size(); i++) {
//Ja stimmt ist verwirrend geschrieben das leigt daran weil es zuerst ein Label war und ich das ausgetauscht habe
Text label = new Text();
label.setText(participantList.get(i).name);
root2.add(label, 2, i);
}
//Intern sortiert es auch nicht, die Ausgabe ist weiterhin die Reihenfolge der Eingabe
for (Participant participant : participantList) {
System.out.println(participant.name);
}
//root2.add(LabelX, 1, 1);
stage2.show();


}


};


save.addEventHandler(MouseEvent.MOUSE_CLICKED, saveClicked);



}


public static void main(String[] args) {
launch(args);


}
}
[/CODE]
Erstmal vielen Dank für eure Hilfe, das freut mich echt wahnsinnig weil ich bin grad ein bisschen am verzweifeln...
So also ich hab mal einige Kommentare eingefügt. Kurzgesagt die compare-Methode war falsch implementiert, bin meine Lernunterlagen nochmals durchgegangen und habe das ausgebessert. Das Sortieren funktioniert nun, sowohl in der Ausgabe als auch intern über sysout xD
Allerdings gibt es jetzt noch ein kleines Problem und zwar überschreibt die neue Ausgabe die alte und ersetzt sie nicht... Ich poste dazu gleich ein Bild.
Als erstes habe ich "Hannes" hinzugefügt und als zweites "Aaron". Ich hoffe ihr seht was ich mit "überschreiben" meine.
Überschreiben1.PNG

Überschreiben2.PNG

Edit:
@Jw456 hab die compare-Methode so abgeändert wie dus gepostet hast, so stehts auch in meinen Unterlagen drinnen
@yfons123 Puh okay, keine Ahnung ich bin froh dasses trotzdem klappt. Ich weiß mein Stil ist noch sehr schlampig aber ich bin auch noch anfänger, werd mir aber in Zukunft mühe geben das er besser wird.
 
Zuletzt bearbeitet:

Jw456

Top Contributor
Java:
@Override
                    public int compareTo(Participant o) {
                        return this.name.compareTo(o.name);
                        
                    }
würde ich sagen
 

Jw456

Top Contributor
Ich finde es auch nicht richtig das die Klasse Participant innerhalb der Methode „start“ ist.

Entweder eine echte innere Klasse oder eine eigene separate klasse so wie in dem Link von mir auch. Eine innere Klasse gehört in den Klassenrumpf der entern Klasse, nicht in eine Methode
 
Zuletzt bearbeitet:
Y

yfons123

Gast
es ist halt relativ witzlos die ganze sache

du machst das kommentar
//---------------------------------
um einen abgegrenzten bereich zu kennzeichnen
und ein kommentar dazu was es tut...

witzigerweise gibts da was javva internes das nennt sich "methoden"
und um noch lustiger zu werden kann man deine abgegrenzten bereiche nehmen, die beschreibung auf englisch übersetzen und das wars ... puff keine kommentare mehr, alles in methoden und funktioniert trotzdem
 

Encera

Aktives Mitglied
Ich finde es auch nicht richtig das die Klasse Participant innerhalb der Methode „start“ ist.

Entweder eine echte innere Klasse oder eine eigene separate klasse so wie in dem Link von mir auch. Eine innere Kasse gehört in den Klassenrumpf der entern Klasse, nicht in eine Methode
Danke für den Tipp und den Beitrag, werd ich mir durchlesen👍
Hast du vll noch eine Idee wieso die Ausgabe ständig überschrieben wird und nicht ersetzt?
@yfons123 ja wie gesagt das ist jetz das erste Projekt das ich mache außerhalb meines Kurses da denk ich isses nicht soo ungewöhnlich das der Stil noch nicht so perfekt ist. Werd versuchen das in den nächsten Projekten zu ändern
 
Zuletzt bearbeitet:

Jw456

Top Contributor
Java:
public class MREAddingPeople2 extends Application {
 
    @Override
    public void start(Stage primaryStage) throws Exception {

        //Stage2
            GridPane root2 = new GridPane();
            Label ranking = new Label();
            root2.add(ranking, 1, 1);
            Scene scene2 = new Scene(root2, 800, 700);
            Stage stage2 = new Stage();
            stage2.setScene(scene2);
   
   
        //Stage1
                GridPane root = new GridPane();
                TextField nameField = new TextField("Name");
                Button save = new Button("Save");
                root.add(nameField, 1, 1);
                root.add(save, 1, 2);
                Scene scene = new Scene(root, 800, 700);
                primaryStage.setScene(scene);
                primaryStage.show();
             
        ArrayList<Participant> participantList = new ArrayList();
        //Collections.sort(participantList);
 
       
        EventHandler<MouseEvent> saveClicked = new EventHandler<MouseEvent>() { //Click on save-Button and creation of new Person(Participant)
            //Teilnehmer = Participant

            @Override
            public void handle(MouseEvent event) {
                    Participant teilnehmer = new Participant(nameField.getText());
                        participantList.add(teilnehmer);
                        Collections.sort(participantList);
               
                             
           
                    //Label LabelX = new Label();
                    for(int i = 0; i < participantList.size(); i++) {
    //Ja stimmt ist verwirrend geschrieben das leigt daran weil es zuerst ein Label war und ich das ausgetauscht habe
                        Text label = new Text();
                        label.setText(participantList.get(i).name);
                        root2.add(label, 2, i);
                    }
    //Intern sortiert es auch nicht, die Ausgabe ist weiterhin die Reihenfolge der Eingabe
                    for (Participant participant : participantList) {
                        System.out.println(participant.name);
                    }
                    //root2.add(LabelX, 1, 1);
                    stage2.show();
           
                }
   
        };
 
        save.addEventHandler(MouseEvent.MOUSE_CLICKED, saveClicked);
 
    }
   

    public static void main(String[] args) {
        launch(args);
 

    }
   
   
   
    class Participant implements Comparable<Participant> {
                    String name;
           
                    public Participant(String name) {
               
                        this.name = name;
                        }
                    //Diese Methode war falsch implementiert hab das jetzt mal behoben
                    @Override
                    public int compareTo(Participant o) {
                      return  this.name.compareTo(o.name);
                   
                    }  // ende inner Klass

         
      }  // ende Klasse MREAddingPeople2
       
       
   
   
}

packe die Klasse an das Ende der äußeren Klasse das wäre eine Innere Klasse vor der schließenden Klammer von der äußeren Klasse
 
Y

yfons123

Gast
root2.add(label, 2, i);

wahrscheinlich liegts daran
aber ich würde den Fehler nicht suchen sondern prinzipiell anders ansetzen

du willst soe untereinander dh vbox hernehmen, die an ordnung der anderen Elemente kannst du ja in der gridpane machen
 

Jw456

Top Contributor
Einen Tipp hätte ich noch. Benutze für das festlegen nach welchem member sortiert werden soll einen getter der public ist in der inneren Klasse. Also einen getter auf deinen String. Also kein direkter zugriff auf die Varaiabe.
 

Encera

Aktives Mitglied
root2.add(label, 2, i);

wahrscheinlich liegts daran
aber ich würde den Fehler nicht suchen sondern prinzipiell anders ansetzen

du willst soe untereinander dh vbox hernehmen, die an ordnung der anderen Elemente kannst du ja in der gridpane machen
Hab ich gemacht, danke jetzt wird nichts mehr überschrieben. Allerdings stimmt die Ausgabe immernochnicht zu 100% weil die alten Eingaben bestehen bleiben.
Ausgabe.PNG
Seht ihr was ich meine? Sorry wenn ich euch nerve aber bin selbst auch schon gefrustet weils einfach nicht zu 100% passen will...

Java:
    @Override
            public void handle(MouseEvent event) {
                    Participant teilnehmer = new Participant(nameField.getText());
                        participantList.add(teilnehmer);
                        Collections.sort(participantList);
                       
                    for(int i = 0; i < participantList.size(); i++) {
   
                        Text label1 = new Text();
                        label1.setText(participantList.get(i).name);
                        root2.getChildren().add(label1);
                    }
   
                    for (Participant participant : participantList) {
                        System.out.println(participant.name);
                    }
                   
                    stage2.show();  
                }  
        };

Bin mir ziemich sicher das es daran liegt das ständig ein neuer Text (mit dem Namen Label ;) ) erstellt wird und sich somit das ganze stapelt. Pack ich das ganze jedoch außerhalb der Schleife klappts auch nicht viel besser.

@Jw456 wieso genau? meinst du quasi weil es aus Sicherheitsgründen so Konvention ist oder?
 
Y

yfons123

Gast
ja natürlich bleiben die alten werte drin

löscht du denn die labels die vorher hinzugefügt werden ? nö tust du nicht
llöscht du die einträge in der array list die du vorher hinzugefügt hast ? nö tust du nicht

@Jw456 meint das aus sicherheitsgründen für code verhalten
zb irgendein dödel schreibt dann
Java:
var participant = new Participant("bob");
participant.name = "definitiv kein bob mehr";
und an der anderen code stelle wunderst du dich "warum ises jetzt kein bob mehr?" ... du hast einen zugriff zugelassen den namen zu überschreiben, dieser darf aber nicht überschrieben werden

also setzt du den namen private oder protected... ja gut jetz klappt abe rdas comparable nimmer...
dh du machst nen getter, der erlaubt zwar lese zugriff aber keinen schreibzugriff
zusätzlich kannst du im getter dann extra sachen machen... wie zb wenn du eine online app machst, sollte der name geteilt werden wenn gegettet wird

also sagst im getter
Java:
public String getName(){
    teilImInternet(name);
    return name;
}
die leute die diek onventionen aufgestellt haben usw haben sich schon was dabei gedacht
 

KonradN

Super-Moderator
Mitarbeiter
Du kannst doch als erstes alle Elemente löschen, die da enthalten sind (oder wenn es da auch Controls gibt, die bleiben sollen, dann musst Du da etwas besser selectieren.

Also ggf. sowas wie ein root2.getChildren().clear()
 
Y

yfons123

Gast
ja natürlich bleiben die alten werte drin

löscht du denn die labels die vorher hinzugefügt werden ? nö tust du nicht
llöscht du die einträge in der array list die du vorher hinzugefügt hast ? nö tust du nicht
Du kannst doch als erstes alle Elemente löschen, die da enthalten sind (oder wenn es da auch Controls gibt, die bleiben sollen, dann musst Du da etwas besser selectieren.

Also ggf. sowas wie ein root2.getChildren().clear()
 

Encera

Aktives Mitglied
Danke für die Antworten
Also ja die Elemente werden nun sortiert das klappt. Das letzte Problem ist nur noch das Layout.
Ja das mit dem löschen der Elemente macht schon Sinn xD Ich weiß nur leider nicht wie ich das machen soll. Hab mit der root2.getChildren.clear
rumexperimentiert aber ohne Erfolg. Die vorherigen Textausgaben bleiben bestehen
 

Jw456

Top Contributor
Ok das sortieren geht. Also kannst du dir das mit dem getter sparen.
Da du nicht gesagt hast das es geht. Habe ich das gesagt.
 

Encera

Aktives Mitglied
naja
dann zu der zweiten frage... hast du die arraylist leer gemacht? gedenke nicht ;)
Das hab ich tatsächlich gerade versicht und zwar folgendermaßen^^:
Java:
@Override
            public void handle(MouseEvent event) {
                    Participant teilnehmer = new Participant(nameField.getText());
                        participantList.add(teilnehmer);
                        Collections.sort(participantList);
                       
                       
                    for(int i = 0; i < participantList.size(); i++) {
                        Text label1 = new Text();
                        root2.getChildren().add(label1);
                        label1.setText(participantList.get(i).name);
                        participantList.clear(); // <----------
                       
                    }
Hat leider auch nicht geholfen.

@Jw456 sorry das hab ich wohl vergessen zu erwähnen :/
 
Y

yfons123

Gast
Java:
            public void handle(MouseEvent event) {
                    Participant teilnehmer = new Participant(nameField.getText());
                        participantList.add(teilnehmer);
                        Collections.sort(participantList);
                
                       root2.getChildren.clear();
                      
                    for(int i = 0; i < participantList.size(); i++) {
                        Text label1 = new Text();
                        root2.getChildren().add(label1);
                        label1.setText(participantList.get(i).name);
                        //wtf? warum hier???
                        // participantList.clear(); // <----------
                      
                    }
                    participantList.clear();
 

Encera

Aktives Mitglied
Wenn ich das so eingebe funktioniert die Sortierung nichtmehr. Macht ja auch Sinn eigentlich weil wenn ich die ArrayList cleare gibts ja im nächsten Schleifendurchlauf nichtsmehr zum sortieren.
Java:
            public void handle(MouseEvent event) {
                    Participant teilnehmer = new Participant(nameField.getText());
                        participantList.add(teilnehmer);
                        Collections.sort(participantList);
               
                       root2.getChildren.clear();
                     
                    for(int i = 0; i < participantList.size(); i++) {
                        Text label1 = new Text();
                        root2.getChildren().add(label1);
                        label1.setText(participantList.get(i).name);
                        //wtf? warum hier???
                        // participantList.clear(); // <----------
                     
                    }
                    participantList.clear();
 

KonradN

Super-Moderator
Mitarbeiter
Also nur noch einmal:

Du sollst nicht die participantList leer machen. Das ist ja einfach nur die Liste mit den Strings, die Du sortiert hast.

Du sollst das Control leer machen. Damit wäre dies ein:
root2.getChildren().clear();

Da die Klammern fehlten im geposteten Code hast Du das vermutlich nicht so ausprobiert.

Dabei geht das nur, wenn wirklich alle Children des root2 Controls gelöscht werden sollen. Das also eine VBox ist oder so und nur die Text() Elemente da drin sind.
 
Y

yfons123

Gast
soooo ich werde dich jetzt mal mit allem erschlagen was ich so im repertoire habe

das was jetzt kommt geht alles in meinem framework ( ja dauerwerbesendung :D ) weil es sich genau um das dreht... da wird jetzt viel neues kommen

anekdoten voraus: wenn @KonradN sagt "anfänger sollte man nicht mit schweren sachen erschlagen".... das ist mein spruch!

also zuerst

was möchte man haben
man möchte grafische darstellung von dem was berechet wird trennen
in meinem fall
view = grafische darstellung
scheduler = verhaltensberechnung

was kann eine view? da definieren wir jetzt mal ne grundklasse... ich bin informatiker und faul und tipp nicht jeden scheiß 1000 mal
Java:
public class SimpleView<ROOT_PANE_TYPE extends Pane>
{

  protected ROOT_PANE_TYPE root;

  public ROOT_PANE_TYPE getRoot() {
    return root;
  }
}
dh ich kann jetzt folgendes zb tun
Java:
public class XYZView extends SimpleView<VBox>{
    
}
hierbei werden die rückgabewerte und der typ von root auf eine VBox eingestellt
guddi... jetzt hat man einen container gebaut für eine view, den kann man hernehmen

jetzt zum scheduler
was kann der:
jeder scheduler braucht ne view, und kann die liefern
Java:
public abstract class SimpleScheduler<VIEWT extends SimpleView<?>> {
  protected VIEWT view;
    
  public VIEWT getView() {
    return view;
  }

  @Override
  public final Pane getRoot() {
    return view.getRootPane();
  }
}


soooooodala jetzt hat man die grundbausteine die immer funktionieren ( sonst hätte ich mein framework nicht so gebaut :p )

deine Namens listen darstellung hat folgenden aufbau
1. die namen untereinander ( in das problem wärst du rein gelaufen )

also legen wir mal einen scheduler und eine view an
Java:
public class NameDisplay extends SimpleScheduler<NameDisplayView> {
    private ObservableList<Node> participantViews = FXCollections.observableArrayList();
    
    public NameDisplay() {
        // hier übergebe ich die observable list an die sich die view halten soll,
        // da sind die elemente drin die dargestellt werden sollen
        view = new NameDisplayView(participantViews);
    }
}
das ziel von participant views ist => wenn du der liste was hinzufügst soll sich die view danach verändern und ausrichten
Java:
public class NameDisplayView extends SimpleView<BorderPane>{

    private VBox nameBox = new VBox();
    public NameDisplayView(ObservableList<Node> participantViews ) {
        // root muss noch initialisiert werden
        root = new BorderPane();
        
        root.setTop(new Label("Namens Liste"));
        root.setCenter(nameBox);
        Bindings.bindContentBidirectional(nameBox.getChildren(), participantViews);

    }
}
durch das Bindings... ist die namebox und die children der vbox immer gleich und ändern sich auch immer parallel
damit ist das parallele ausrichten erledigt

dein participant will auch eine grafische darstellung , braucht aber kein verhalten also keinen scheduler, braucht aber eig auch keine view sein, da es einfach nur ein purer grafik inhalt, die view verwaltet ja die grafik elemente, diese participant darstelllung tut das nicht ( man kann es in eine view packen aber bin gerade zu faul :) )
Java:
// könnte eig record sein aber wäre übertrieben wahrscheinlich
public class Participant implements Comparable<Participant> {

    private String name;

    public Participant(String name) {
        this.name = name;
    }
    
    @Override
    public int compareTo(Participant o) {
        return this.name.compareTo(o.name);

    } 
    // ist ansich readonly geworden ... wie willst denn von aussen noch dne namen ändern?
    public String getName() {
        return name;
    }
}
dann kann man eine grafische darstellung so zusammen bauen wie so zb..

Java:
public class ParticipantNode extends HBox{
    Label name;
    Button delete = new Button("entfernen");
    
    public ParticipantNode(Participant participant) {
        this.getChildren().addAll(new Label(participant.getName()));

    }
    public void addRemoveOption(ObservableList<Node> parentList) {
        this.getChildren().add(delete);
        delete.onActionProperty().set(event-> parentList.remove(this));
    }

}
gut jetzt kann man der namedisplay einen participant hinzufügen
aber dafür braucht die namedisplay noch ne methode
Java:
    public void addParticipant(Participant participant) {
        var p = new ParticipantNode(participant);
        p.addRemoveOption(participantViews);
        participantViews.add(p);
// hier musst du noch participantView.sort(comparator von participant) einfügen... das machst aber selber!
    }

wenn du das hast brauchst du ja noch deine knöpfchen zum hinzufügen
ich hab die grafik mal in 1 gepackt weil die extra stage komisch erscheint und ich nicht mag... wenn du sie magst ädnere sie um
Java:
// hier bin ich zu faul diese extra private zu machen!
 public class NameAddingView extends SimpleView<BorderPane>{

    TextField nameField = new TextField("Name");
    Button save = new Button("Save");
    HBox menubox = new HBox(nameField,save);
    public NameAddingView(SimpleView<?> participantView) {
        root = new BorderPane();
        root.setTop(menubox);
        root.setCenter(participantView.getRootPane());
    }
}

und der scheduler kann so ausschauen
Java:
public class NameAdding extends SimpleScheduler<NameAddingView>{
    NameDisplay nameDisplay = new NameDisplay();
    NameAddingView view = new NameAddingView(nameDisplay.getView());

    public NameAdding(Stage primaryStage) {

        Scene scene = new Scene(view.getRoot(), 800, 700);
        primaryStage.setScene(scene);
        primaryStage.show();

        view.save.onMouseClickedProperty().set(saveClicked);
    }
    EventHandler<MouseEvent> saveClicked = event ->{
                    var participant = new Participant(view.nameField.getText());
                    nameDisplay.addParticipant(participant);
    };

}
hier hat man dann eine view undzwar die Nameaddingview, dieser füg ich die namedisplay view hinzu... die soll sich drum kümmern wo sie hinkommt ist dem scheduler komplett wurscht

somit kannst du prinzipiell an die sache ran gehen
das schwierigste ist die liste die bidirectional gebunden wurde um die darstellung zu synchronisieren

wer bis hierhin gelesen hat... kriegt nen keks :D
weil ich ein genie ohnes gleichen bin hab ich natürlich während dem schreiben was verändert und weis selber nich mehr ob alles zusammen passt also schick ich die dateien rein

das ganze hier auch mit den dateien bringt dir einen SCHEISS wenn du es nicht verstehst das ist hier ein beispiel um dir zu zeigen wie man es lösen KANN
die lösung ist aber komplett IRRELEVANT wenn du es nicht verstehst, wenn du es verstehst kannst du allerlei andere probleme auch lösen, wenn du es nicht verstehst kannst du das problem lösen aber keine anderen und darum gehts bei aufgaben... du sollst lernen wie es allgemein geht und nicht speziell
 

Anhänge

  • NameDisplay.java
    801 Bytes · Aufrufe: 5
  • SimpleView.java
    194 Bytes · Aufrufe: 1
  • SimpleScheduler.java
    274 Bytes · Aufrufe: 1
  • ParticipantNode.java
    609 Bytes · Aufrufe: 2
  • Participant.java
    490 Bytes · Aufrufe: 1
  • NameDisplay.java
    801 Bytes · Aufrufe: 3
  • NameAddingView.java
    620 Bytes · Aufrufe: 1
  • NameAdding.java
    1 KB · Aufrufe: 3
  • Launcher.java
    349 Bytes · Aufrufe: 3
Zuletzt bearbeitet von einem Moderator:

Encera

Aktives Mitglied
Puh also erstmal vielen Dank fürs die Mühe die du dir gemacht Bast das ist echt nett von dir👍👍
Muss mir das ganze dann mal in Ruhe ansehen und schauen ob ichs nachvollziehen kann sieht aber echt bissl complicated aus😅😅
 

Jw456

Top Contributor
das ganze hier auch mit den dateien bringt dir einen SCHEISS wenn du es nicht verstehst das ist hier ein beispiel um dir zu zeigen wie man es lösen KANN
die lösung ist aber komplett IRRELEVANT wenn du es nicht verstehst, wenn du es verstehst kannst du allerlei andere probleme auch lösen, wenn du es nicht verstehst kannst du das problem lösen aber keine anderen und darum gehts bei aufgaben... du sollst lernen wie es allgemein geht und nicht speziell
Du hast eine Datei doppelt gepostet "NameDisplay.java" und eine Datei vergessen "NameDisplayView.java"
Es fehlt somit eine Klasse. Das sollte bestimmt die Doppelte Datei sein. :)
 
Y

yfons123

Gast
Du hast eine Datei doppelt gepostet "NameDisplay.java" und eine Datei vergessen "NameDisplayView.java"
Es fehlt somit eine Klasse. Das sollte bestimmt die Doppelte Datei sein. :)
tatsächlich die habe ich versau beutelt+
Java:
public class NameDisplayView extends SimpleView<BorderPane>{

    private VBox nameBox = new VBox();
    public NameDisplayView(ObservableList<Node> participantViews ) {
        // root muss noch initialisiert werden
        root = new BorderPane();
        
        root.setTop(new Label("Namens Liste"));
        root.setCenter(nameBox);
        Bindings.bindContentBidirectional(nameBox.getChildren(), participantViews);

    }
}
 

Anhänge

  • NameDisplayView.java
    649 Bytes · Aufrufe: 1

Jw456

Top Contributor
Ok jetzt ist es vollständig.

Aber der TE wollte doch das sich die Liste die entsteht sortiert beim hinzufügen oder löschen von Elementen. Das tut sie nicht.


Unbenannt.png
 
Zuletzt bearbeitet:
Ähnliche Java Themen
  Titel Forum Antworten Datum
Linjutsu Den Inhalten aus einer ArrayList Bilder zuweisen (Kartenspiel) AWT, Swing, JavaFX & SWT 8
mrbody234 ArrayList<Message> in eine TableView visualisieren AWT, Swing, JavaFX & SWT 2
S ChoiceBox aus ArrayList per setValue() mit Wert belegen funktioniert nicht. AWT, Swing, JavaFX & SWT 0
BananenBrötchen Swing Arraylist in jList anzeigen AWT, Swing, JavaFX & SWT 6
W Clear Canvas und anschließendes neues Erstellen von Objekten auf Canvas aus ArrayList AWT, Swing, JavaFX & SWT 4
missy72 JavaFX ObservableList in einer ArrayList speichern. AWT, Swing, JavaFX & SWT 7
B ArrayList, Strings anzeigen AWT, Swing, JavaFX & SWT 1
S JavaFx - ausgewählte Rows in Arraylist (Tableview) AWT, Swing, JavaFX & SWT 4
A Swing Wie Daten in der Form speichern? Array oder ArrayList AWT, Swing, JavaFX & SWT 2
K Swing JComboBox mit ArrayList füllen AWT, Swing, JavaFX & SWT 4
GreenTeaYT Wie vergebe Ich den Jframe Title den Namen aus einem Element von der Arraylist ? AWT, Swing, JavaFX & SWT 4
B Klasse mit ArrayList AWT, Swing, JavaFX & SWT 1
I JTable dynamisch aus ArrayList befüllen AWT, Swing, JavaFX & SWT 3
ZoXlike Wie kann man ArrayList in JTabel einlesen? [WindowBuilder] AWT, Swing, JavaFX & SWT 1
D Swing ArrayList in Jlist/ List oder Array in JList/List AWT, Swing, JavaFX & SWT 5
E Eigenes TableModel für ArrayList<String[]> AWT, Swing, JavaFX & SWT 5
S ArrayList Problem AWT, Swing, JavaFX & SWT 3
T JTable dynamisch mit ArrayList AWT, Swing, JavaFX & SWT 2
S Swing JList, ArrayList + DefaultModel AWT, Swing, JavaFX & SWT 5
Ollek JList - neuer Eintrag in ArrayList dadurch keine Anzeige der Objekte AWT, Swing, JavaFX & SWT 18
T Swing Ausgabe aus ArrayList in Klasse1 in jTextArea in Klasse2 AWT, Swing, JavaFX & SWT 2
E Problem mit ArrayList AWT, Swing, JavaFX & SWT 7
P Auf gefüllte ArrayList zugreifen AWT, Swing, JavaFX & SWT 12
P ArrayList Rectangles2D AWT, Swing, JavaFX & SWT 29
O JComboBox mit ArrayList füllen AWT, Swing, JavaFX & SWT 3
D Probleme bei Übertrag von ArrayList in Jtable AWT, Swing, JavaFX & SWT 2
F Swing ArrayList in JList anzeigen und Objekte auswählen AWT, Swing, JavaFX & SWT 2
L AWT paint mit ArrayList und Iterator AWT, Swing, JavaFX & SWT 3
Z Swing JButton,JFrame, ArrayList & so weiter... AWT, Swing, JavaFX & SWT 20
C Swing NullPointerException beim Hinzufügen von Checkboxes in eine ArrayList AWT, Swing, JavaFX & SWT 5
G Swing Elemente aus Arraylist auf JFrame anzeigen AWT, Swing, JavaFX & SWT 9
S JTable - 2D ArrayList & Falsche Werte. AWT, Swing, JavaFX & SWT 3
Screen Fehler bei Get-Methode für ArrayList AWT, Swing, JavaFX & SWT 8
M Swing JTable soll auf ArrayList zugreifen AWT, Swing, JavaFX & SWT 8
B Swing JButtons in eine Arraylist<JButton> einfügen AWT, Swing, JavaFX & SWT 2
J Daten aus einer Textdatei in ArrayList holen AWT, Swing, JavaFX & SWT 9
J ArrayList Inhalt zählen AWT, Swing, JavaFX & SWT 53
J ArrayList Datensätze komplett löschen AWT, Swing, JavaFX & SWT 8
J ArrayList Datensätze auswerten AWT, Swing, JavaFX & SWT 10
Y Swing Aktualisieren eines JPanel mit ArrayList im TableLayout AWT, Swing, JavaFX & SWT 2
L ArrayList Wert löschen klappt nicht AWT, Swing, JavaFX & SWT 11
M ArrayList in 2D Array umfüllen AWT, Swing, JavaFX & SWT 9
C Swing ArrayList in JComboBox AWT, Swing, JavaFX & SWT 6
H ArrayList?! in Tabelle AWT, Swing, JavaFX & SWT 3
B ArrayList in JTable AWT, Swing, JavaFX & SWT 3
B ArrayList im JTextArea anzeigen lassen AWT, Swing, JavaFX & SWT 30
Ollek JTable - Tabelle füllen mit einer ArrayList AWT, Swing, JavaFX & SWT 22
T ArrayList aus KlasseA in KlasseB in JTextArea ausgeben AWT, Swing, JavaFX & SWT 12
KrokoDiehl EventListenerList vs. ArrayList AWT, Swing, JavaFX & SWT 3
I Swing JTree aus ArrayList<File> erzeugen AWT, Swing, JavaFX & SWT 15
C Swing ArrayList in jList AWT, Swing, JavaFX & SWT 3
Spot84 jtable mit checkboxnode dynamisch per arraylist füllen AWT, Swing, JavaFX & SWT 8
G Wie lasse ich einen Graphen zeichnen(mit einer ArrayList)? AWT, Swing, JavaFX & SWT 5
S Tree - ArrayList Zuordnung! AWT, Swing, JavaFX & SWT 13
nadal15 JTable und ArrayList - selected rows löschen AWT, Swing, JavaFX & SWT 6
G JTable - TableModel aus ArrayList AWT, Swing, JavaFX & SWT 8
QDog JComboBox updaten, ArrayList AWT, Swing, JavaFX & SWT 7
D JLabel's in einer ArrayList speichern? AWT, Swing, JavaFX & SWT 4
G jList mit ArrayList füllen AWT, Swing, JavaFX & SWT 3
G datensätze aus der db in einer arraylist speicher und in gui AWT, Swing, JavaFX & SWT 4
G Aus Arraylist bestimmte Objekte wiedergegeben bekommen? AWT, Swing, JavaFX & SWT 7
L JTable und Daten aus einer ArrayList AWT, Swing, JavaFX & SWT 6
A Components in einer ArrayList aus anderer Klasse speichern AWT, Swing, JavaFX & SWT 8
S Anzahl ActionEvents (Strings in eine ArrayList einfügen) AWT, Swing, JavaFX & SWT 4
maximizer JavaFX Accordion mit eigenen TitledPanes füllen AWT, Swing, JavaFX & SWT 0
P JavaFX Zugriff auf Fenster/Layout-Container in eigenen Klassen AWT, Swing, JavaFX & SWT 5
F jTree und das Model aus einer eigenen Klasse AWT, Swing, JavaFX & SWT 1
J Drag and Drop von eigenen Objekten AWT, Swing, JavaFX & SWT 3
K Panels mit eigenen Controllern in Main-View einbauen AWT, Swing, JavaFX & SWT 4
B SWT Problem: Wie kann man für jede TableColumn einen eigenen KeyListener registrieren. AWT, Swing, JavaFX & SWT 1
G LookAndFeel Tutorial für Erstellung eines eigenen Look And Feel AWT, Swing, JavaFX & SWT 3
S Swing Eigenen Button schreiben AWT, Swing, JavaFX & SWT 6
B Eigenen Look&Feel erstellen?! AWT, Swing, JavaFX & SWT 2
S Swing Eigenen JDialog mit Rückgabewert AWT, Swing, JavaFX & SWT 3
H Verschiedene JPanels aus eigenen Klassen in JFrame einfügen, nur ein Panel sichtbar AWT, Swing, JavaFX & SWT 4
Z andere Programmfenster relativ zum eigenen maximieren AWT, Swing, JavaFX & SWT 4
B Swing Eigenen Cursor setzen AWT, Swing, JavaFX & SWT 10
J Eigenen Parser schreiben AWT, Swing, JavaFX & SWT 8
N Swing eigenen Dialog erstellen AWT, Swing, JavaFX & SWT 8
jueki eigenen Button in JFileChooser einfügen AWT, Swing, JavaFX & SWT 7
M JTree mit eigenen Knoten - Zugriff auf Daten AWT, Swing, JavaFX & SWT 6
E Eigenen RowSorter AWT, Swing, JavaFX & SWT 11
P Swing eigenen Modalen JDialog AWT, Swing, JavaFX & SWT 6
data89 Swing Eigenen Fensterrahmen und (Fenster-)Erweiterungen erstellen AWT, Swing, JavaFX & SWT 7
S Swing editable JCombobox mit eigenen Einträgen manangen AWT, Swing, JavaFX & SWT 5
S AWT Eigenen Cursor im Frame verwenden... AWT, Swing, JavaFX & SWT 5
F Drag & Drop mit eigenen Komponenten AWT, Swing, JavaFX & SWT 2
GilbertGrape ActionListener implementieren oder Eigenen für jede Komponente? AWT, Swing, JavaFX & SWT 9
G Hilfe beim Erstellen eines eigenen Html-Editors! AWT, Swing, JavaFX & SWT 4
C JScrollpane eigenen jScrollBar einfügen AWT, Swing, JavaFX & SWT 2
D Darstellungsproblem des eigenen TreeModel bei Veränderungen AWT, Swing, JavaFX & SWT 7
G eigenen Observer schreiben AWT, Swing, JavaFX & SWT 6
J Drag & Drop : JLabel -> JLabel (eigenen Datentyp über AWT, Swing, JavaFX & SWT 2
S JTree mit eigenen Objekten füllen AWT, Swing, JavaFX & SWT 4
isowiz Einige Fragen zur ersten eigenen Sing-Applikation AWT, Swing, JavaFX & SWT 4
M Symbole beim eigenen Renderer AWT, Swing, JavaFX & SWT 7
F Eigenen JDialog öffnen? AWT, Swing, JavaFX & SWT 4
J JFrame mit eigenen Button minimieren AWT, Swing, JavaFX & SWT 2
N Methode für Bild laden geht nur in der eigenen Klasse... AWT, Swing, JavaFX & SWT 3
ExceptionOfExpectation MouseListener-Objekte zu den Graphics-Objekten einfügen AWT, Swing, JavaFX & SWT 3

Ähnliche Java Themen

Neue Themen


Oben