Last active
December 10, 2015 01:58
-
-
Save aoetk/4363405 to your computer and use it in GitHub Desktop.
JavaFXバインディングのサンプル
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package aoetk.bindingsample; | |
import javafx.application.Application; | |
import javafx.fxml.FXMLLoader; | |
import javafx.scene.Parent; | |
import javafx.scene.Scene; | |
import javafx.stage.Stage; | |
/** | |
* バインディングのサンプルアプリケーション。 | |
* @author aoetk | |
*/ | |
public class BindingSample extends Application { | |
@Override | |
public void start(Stage stage) throws Exception { | |
Parent root = FXMLLoader.load(getClass().getResource("Sample.fxml")); | |
Scene scene = new Scene(root); | |
stage.setScene(scene); | |
stage.show(); | |
} | |
/** | |
* メインメソッド。 | |
* @param args the command line arguments | |
*/ | |
public static void main(String[] args) { | |
launch(args); | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package aoetk.bindingsample.model; | |
import javafx.beans.InvalidationListener; | |
import javafx.beans.Observable; | |
import javafx.beans.property.ReadOnlyStringProperty; | |
import javafx.beans.property.ReadOnlyStringPropertyBase; | |
import javafx.beans.property.SimpleStringProperty; | |
import javafx.beans.property.StringProperty; | |
/** | |
* モデルの例。 | |
* @author aoetk | |
*/ | |
public class Person { | |
// nameプロパティ | |
private StringProperty name = new SimpleStringProperty(); | |
// 外部に公開するプロパティ | |
public StringProperty nameProperty() { | |
return name; | |
} | |
// JavaBeans仕様と互換を持たせるためのgetter、setter | |
public final String getName() { | |
return name.get(); | |
} | |
public final void setName(String name) { | |
this.name.set(name); | |
} | |
// messageプロパティ (read only) | |
private ReadOnlyStringProperty message = new ReadOnlyStringPropertyBase() { | |
{ | |
name.addListener(new InvalidationListener() { | |
// nameプロパティの変化を観察し、変化したらこのプロパティも値が変化したことを通知する | |
@Override | |
public void invalidated(Observable o) { | |
fireValueChangedEvent(); | |
} | |
}); | |
} | |
@Override | |
public String get() { | |
String value = Person.this.getName(); | |
if (value.length() > 0) { | |
return "Hello I'm " + value + "."; | |
} else { | |
return ""; | |
} | |
} | |
@Override | |
public Object getBean() { | |
return Person.this; | |
} | |
@Override | |
public String getName() { | |
return "message"; | |
} | |
}; | |
// 外部に公開するプロパティ | |
public ReadOnlyStringProperty messageProperty() { | |
return message; | |
} | |
// JavaBeans仕様と互換を持たせるためのgetter | |
public final String getMessage() { | |
return message.get(); | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package aoetk.bindingsample.model; | |
import static org.hamcrest.CoreMatchers.*; | |
import static org.junit.Assert.*; | |
import org.junit.Before; | |
import org.junit.Test; | |
/** | |
* Personのテストコード | |
* @author aoetk | |
*/ | |
public class PersonTest { | |
private Person person; | |
@Before | |
public void setUp() { | |
person = new Person(); | |
} | |
@Test | |
public void noName() { | |
person.setName(""); | |
assertThat(person.getMessage(), is("")); | |
assertThat(person.messageProperty().get(), is("")); | |
} | |
@Test | |
public void oneWordName() { | |
person.setName("a"); | |
assertThat(person.getMessage(), is("Hello I'm a.")); | |
assertThat(person.messageProperty().get(), is("Hello I'm a.")); | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?xml version="1.0" encoding="UTF-8"?> | |
<?import java.lang.*?> | |
<?import java.util.*?> | |
<?import javafx.scene.*?> | |
<?import javafx.scene.control.*?> | |
<?import javafx.scene.layout.*?> | |
<AnchorPane id="AnchorPane" prefHeight="200.0" prefWidth="320.0" xmlns:fx="http://javafx.com/fxml" fx:controller="aoetk.bindingsample.SampleController"> | |
<children> | |
<Label layoutX="35.0" layoutY="31.0" text="Your name" /> | |
<TextField fx:id="txtName" layoutX="129.0" layoutY="28.0" prefWidth="177.0" /> | |
<Label fx:id="name" layoutX="35.0" layoutY="133.0" /> | |
<Label fx:id="message" layoutX="129.0" layoutY="133.0" /> | |
</children> | |
</AnchorPane> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package aoetk.bindingsample; | |
import java.net.URL; | |
import java.util.ResourceBundle; | |
import aoetk.bindingsample.model.Person; | |
import javafx.event.ActionEvent; | |
import javafx.fxml.FXML; | |
import javafx.fxml.Initializable; | |
import javafx.scene.control.Label; | |
import javafx.scene.control.TextField; | |
/** | |
* コントローラの例。 | |
* @author aoetk | |
*/ | |
public class SampleController implements Initializable { | |
@FXML | |
private TextField txtName; | |
@FXML | |
private Label name; | |
@FXML | |
private Label message; | |
private Person person; | |
// 初期化時に必要なバインドを行う | |
@Override | |
public void initialize(URL url, ResourceBundle rb) { | |
person = new Person(); | |
person.nameProperty().bind(txtName.textProperty()); | |
name.textProperty().bind(person.nameProperty()); | |
message.textProperty().bind(person.messageProperty()); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment