29 UIã³ã³ãããŒã«ã®ã«ã¹ã¿ãã€ãº
ãã®ç« ã§ã¯ãUIã³ã³ãããŒã«ã®ã«ã¹ã¿ãã€ãºã®ç¹åŸŽã«ã€ããŠèª¬æãããšãšãã«ãUIã³ã³ãããŒã«ã®å€èгãšåäœã倿Žããããã«çšæãããŠãããã³ãããã¯ããã¯ã®æŠèŠã瀺ããŸãã
Cascading Style Sheet (CSS)ã®é©çšãããã©ã«ãã®åäœã®åå®çŸ©ãããã³ã»ã«ã»ãã¡ã¯ããªã®äœ¿çšã«ãã£ãŠUIã³ã³ãããŒã«ã»ãµã³ãã«ã»ãããžã§ã¯ãå
ã®ãµã³ãã«ã»ã¢ããªã±ãŒã·ã§ã³ã®ã³ã³ãããŒã«ãã«ã¹ã¿ãã€ãºããæ¹æ³ã«ã€ããŠåŠç¿ã§ããŸãã javafx.scene.controlããã±ãŒãžã®ã¯ã©ã¹ã䜿çšããŠãå®è£
ã§ããªãç¹å¥ãªæ©èœãã¢ããªã±ãŒã·ã§ã³ã®ã¿ã¹ã¯ã«å¿
èŠã«ãªãç¹å®ã®ã±ãŒã¹ã«ã€ããŠã¯ãControlã¯ã©ã¹ãæ¡åŒµããŠç¬èªã®ã³ã³ãããŒã«ãäœæããŠãã ããã
CSSã®é©çš
JavaFX modenaã¹ã¿ã€ã«ã»ã·ãŒãã®ã¹ã¿ã€ã«å®çŸ©ãåå®çŸ©ããããšã«ãããUIã³ã³ãããŒã«ã®å€èгã倿Žã§ããŸãã ã¹ã¿ã€ã«ã倿ŽããŠJavaFXã¢ããªã±ãŒã·ã§ã³ã§æå¹ã«ããæ¹æ³ããã®äžè¬çãªæŠå¿µã¯ããCSSã«ããJavaFXã¢ããªã±ãŒã·ã§ã³ã®ã¹ããã³ã°ããåç
§ããŠãã ããã
JavaFXãã©ãŒã©ã ã§éçºè ã«ãã£ãŠé »ç¹ã«ãªã¯ãšã¹ããããç¹å®ã®ã¿ã¹ã¯ã«ã€ããŠèããŠã¿ãŸãã
Tooltipã¯ã©ã¹ã«ã¯ããŒã«ãããã®ããã©ã«ãã®è²ã倿Žããããã®ããããã£ãã¡ãœããã¯ãããŸããããäŸ29-1ã«ç€ºãããã«ã.tooltip CSSã¯ã©ã¹ã®-fx-background-colorã倿Žã§ããŸãã
äŸ29-1 ããŒã«ãããã®èæ¯è²ã®å€æŽ
.tooltip {
-fx-background-color: linear-gradient(#e2ecfe, #99bcfd);
}
.page-corner {
-fx-background-color: linear-gradient(from 0% 0% to 50% 50%,#3278fa,#99bcfd);
}
.page-corner CSSã¯ã©ã¹ã¯ãããŒã«ãããã®å³äžé
ã®è²ãå®çŸ©ããŸãã äŸ29-1ã®ã³ãŒããTooltipSampleã®ã¹ã¿ã€ã«ã»ã·ãŒãã«è¿œå ãããã®ã¹ã¿ã€ã«ã»ã·ãŒããã·ãŒã³ã«é©çšãããšãããŒã«ãããã®è²ã¯éã«å€æŽãããŸãã å³29-1ãåç
§ããŠãã®å¹æãè©äŸ¡ããŠãã ããã
å³29-1 éãèæ¯è²ã®ããŒã«ããã

ãå³29-1 éãèæ¯è²ã®ããŒã«ããããã®èª¬æ
ããŒã«ãããã®ããã©ã«ãã®ã¹ã¿ã€ã«ã倿Žãããšãæ°ããå€èгãã¢ããªã±ãŒã·ã§ã³å ã®ãã¹ãŠã®ããŒã«ãããã«é©çšãããããšã«æ³šæããŠãã ããã
ãã1ã€ã®äžè¬çãªèšèšã¿ã¹ã¯ãšããŠãã³ã³ãããŒã«ã®ããã©ã«ãã®ããŒã¯ã倿Žããã¿ã¹ã¯ããããŸãã ããšãã°ãCheckBoxã¯ã©ã¹ã®ããã©ã«ãã®ã¹ã¿ã€ã«ã¯ãéžæããç¶æ
ã®éåžžã®ãã§ãã¯ã»ããŒã¯ãå®çŸ©ããŸãã äŸ29-2ã«ç€ºãããã«ãããŒã¯ã®åœ¢ç¶ã®ã¿ã§ãªãè²ãåå®çŸ©ã§ããŸãã
äŸ29-2 å¥ã®ãã§ãã¯ã»ããã¯ã¹ã®ããŒã¯
.check-box .mark {
-fx-shape:
"M2,0L5,4L8,0L10,0L10,2L6,5L10,8L10,10L8,10L5,6L2,10L0,10L0,8L4,5L0,2L0,0Z";
}
.check-box:selected .mark {
-fx-background-color: #0181e2;
}
-fx-shapeããããã£ã¯ããŒã¯ã«æ°ããSVGãã¹ãèšå®ãã-fx-background-colorã¯ãã®è²ãå®çŸ©ããŸãã 倿Žããã¹ã¿ã€ã«ã»ã·ãŒããCheckBoxSampleã¢ããªã±ãŒã·ã§ã³ã§æå¹ã«ãããšãå³29-2ã«ç€ºãããã«ãéžæãããã§ãã¯ã»ããã¯ã¹ã«ã¯ãã§ãã¯ã»ããŒã¯ã®ãããã«XããŒã¯ã衚瀺ãããŸãã
å³29-2 倿Žãããã§ãã¯ã»ããã¯ã¹ã»ã¹ã¿ã€ã«ãé©çšãããComboBoxSample

ãå³29-2 倿Žãããã§ãã¯ã»ããã¯ã¹ã»ã¹ã¿ã€ã«ãé©çšãããComboBoxSampleãã®èª¬æ
å€ãã®éçºè
ãããTableViewããã³ListViewã³ã³ãããŒã«ã®èŠèŠã¹ã¿ã€ã«ã®å¶éãè¶
ããæ¹æ³ã«ã€ããŠã®è³ªåãå¯ããããŠããŸãã ããã©ã«ãã§ã¯ããããã®ã³ã³ãããŒã«ã®ãã¹ãŠã®è¡ã空ã§ãããã©ãããšã¯é¢ä¿ãªã衚瀺ãããŸãã é©åãªCSSèšå®ã䜿çšãããšã空ã®è¡ãã¹ãŠã«å¯ŸããŠç¹å®ã®è²ãèšå®ã§ããŸãã äŸ29-3ã§ã¯ããã®ã¿ã¹ã¯ãTableViewã³ã³ãããŒã«ã«å¯ŸããŠå®è£
ããŠããŸãã
äŸ29-3 衚ãã¥ãŒå ã®ç©ºã®è¡ã«å¯Ÿããè²ã®èšå®
.table-row-cell:empty {
-fx-background-color: lightyellow;
}
.table-row-cell:empty .table-cell {
-fx-border-width: 0px;
}
æåã®CSSã¹ã¿ã€ã«ã«ãããå¶æ°ãšå¥æ°ã®ã©ã¡ãã§ããããšã¯é¢ä¿ãªãã空ã®è¡ãã¹ãŠã®èæ¯è²ãæ·¡é»è²ã«ããããšã決å®ããŸãã table-row-cellãemptyã§ããå Žåã2çªç®ã®CSSæã«ããã衚ã®ã»ã«ãã¹ãŠã®å³åŽã«æç»ãããŠããçžŠã®æ ç·ãåé€ãããŸãã
äŸ29-3ã®CSSã¹ã¿ã€ã«ãTableViewSampleã¢ããªã±ãŒã·ã§ã³ã§æå¹ã«ãããšããAddress Bookã衚ã¯å³29-3ã®ããã«ãªããŸãã
å³29-3 空ã®è¡ã«è²ã远å ãããTableViewSample

ãå³29-3 空ã®è¡ã«è²ã远å ãããTableViewSampleãã®èª¬æ
空ã®ã»ã«ã®èæ¯è²ã«nullå€ãèšå®ããããšãã§ããŸãã ãã®å Žåãã¹ã¿ã€ã«ã»ã·ãŒãã§ã¯è¡šç€ºãã¥ãŒã®ããã©ã«ãã®èæ¯è²ã䜿çšãããŸãã å³29-4ãåç
§ããŠãã®å¹æãè©äŸ¡ããŠãã ããã
å³29-4 空ã®è¡ã«Nullã®èæ¯è²ã远å ãããTableViewSample

ãå³29-4 空ã®è¡ã«Nullã®èæ¯è²ã远å ãããTableViewSampleãã®èª¬æ
UIã³ã³ãããŒã«ã«CSSããããã£ã远å èšå®ããããšã«ããããã®åœ¢ç¶ãè²ã¹ããŒã ãããã³é©çšãã广ã倿Žã§ããŸãã 䜿çšå¯èœãªCSSã®ããããã£ããã³ã¯ã©ã¹ã®è©³çްã¯ãJavaFX CSSãªãã¡ã¬ã³ã¹ã»ã¬ã€ããåç §ããŠãã ããã
ããã©ã«ãã®åäœã®å€æŽ
å€ãã®éçºè ãããããã¹ãã»ãã£ãŒã«ãã§ã®å ¥åãå¶é(ããšãã°ãæ°å€ã®äœ¿çšã®ã¿ãèš±å¯)ã§ããç¹å®ã®APIããªã¯ãšã¹ããããŠããŸãã äŸ29-4ã«ãæ°å€ããã¹ãã»ãã£ãŒã«ããããåçŽãªã¢ããªã±ãŒã·ã§ã³ã瀺ããŸãã
äŸ29-4 ããã¹ãã»ãã£ãŒã«ãã§ã®æåã®çŠæ¢
import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.geometry.Insets;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.control.*;
import javafx.scene.layout.GridPane;
import javafx.stage.Stage;
public class CustomTextFieldSample extends Application {
final static Label label = new Label();
@Override
public void start(Stage stage) {
Group root = new Group();
Scene scene = new Scene(root, 300, 150);
stage.setScene(scene);
stage.setTitle("Text Field Sample");
GridPane grid = new GridPane();
grid.setPadding(new Insets(10, 10, 10, 10));
grid.setVgap(5);
grid.setHgap(5);
scene.setRoot(grid);
final Label dollar = new Label("$");
GridPane.setConstraints(dollar, 0, 0);
grid.getChildren().add(dollar);
final TextField sum = new TextField() {
@Override
public void replaceText(int start, int end, String text) {
if (!text.matches("[a-z, A-Z]")) {
super.replaceText(start, end, text);
}
label.setText("Enter a numeric value");
}
@Override
public void replaceSelection(String text) {
if (!text.matches("[a-z, A-Z]")) {
super.replaceSelection(text);
}
}
};
sum.setPrefColumnCount(10);
GridPane.setConstraints(sum, 1, 0);
grid.getChildren().add(sum);
Button submit = new Button("Submit");
GridPane.setConstraints(submit, 2, 0);
grid.getChildren().add(submit);
submit.setOnAction((ActionEvent e) -> {
label.setText(null);
});
GridPane.setConstraints(label, 0, 1);
GridPane.setColumnSpan(label, 3);
grid.getChildren().add(label);
scene.setRoot(grid);
stage.show();
}
public static void main(String[] args) {
launch(args);
}
}
TextFieldã¯ã©ã¹ã®ããã©ã«ãã®å®è£
ãåå®çŸ©ããã«ã¯ãTextInputControlã¯ã©ã¹ããç¶æ¿ãããreplaceTextããã³replaceSelectionã¡ãœããããªãŒããŒã©ã€ãããå¿
èŠããããŸãã
ãŠãŒã¶ãŒããSumãããã¹ãã»ãã£ãŒã«ãã«æåãå ¥åããããšãããšãèšå·ã¯è¡šç€ºããããèŠåã¡ãã»ãŒãžã衚瀺ãããŸãã å³29-5ã«ããã®ç¶æ³ã瀺ããŸãã
å³29-5 æåèšå·ãå ¥åããããšããå Žå

ãå³29-5 æåèšå·ãå ¥åããããšããå Žåãã®èª¬æ
ãã ãããŠãŒã¶ãŒãæ°å€ãå ¥åããããšãããšãå³29-6ã«ç€ºãããã«ããããã®æ°å€ããã£ãŒã«ãã«è¡šç€ºãããŸãã
ã»ã«ã»ãã¡ã¯ããªã®å®è£
ã»ã«ã»ãã¡ã¯ããªã®ã¡ã«ããºã ã䜿çšããããšã«ããã4ã€ã®UIã³ã³ãããŒã«ã®å€èгã®ã¿ã§ãªãåäœãå®å
šã«ã«ã¹ã¿ãã€ãºã§ããŸãã ã»ã«ã»ãã¡ã¯ããªã¯ãTableViewãListViewãTreeViewããã³ComboBoxã«é©çšã§ããŸãã ã»ã«ã»ãã¡ã¯ããªã䜿çšããŠããããã®ã³ã³ãããŒã«ã®åäžã®é
ç®ã衚ãããã«äœ¿çšã§ããã»ã«ã»ã€ã³ã¹ã¿ã³ã¹ãçæã§ããŸãã
Cellã¯ã©ã¹ã¯Labeledã¯ã©ã¹ãæ¡åŒµããŸãããã®ã¯ã©ã¹ã«ã¯ãããã¹ãã®è¡šç€ºãç·šéãšããæãäžè¬çãªãŠãŒã¹ã±ãŒã¹ãå®è£
ããããã«å¿
èŠãªããããã£ããã³ã¡ãœããããã¹ãŠçšæãããŠããŸãã ãã ããã¢ããªã±ãŒã·ã§ã³ã®ã¿ã¹ã¯äžããªã¹ããŸãã¯è¡šå
ã«ã°ã©ãã£ã«ã«ã»ãªããžã§ã¯ãã衚瀺ããããšãå¿
èŠã§ããå Žåãgraphicããããã£ã䜿çšããã»ã«å
ã«Nodeãé
眮ã§ããŸã(ã«ã¹ã¿ã ã»ã»ã«ã®è©³çްã¯ãã»ã«ã»ã¯ã©ã¹ã®API仿§ãåç
§ããŠãã ãã)ã
ããšãã°ãäŸ29-5ã®ã³ãŒãã»ãã©ã°ã¡ã³ãã§ã¯ããªã¹ãã»ãã¥ãŒã®ã»ã«ã»ãã¡ã¯ããªãäœæããupdateItemã¡ãœããå
ã®ã»ã«ã®ã³ã³ãã³ããåå®çŸ©ããããšã«ããããªã¹ãã®æ§ã
ãªè²ã®åè§åœ¢ã衚瀺ãããããã«ããŠããŸãã
äŸ29-5 ListViewã³ã³ãããŒã«ã®ã»ã«ã»ãã¡ã¯ããªã®å®è£
list.setCellFactory((ListView<String> l) -> new ColorRectCell());
...
static class ColorRectCell extends ListCell<String> {
@Override
public void updateItem(String item, boolean empty) {
super.updateItem(item, empty);
Rectangle rect = new Rectangle(100, 20);
if (item != null) {
rect.setFill(Color.web(item));
setGraphic(rect);
} else {
setGraphic(null);
}
}
}
å³29-7ã«ãã«ã¹ã¿ãã€ãºãããã®ãªã¹ããUIã³ã³ãããŒã«ã»ãµã³ãã«ã»ãããžã§ã¯ãã®ListViewSampleã§ã©ã®ããã«è¡šç€ºããããã瀺ããŸãã
å³29-7 æ§ã ãªè²ã®åè§åœ¢ã衚瀺ããããªã¹ãã»ãã¥ãŒ

ãå³29-7 æ§ã ãªè²ã®åè§åœ¢ã衚瀺ããããªã¹ãã»ãã¥ãŒãã®èª¬æ
ãã®ãã¥ãŒããªã¢ã«ã§ã¯ãã»ã«ã»ãã¡ã¯ããªã®ã¡ã«ããºã ãåºç¯å²ã«ããã£ãŠäœ¿çšããŠUIã³ã³ãããŒã«ãã«ã¹ã¿ãã€ãºããŸãã ãããã®ã³ã³ãããŒã«ãã«ã¹ã¿ãã€ãºããã«ã¯ãã»ã«ã»ãã¡ã¯ããªã®ã¡ã«ããºã ã䜿çšããããèŠèŠåã®åºç€ãšãªãç¹å®ã®ããŒã¿ã»ã¢ãã«ãæäŸããäºåäœææžã®ã»ã«ã»ãšãã£ã¿ã®å®è£ ã䜿çšã§ããŸãã 衚29-1ã«ãJavaFX APIã§äœ¿çšã§ãã察å¿ããã¯ã©ã¹ããªã¹ãããŸãã
衚29-1 ãªã¹ãã»ãã¥ãŒã»ã³ã³ãããŒã«ãããªãŒã»ãã¥ãŒã»ã³ã³ãããŒã«ããã³è¡šãã¥ãŒã»ã³ã³ãããŒã«ã®ã»ã«ã»ãšãã£ã¿ã»ã¯ã©ã¹
| ã³ã³ãããŒã« | ã»ã«ã»ãšãã£ã¿ã»ã¯ã©ã¹ |
|---|---|
|
ãªã¹ãã»ãã¥ãŒ |
|
|
ããªãŒã»ãã¥ãŒ |
|
|
衚ãã¥ãŒ |
|
|
ããªãŒè¡šãã¥ãŒ |
|
åã»ã«ã»ãšãã£ã¿ã»ã¯ã©ã¹ã«ãããã»ã«å
ã«ç¹å®ã®ããŒããæç»ãããŸãã ããšãã°ãCheckBoxListCellã¯ã©ã¹ã«ããããªã¹ãã»ã»ã«å
ã«CheckBoxããŒããæç»ãããŸãã
å¥ã®ã»ã«ã»ãã¡ã¯ããªãã»ã«ã»ãšãã£ã¿ã®ãŠãŒã¹ã±ãŒã¹ãè©äŸ¡ããã«ã¯ãã衚ãã¥ãŒãããããªãŒã»ãã¥ãŒãããã³ãã³ã³ãã»ããã¯ã¹ãã®åç« ãåç §ããŠãã ããã
é¢é£ããã¥ã¡ã³ããšãªãœãŒã¹


