JavaFX ListView in Kombination mit TextField

B

BigMemo007

Aktives Mitglied
Hallo Comunity,

habe folgenden Codes:

In der Gui:

Java:
Button addItem = new Button();
ListView<TextField> lv = new ListView<>();

addItem.setOnAction(new EventHandler<ActionEvent>() {

            @Override
            public void handle(ActionEvent arg0) {
                
                lv.getItems.add(new MyTF);

            }
        });

Im MyTF

Java:
public class MyTF{
    
     public MyTF(){
        setPromptText("Wie soll der Eintrag heißen");
        setEditable(true);
        
         //Der Code hier bewirkt, wenn auf Enter gedrückt wird dass der Text sozusagen
         //festgehalten wird, in dem editable auf false gesetzt wird
        setOnAction(new EventHandler<ActionEvent>() {

            @Override
            public void handle(ActionEvent arg0) {

                setEditable(false);

            }
        });
        
     }
 }


So, damit kann ich schon mit addItem in meiner ListView ein leeres TextField generieren, das beschreiben (Name des Items) und mit Enter quasi Namen akteptieren.

Soweit so gut, aber das ganze ist noch nicht perfekt.

1. Wenn man die ListView, nicht ein Item in der ListView, anklickt, bekommt es einen blauen Rahmen. Kann ich den wegmachen? Ich hab keine Möglichkeit gefunden bis jetzt, nur auf diesen Rahmen zugreifen zu können.

2. Wenn ein Item angeklickt wird, soll die Celle einen blauen Hintergrund bekommen, so dass die Markierung viel deutlicher ausfällt. Alternativ kann auch das Textfeld einen blauen Hintergrund bekommen. Wenn aber die Markierung weg ist ( der User hat woanders gecklickt), soll der blaue Hintergrund wieder weg.

3. Wenn User nach Texteingabe im neuen TextFeld woandershin mit der Maus klickt, also nicht auf Enter drückt, soll trotzdem der Text akzeptiert werden, quasi das Textfeld auf setEditable = false gesetzt werden.


Ich habe verdammt viele wege probiert, hat aber alles nicht so geklappt, wie es sein soll/muss. Jetzt habe ich Kopfvoll... :(((
 
B

BigMemo007

Aktives Mitglied
Ich habe alle meine Probleme nach einmal drüber schlafen gelöst :)))

Folgende Testklasse habe ich geschrieben, wo alles super gelöst ist. Das kann ich in meine Programm so integrieren.


Java:
public class Main extends Application {
    
    
    @Override
    public void start(Stage primaryStage) {
        try {
            BorderPane root = new BorderPane();
            
            ListView<Object> lv = new ListView<Object>();
            root.setCenter(lv);
            
            Button btn = new Button("Eintrag hinzufügen");
            BorderPane.setAlignment(btn, Pos.CENTER);
            root.setBottom(btn);
            
            btn.setOnAction(new EventHandler<ActionEvent>() {
                
                @Override
                public void handle(ActionEvent arg0) {
                    HBox hbox = new HBox(20);
                    TextField tf = new TextField();
                    Button ok = new Button("OK");
                    Button edit = new Button("umb");
                    edit.setVisible(false);
                    
                    hbox.getChildren().addAll(tf, ok, edit);
                    
                    lv.getItems().add(hbox);
                    
                    tf.setOnMouseClicked(new EventHandler<MouseEvent>() {

                        @Override
                        public void handle(MouseEvent arg0) {
                            if (arg0.getButton() == MouseButton.PRIMARY) {
                                //wenn auf Textfeld gecklickt wird, wird entsprechende Zeile ausgewählt / markeirt
                                int index = lv.getItems().indexOf(hbox);
                                lv.getSelectionModel().select(index);

                                System.out.println(tf.getText());
                            }
                        }
                    });                   
                    
                    ok.setOnAction(new EventHandler<ActionEvent>() {

                        @Override
                        public void handle(ActionEvent arg0) {
                            tf.setEditable(false);
                            ok.setVisible(false);
                            edit.setVisible(true);
                            
                            edit.setOnAction(new EventHandler<ActionEvent>() {

                                @Override
                                public void handle(ActionEvent arg0) {
                                    tf.setEditable(true);
                                    edit.setVisible(false);
                                    ok.setVisible(true);
                                    
                                }
                            });
                        }
                    });
                    
                }
            });
            
            
            Scene scene = new Scene(root,400,400);
            scene.getStylesheets().add(getClass().getResource("application.css").toExternalForm());
            primaryStage.setScene(scene);
            primaryStage.show();
        } catch(Exception e) {
            e.printStackTrace();
        }
    }
    
    public static void main(String[] args) {
        launch(args);
    }
}

