回答編集履歴

5

驚くべき手法

2025/02/17 05:29

投稿

TN8001
TN8001

スコア9937

test CHANGED
@@ -139,3 +139,18 @@
139
139
  [event handling - How to listen for WindowEvent.WINDOW_SHOWN in the nodes of the scene graph? - Stack Overflow](https://stackoverflow.com/questions/8944445)
140
140
 
141
141
  [java - JavaFX 2 Window event handling in controllers - Stack Overflow](https://stackoverflow.com/questions/21602362)
142
+
143
+ ---
144
+
145
+ > 何か手がないかOpenJFXのソースをつらつら眺めていたら、目からうろこの驚くべき手法を発見しましたっ!!🤩
146
+
147
+ このように`setSkin`すれば、表示を待たずとも`viewport`が作成されます。
148
+
149
+ ```java
150
+ ScrollPane box_sp = new ScrollPane();
151
+ box_sp.setSkin(new ScrollPaneSkin(box_sp));
152
+ box_sp.lookup(".viewport").setCache(false);
153
+ ```
154
+
155
+ [ScrollPaneSkin.java · openjdk/jfx](https://github.com/openjdk/jfx/blob/d07d5cc684e68615fd0cec154a4e4c18810af1eb/modules/javafx.controls/src/main/java/javafx/scene/control/skin/ScrollPaneSkin.java#L655)
156
+

4

runLater

2025/02/16 03:59

投稿

TN8001
TN8001

スコア9937

test CHANGED
@@ -104,6 +104,10 @@
104
104
  scrollPane.lookup(".viewport").setCache(false);
105
105
  });
106
106
  });
107
+
108
+
109
+ // 手元ではこれだけで行けたがそれでいいのかは知らんw
110
+ // Platform.runLater(() -> scrollPane.lookup(".viewport").setCache(false));
107
111
  }
108
112
  }
109
113
  ```

3

FXML版

2025/02/16 03:19

投稿

TN8001
TN8001

スコア9937

test CHANGED
@@ -47,3 +47,91 @@
47
47
  }
48
48
  }
49
49
  ```
50
+
51
+ ---
52
+
53
+ FXML版
54
+
55
+ ```xml
56
+ <?xml version="1.0" encoding="UTF-8"?>
57
+
58
+ <?import javafx.scene.control.*?>
59
+ <?import javafx.scene.layout.*?>
60
+
61
+ <Pane fx:id="root" xmlns="http://javafx.com/javafx/17.0.12" xmlns:fx="http://javafx.com/fxml/1"
62
+ fx:controller="com.example.demo.HelloController">
63
+ <TextField layoutX="0.5" text="TextFieldA"/>
64
+ <VBox layoutX="0.5" layoutY="50.0">
65
+ <TextField text="TextFieldB"/>
66
+ </VBox>
67
+ <ScrollPane fx:id="scrollPane" layoutX="0.5" layoutY="100.0">
68
+ <VBox>
69
+ <TextField text="TextFieldC"/>
70
+ </VBox>
71
+ </ScrollPane>
72
+ </Pane>
73
+ ```
74
+ ```java
75
+ package com.example.demo;
76
+
77
+ import javafx.beans.binding.Bindings;
78
+ import javafx.fxml.FXML;
79
+ import javafx.scene.control.ScrollPane;
80
+ import javafx.scene.layout.Pane;
81
+ import javafx.stage.Window;
82
+ import javafx.stage.WindowEvent;
83
+
84
+ public class HelloController {
85
+ @FXML private Pane root;
86
+ @FXML private ScrollPane scrollPane;
87
+
88
+ @FXML void initialize() {
89
+ // どちらかひとつでいい
90
+
91
+ // [event handling - How to listen for WindowEvent.WINDOW_SHOWN in the nodes of the scene graph? - Stack Overflow](https://stackoverflow.com/questions/8944445)
92
+ root.sceneProperty().addListener((observable, oldValue, newValue) -> {
93
+ newValue.windowProperty().addListener((observable1, oldValue1, newValue1) -> {
94
+ newValue1.addEventHandler(WindowEvent.WINDOW_SHOWN, event -> {
95
+ scrollPane.lookup(".viewport").setCache(false);
96
+ });
97
+ });
98
+ });
99
+
100
+ // [java - JavaFX 2 Window event handling in controllers - Stack Overflow](https://stackoverflow.com/questions/21602362)
101
+ Bindings.<Window>select(root.sceneProperty(), "window")
102
+ .addListener((observable, oldValue, newValue) -> {
103
+ newValue.addEventHandler(WindowEvent.WINDOW_SHOWN, event -> {
104
+ scrollPane.lookup(".viewport").setCache(false);
105
+ });
106
+ });
107
+ }
108
+ }
109
+ ```
110
+ ```java
111
+ package com.example.demo;
112
+
113
+ import javafx.application.Application;
114
+ import javafx.fxml.FXMLLoader;
115
+ import javafx.scene.Scene;
116
+ import javafx.stage.Stage;
117
+
118
+ import java.io.IOException;
119
+
120
+ public class HelloApplication extends Application {
121
+ public static void main(String[] args) {
122
+ launch();
123
+ }
124
+
125
+ @Override public void start(Stage stage) throws IOException {
126
+ FXMLLoader fxmlLoader = new FXMLLoader(HelloApplication.class.getResource("hello-view.fxml"));
127
+ Scene scene = new Scene(fxmlLoader.load(), 320, 240);
128
+ stage.setTitle("Hello!");
129
+ stage.setScene(scene);
130
+ stage.show();
131
+ }
132
+ }
133
+ ```
134
+
135
+ [event handling - How to listen for WindowEvent.WINDOW_SHOWN in the nodes of the scene graph? - Stack Overflow](https://stackoverflow.com/questions/8944445)
136
+
137
+ [java - JavaFX 2 Window event handling in controllers - Stack Overflow](https://stackoverflow.com/questions/21602362)

2

中途半端な位置に追加が原因ならCSSでは対策しようがないか...?

2025/02/14 10:27

投稿

TN8001
TN8001

スコア9937

test CHANGED
@@ -47,5 +47,3 @@
47
47
  }
48
48
  }
