JavaFX Erste Versuche mit Data-Binding

Nemesys88

Bekanntes Mitglied
Guten Abend!

Ich probiere grade ein bisschen mit Data-Bindings herum und versuche folgende Funktionalität zu erreichen:

Java:
button.prefWidthProperty().bind(tf.textProperty());

(musste auch erstmal herausfinden das man nur prefWidthProperty verändern kann und nicht WidthProperty so wie man meinen könnte)

Das geht so natürlich nicht weil man 2 verschiedene Datentypen hat.

Hab jetzt inzwischen herausgefunden, dass es bi-direktional so geht:

Java:
Bindings.bindBidirectional(tf.textProperty(), button.prefWidthProperty(), new NumberStringConverter());

Aber wie lautet der korrekte Befehl wenn ich nur eine Richtung haben will ?
(nach Eingabe im Textfeld soll sich die Button-Width ändern)
 

Nemesys88

Bekanntes Mitglied
Nein, das hilft mir leider nicht weiter... oder ich überseh die entsprechende Zeile grade... aber ich probier hier auch schon seit 1,5 Stunden rum und hab das Internet gleich ausgelesen... :D
 

Nemesys88

Bekanntes Mitglied
In diesem Fall wahrscheinlich nicht weil es nur ein ganz einfacher Test ist um die Funktionalität zu verstehen... aber würd ich zb. sagen wollen "wenn ich die Fensterbreite änder soll er die Buttonbreite auch ändern", und dann hängt das TextField da noch dran.. hab ich schon nen Problem..
 

Nemesys88

Bekanntes Mitglied
Jetzt dacht ich grad ich hätt's geschafft...

Java:
		tf.setOnKeyReleased(e -> {
			if (!tf.getText().trim().isEmpty())
			{
				simple = new SimpleIntegerProperty(Integer.parseInt(tf.getText()));
				button.prefWidthProperty().bind(simple);
			}
		});

aber ich wunder mich grad, dass er beim Resizen des Buttons auch das TextField auf dieselbe Größe bringt, obwohl ich kein bidirektionales Binding verwendet hab oO
 

Nemesys88

Bekanntes Mitglied
Irgendwie muss das doch machbar sein, auch mit nem unidirektionalen Binding:

Java:
button.prefWidthProperty().bind(tf.textProperty());
 

Flown

Administrator
Mitarbeiter
Sicher geht das. Du musst dir nur dein eigenes Binding dafür schreiben.

Java:
import java.util.concurrent.Callable;
import javafx.application.Application;
import javafx.beans.binding.Bindings;
import javafx.beans.binding.DoubleBinding;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.TextField;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;

public class BindingApp extends Application {

  @Override
  public void start(Stage primaryStage) throws Exception {
    TextField widthField = new TextField();
    Button button = new Button("Button");

    DoubleBinding db = Bindings.createDoubleBinding(new Callable<Double>() {

      @Override
      public Double call() throws Exception {
        Double width;
        try {
          width = Double.valueOf(widthField.getText());
        } catch (Exception e) {
          width = -1d;
        }
        return width;
      }
    }, widthField.textProperty());

    button.prefWidthProperty().bind(db);

    VBox root = new VBox(widthField, button);
    primaryStage.setScene(new Scene(root));
    primaryStage.show();
  }

  public static void main(String... args) {
    launch(args);
  }

}
 

dzim

Top Contributor
Das liegt wohl daran, das eben auch das Textfeld an das darüberliegende Layout gebunden ist.
Mit den wenigen Code-Schnipseln hier ist es aber auch schwierig, eine gute Aussage zu treffen, was bei dir der Grund für deine Missverständnisse ist...
 

Nemesys88

Bekanntes Mitglied
Okay, vielen Dank erstmal!

Das sich das TextField ebenfalls anpasst liegt tatsächlich daran, dass label,tf und Button zusammen in ner VBox liegen.

Lagert man das TF aus so funktioniert sowohl meine Version:

Java:
		simple = new SimpleIntegerProperty();
			
		tf.setOnKeyReleased(e -> {
			if (!tf.getText().trim().isEmpty())
			{
				simple.set(Integer.parseInt(tf.getText()));
			}
		});
		
		button.prefWidthProperty().bind(simple);

als auch die Version von Flown mit dem selbstgeschriebenen Binding in gleicher Art und Weise.

Find ich aber ehrlich gesagt arg unglücklich gelöst (von oracle), dass sich dann durch das Binding alle Komponenten in der VBox automatisch anpassen...

Davon abgesehen das man sich erst so ne Lösung bauen muss, wo nen Binding mit gleichen Datentypen wie zb:

Java:
button.prefWidthProperty().bind(label1.widthProperty());

mit einer Zeile Code erledigt ist... :D
 

dzim

Top Contributor
Warum ist das unglücklich gelöst??? Du veränderst du Breite eines Elements in dem Layout, erwartest aber, dass die anderen davon unberührt bleiben? Das wäre erst recht unlogisch! Das ist doch gerade die Aufgabe vom Layout, dass es alle seine Elemente ordentlich layoutet...
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
P Erste Versuche einer Grafischen Oberfläche AWT, Swing, JavaFX & SWT 8
M JavaFX TableView nur erste Zeile editable machen und gelb markieren AWT, Swing, JavaFX & SWT 0
R javafx erste application AWT, Swing, JavaFX & SWT 12
L Die erste Grafikprogrammierung AWT, Swing, JavaFX & SWT 1
I Erste Desktop Software - blutiger Anfänger AWT, Swing, JavaFX & SWT 4
S Erste Schritte mit GUI - Fileverarbeitung, Listener,... AWT, Swing, JavaFX & SWT 10
Kenan89 Java FX GUI Hilfe für erste Java FX App AWT, Swing, JavaFX & SWT 8
M Swing Erste Schritte mit der GUI, viele Probleme AWT, Swing, JavaFX & SWT 36
J Das erste Projekt und ein Haufen von Fragen. Der SudokuReader. AWT, Swing, JavaFX & SWT 4
D Erste Knoten des JTrees bei Start offen AWT, Swing, JavaFX & SWT 8
H JTree - nach Auswahl aus JFileChooser wird nur der erste Knoten angezeigt AWT, Swing, JavaFX & SWT 3
dl85hej meine erste Oberfläche AWT, Swing, JavaFX & SWT 3
M Erstellen eines Hilfe-Fenster bzw"Erste-Schritte" AWT, Swing, JavaFX & SWT 2
S Erste Schritte mit SWING AWT, Swing, JavaFX & SWT 7
R Erste Schritte mit Swing AWT, Swing, JavaFX & SWT 3
E JTable nur die erste Spalte auswählbar? AWT, Swing, JavaFX & SWT 4
G JTable erste zeile fixieren wie in excel? AWT, Swing, JavaFX & SWT 3
H JTable - erste Schritte und Machbarkeitsüberlegung AWT, Swing, JavaFX & SWT 8
B JTable erste Zeile aktiv AWT, Swing, JavaFX & SWT 6
8 Installation von SWT und erste Schritte AWT, Swing, JavaFX & SWT 3
L Erste Spalte eines JTables soll nicht editierbar sein. AWT, Swing, JavaFX & SWT 7
MoxxiManagarm JavaFX Auch ich versuche mit JavaFX warm zu werden AWT, Swing, JavaFX & SWT 9
M Swing Data Binding und PropertyChangeSupport AWT, Swing, JavaFX & SWT 6
B SWT Frage zu MVC und Data-Binding AWT, Swing, JavaFX & SWT 8
Landei Swing Data Bindings AWT, Swing, JavaFX & SWT 4
A Flexible JTable mit editierbaren Zellen,abhängig von Data AWT, Swing, JavaFX & SWT 2
G Drag & Drop bzw. Data Transfer - Exception nach Drag AWT, Swing, JavaFX & SWT 1

Ähnliche Java Themen

Neue Themen


Oben