Kann man diesen Code noch kompakter gestatlten (meine jetzt nicht Lambda-Ausdrücke)? D.h. Methoden die ich noch nicht kenne, aber meine Listview genauso gestalten? Naja, blöde Frage ich weiß. Aber es sind wohl gerade die Glücksgefühle die mich überwältigen, weil ich diesen (für Profis pipifix) Code hinbekommen habe :):):cool::cool::p:p
 
dzim

dzim

Top Contributor
Erst einmal: Glückwunsch, dass du es geschafft hast. Hier kurz meine Verbesserungsvorschläge:
  • Nutze Lambdas anstelle von anonymen Klassen
    Java:
    button.setOnAction(EventHandler<ActionEvent>() { @Override
        public void handle(ActionEvent e) { /* do something */}
    });
    
    button.setOnAction(e -> { /* do something */});
  • Setze den edit-Handler nicht im EventHandler des ok-Buttons.
  • Deinen Code könnte man z.B. durch so ein Konstrukt hier verkürzen:
    Java:
    Consumer<Boolean> function = onOk -> {
        tf.setEditable(!onOk);
        ok.setVisible(!onOk);
        edit.setVisible(onOk);
    };
    ok.setOnAction(e -> function.accept(true));
    edit.setOnAction(e -> function.accept(false));
Das wär erst mal alles.

#Edit: den Teil mit dem MouseClicked-Listener habe ich mir jetzt nicht im Detail angeschaut. Aber auch hier kannst du ein Lambda nehmen.
 
B

BigMemo007

Aktives Mitglied
Erst einmal: Glückwunsch, dass du es geschafft hast. Hier kurz meine Verbesserungsvorschläge:
  • Nutze Lambdas anstelle von anonymen Klassen
    Java:
    button.setOnAction(EventHandler<ActionEvent>() { @Override
    public void handle(ActionEvent e) { /* do something */}
    });
    
    button.setOnAction(e -> { /* do something */});
  • Setze den edit-Handler nicht im EventHandler des ok-Buttons.
  • Deinen Code könnte man z.B. durch so ein Konstrukt hier verkürzen:
    Java:
    Consumer<Boolean> function = onOk -> {
    tf.setEditable(!onOk);
    ok.setVisible(!onOk);
    edit.setVisible(onOk);
    };
    ok.setOnAction(e -> function.accept(true));
    edit.setOnAction(e -> function.accept(false));
Das wär erst mal alles.

#Edit: den Teil mit dem MouseClicked-Listener habe ich mir jetzt nicht im Detail angeschaut. Aber auch hier kannst du ein Lambda nehmen.

@dzim Danke für die Tipps. Habe die Lambdas umgesetzt. Das Functional Interface Consumer noch nicht, werde es aber bei Gelegenheit noch machen. Es wäre für mich al Neuling im Funcitonal Interfaces erstmal verwirrend.

Ich habe noch Code für das Speichern meiner ListView Inhalte geschrieben. Die Klasse ist irgendwie mMn unübersichtlich geworden, wenn ich Code von Profis vergleiche. Aber vielleicht ist es ja noch im Rahmen. Ich weiß es halt nicht. Deswegen werde ich ein neues Thread aufmachen und mal euch fragen, wie ihr den Code so findet.
 
dzim

dzim

Top Contributor
Also zum Thema unübersichtlich: Ich habe manche Klassen, oder in Kotlin auch Files, mit weit über 1000 Zeilen.
In bestimmten Situationen (bei mir z.B. eine "Domain Specific Language") kannst du es gar nicht verhindern. Mach dir darum erst mal nicht den Kopf. Und ich habe auch Jahre gebraucht, bis ich wirklich so viel Disziplin erlangt habe, Code zu trennen und, wenn möglich, zu refaktorisieren, wenn es sinnvoll ist.

Glaub mir einfach: Das kommt mit der Zeit. Und - sofern möglich - werden wir dir Tipps geben, was du verbessern kannst, oder wo du recherchieren solltest. Oder Code-Schnipsel liefern, die dir hoffentlich helfen.