49
49
  ```
50
-
51
- CSSだけで済むようなもっとスマートな方法もある気もしますが、わたしは深堀する気はないですw

1

不要クラス

2025/02/14 10:04

投稿

TN8001
TN8001

スコア9937

test CHANGED
@@ -17,35 +17,33 @@
17
17
  import javafx.scene.layout.VBox;
18
18
  import javafx.stage.Stage;
19
19
 
20
- public class Main {
20
+ public class App extends Application {
21
21
  public static void main(String[] args) {
22
22
  Application.launch(App.class, args);
23
23
  }
24
24
 
25
- public static class App extends Application {
26
- @Override public void start(Stage primaryStage) {
25
+ @Override public void start(Stage primaryStage) {
27
26
 
28
- // 整数ならsetCacheにかかわらずボケない?
27
+ // 整数ならsetCacheにかかわらずボケない?
29
- // var x = 5;
28
+ // var x = 5;
30
- var x = 0.5;
29
+ var x = 0.5;
31
30
 
32
- var textField = new TextField("TextFieldA");
31
+ var textField = new TextField("TextFieldA");
33
- textField.setLayoutX(x);
32
+ textField.setLayoutX(x);
34
33
 
35
- var vBox = new VBox(new TextField("TextFieldB"));
34
+ var vBox = new VBox(new TextField("TextFieldB"));
36
- vBox.setLayoutX(x);
35
+ vBox.setLayoutX(x);
37
- vBox.setLayoutY(50);
36
+ vBox.setLayoutY(50);
38
37
 
39
- var scrollPane = new ScrollPane(new VBox(new TextField("TextFieldC")));
38
+ var scrollPane = new ScrollPane(new VBox(new TextField("TextFieldC")));
40
- scrollPane.setLayoutX(x);
39
+ scrollPane.setLayoutX(x);
41
- scrollPane.setLayoutY(100);
40
+ scrollPane.setLayoutY(100);
42
41
 
43
- primaryStage.setScene(new Scene(new Pane(textField, vBox, scrollPane)));
42
+ primaryStage.setScene(new Scene(new Pane(textField, vBox, scrollPane)));
44
- primaryStage.show();
43
+ primaryStage.show();
45
44
 
46
45
 
47
- scrollPane.lookup(".viewport").setCache(false);
46
+ scrollPane.lookup(".viewport").setCache(false);
48
- }
49
47
  }
50
48
  }
51
49
  ```