In meiner Erfahrung sind die meisten Entwickler recht sozial, wenn es um das Teilen von Erfahrungen und Tipps geht, auch wenn einige es schon wieder fast religiös betrachten, wie Code geschrieben werden müsste.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
M File Dateien im ListView als Name anzeigen? AWT, Swing, JavaFX & SWT 6
B JavaFX das richtige ListView filtern AWT, Swing, JavaFX & SWT 2
B Dynamische ListView-Größe, die bei Fenstergrößenänderung sich anpasst AWT, Swing, JavaFX & SWT 19
S JavaFX ListView Inhalte während Laufzeit ändern AWT, Swing, JavaFX & SWT 23
karlmasutra JavaFX ListView zeigt Einträge nicht an AWT, Swing, JavaFX & SWT 11
B Textfelder in einer ListView ausgeben AWT, Swing, JavaFX & SWT 13
J CheckBoxListCell auf click event in listView reagieren AWT, Swing, JavaFX & SWT 1
karlmasutra JavaFX Listenelemente bearbeiten Listview AWT, Swing, JavaFX & SWT 1
D JavaFX Listview mit observableList AWT, Swing, JavaFX & SWT 6
M Selektion aus einer ListView AWT, Swing, JavaFX & SWT 5
N Frage zu ListView AWT, Swing, JavaFX & SWT 11
L JavaFX ListView Größe anpassen AWT, Swing, JavaFX & SWT 1
F JavaFX ListView füllen in Controller Class AWT, Swing, JavaFX & SWT 12
F JavaFX In SampleController ObservableList zu ListView hinzufügen AWT, Swing, JavaFX & SWT 0
D JavaFX ListView & TabelView AWT, Swing, JavaFX & SWT 9
F JavaFX Custom ListView erstellt ghost Element AWT, Swing, JavaFX & SWT 3
F JavaFX Von Datenbank in ListView AWT, Swing, JavaFX & SWT 4
F JavaFX ListView Zeilenhöhe AWT, Swing, JavaFX & SWT 2
M Auswahl aus einer ListView AWT, Swing, JavaFX & SWT 3
F Icons neben Text in Listview setzen AWT, Swing, JavaFX & SWT 2
K ListView right click AWT, Swing, JavaFX & SWT 1
Y Listview Textfield vergrößern, Schrift anpassen AWT, Swing, JavaFX & SWT 0
C Liste - ListView wird nicht angezeigt AWT, Swing, JavaFX & SWT 15
L JavaFX ListView oder TableView Style überschreiben? AWT, Swing, JavaFX & SWT 6
T listview seclect abschalten AWT, Swing, JavaFX & SWT 1
NoXiD Java FX JFX 2 DnD ListView AWT, Swing, JavaFX & SWT 3
T [JavaFX 2.0] ListView editieren AWT, Swing, JavaFX & SWT 2
H Kombination von zwei Frames AWT, Swing, JavaFX & SWT 16
P Swing JEditorPane in Kombination mit JScrollPane AWT, Swing, JavaFX & SWT 29
H AWT AffineTransform, Kombination von Translation und Rotation AWT, Swing, JavaFX & SWT 0
D Swing in Kombination mit JGraphX und JGraphT AWT, Swing, JavaFX & SWT 0
J RadioButton-Gruppe in Kombination mit einem Button AWT, Swing, JavaFX & SWT 6
1 Buttons in Kombination mit Linien AWT, Swing, JavaFX & SWT 3
M Ansätze zur Kombination mehrerer Listener für Interaktion AWT, Swing, JavaFX & SWT 19
T Swing Kombination von GUI-Elementen - Was mit wem ist erlaubt? AWT, Swing, JavaFX & SWT 12
T Spaltenbreite bei jTabel in Kombination mit Srollbalken AWT, Swing, JavaFX & SWT 2
reibi Kombination AWT in SWT AWT, Swing, JavaFX & SWT 6
M Grafik in JFrame in Kombination mit Steuerelementen AWT, Swing, JavaFX & SWT 2
B Problem mit der Kombination von JScrollBar und JTextArea AWT, Swing, JavaFX & SWT 2
B JavaFX TextField Eingabe in neues Fenster übernehmen AWT, Swing, JavaFX & SWT 4
L JavaFX Ich suche das passende Textfield Event AWT, Swing, JavaFX & SWT 1
Bluedaishi JavaFX JFoenix TextField KeyEvent AWT, Swing, JavaFX & SWT 2
F JavaFX Aktuelle Zeit in einem TextField anzeigen AWT, Swing, JavaFX & SWT 7
F JavaFX textField Ausgabe automatisch kopieren AWT, Swing, JavaFX & SWT 7
M JavaFX String aus TextField reagiert nicht wie erwartet AWT, Swing, JavaFX & SWT 3
S JavaFX TextField auf Datentyp prüfen AWT, Swing, JavaFX & SWT 1
M JavaFX .setCellFactory () mit TextField AWT, Swing, JavaFX & SWT 4
L TextField Listener AWT, Swing, JavaFX & SWT 13
L TextField Eingabe in andere GUI übernehmen AWT, Swing, JavaFX & SWT 1
C JavaFX mit .setText() befülltes Textfield liefert anschließend mit .getText() den ursprünglichen Wert? AWT, Swing, JavaFX & SWT 1
K JavaFX Combobox, Textfield & setOnMouseClicked AWT, Swing, JavaFX & SWT 2
U Java FX Warten auf Textfield eingabe AWT, Swing, JavaFX & SWT 17
G JavaFX - Während AudioRecording keine Text eingabe TextField möglich AWT, Swing, JavaFX & SWT 6
S Buttons und TextField automatisch vergrößern AWT, Swing, JavaFX & SWT 8
S AWT Daten über TextField und Button in array speichern AWT, Swing, JavaFX & SWT 5
U Eingabe von TextField in variable speichern AWT, Swing, JavaFX & SWT 2
J Eigene Klasse auf Basis Textfield in SceneBuilder anzeigen AWT, Swing, JavaFX & SWT 4
I JavaFX TextField auf Eingabe prüfen AWT, Swing, JavaFX & SWT 3
D JavaFX Nur Zahlen in Textfield AWT, Swing, JavaFX & SWT 4
D Textfield bei starten füllen. AWT, Swing, JavaFX & SWT 5
H Textfield bleibt im Hintergrund AWT, Swing, JavaFX & SWT 2
C JavaFX Zugriff auf TextField aus einer anderen Klasse AWT, Swing, JavaFX & SWT 4
P LayoutManager TextField.setSize(); in einem FlowLayout AWT, Swing, JavaFX & SWT 3
T Internes Event-handling in TextField/JTextField AWT, Swing, JavaFX & SWT 2
O Swing Text aus Textfield auslesen AWT, Swing, JavaFX & SWT 8
1 Textfield: jede Buchstabe ein Bild AWT, Swing, JavaFX & SWT 2
U Swing NullPointerException trotz Referenz auf Textfield & Button AWT, Swing, JavaFX & SWT 6
S LayoutManager TextField verschwindet / wird klein AWT, Swing, JavaFX & SWT 4
S Button in Textfield ziehen AWT, Swing, JavaFX & SWT 4
T Einen Variablen Wert in einem TextField AWT, Swing, JavaFX & SWT 4
K Viele Textfield mit Hilfe eines MousListener leeren - möglich? AWT, Swing, JavaFX & SWT 8
F Swing TextField Eingabe in Variable umwandeln um zum Beispiel zu rechnen. AWT, Swing, JavaFX & SWT 3
G JavaFX TextField Eingabe formatieren/einschränken AWT, Swing, JavaFX & SWT 2
C Integer in ein Textfield schreiben. AWT, Swing, JavaFX & SWT 4
P TextField beim klicken von JButton speichern AWT, Swing, JavaFX & SWT 17
C Swing TextField auslesen AWT, Swing, JavaFX & SWT 21
M Integer Zahl in Textfield ausgeben AWT, Swing, JavaFX & SWT 12
K Per Textfield Methode ausführen AWT, Swing, JavaFX & SWT 6
B JComboBox ans Textfield gelangen AWT, Swing, JavaFX & SWT 4
A Größe von Textfield bestimmen AWT, Swing, JavaFX & SWT 9
S JButton und textfield.setText - Komponenten über-/verdecken sich AWT, Swing, JavaFX & SWT 15
T jPanels im jFrame bewegen - Auch ohne Textfield? AWT, Swing, JavaFX & SWT 4
B AWT Mit TextField Zahlen einlesen lassen AWT, Swing, JavaFX & SWT 34
R Textfield auslesen auf Anforderung AWT, Swing, JavaFX & SWT 4
A Button und Textfield AWT, Swing, JavaFX & SWT 4
A TextField und Label AWT, Swing, JavaFX & SWT 8
H gui textfield AWT, Swing, JavaFX & SWT 5
A TextField: Textfeld teilweise editierbar AWT, Swing, JavaFX & SWT 2
R TextField auslesen & in Objekteigenschaften speichern AWT, Swing, JavaFX & SWT 22
E Button in TextField eibetten? AWT, Swing, JavaFX & SWT 4
Screen Focus Problem , KeyListener, TextField , Key AWT, Swing, JavaFX & SWT 4
W textfield zentriert AWT, Swing, JavaFX & SWT 2
N Swing Textfield listener AWT, Swing, JavaFX & SWT 2
H Zeich in einem TextField farblich markieren?! AWT, Swing, JavaFX & SWT 5
D Swing [BoxLayout] Nur TextArea und nicht TextField vergroessen AWT, Swing, JavaFX & SWT 2
D Textfield auswerten AWT, Swing, JavaFX & SWT 4
M Swing InputVerifer auf TextField AWT, Swing, JavaFX & SWT 14
B setText() auf TextField mit Document AWT, Swing, JavaFX & SWT 2
G Problem mit Textfield AWT, Swing, JavaFX & SWT 2
G Den Inhalt von einem Textfield aktualisieren AWT, Swing, JavaFX & SWT 6

Ähnliche Java Themen

Anzeige

Neue Themen


Oben