質問編集履歴

3

参考URLを修正しました

2025/02/17 04:34

投稿

HSSHSK
HSSHSK

スコア9

test CHANGED
File without changes
test CHANGED
@@ -6,13 +6,12 @@
6
6
  ### 発生している問題・分からないこと
7
7
  ScrollPane配下ではないTextFieldはぼやけないが(図のA、B)、ScrollPane配下だとぼやける(図のC)。![イメージ説明](https://ddjkaamml8q8x.cloudfront.net/questions/2025-02-13/afb7aeef-fef4-453b-a69d-1d1e0665c83e.png)
8
8
  【参考】
9
- ScrollPane content becomes blurry after dragging
9
+ https://stackoverflow.com/questions/26098295/scrollpane-content-becomes-blurry-after-dragging
10
10
 
11
11
 
12
12
  ### エラーメッセージ
13
13
  ```error
14
14
  特にメッセージはありません。
15
- https://stackoverflow.com/questions/26098295/scrollpane-content-becomes-blurry-after-dragging
16
15
  ```
17
16
 
18
17
  ### 該当のソースコード

2

コードにコメントを付け加えました。

2025/02/16 15:46

投稿

HSSHSK
HSSHSK

スコア9

test CHANGED
File without changes
test CHANGED
@@ -97,7 +97,7 @@
97
97
  ap.setStyle("-fx-background-color:white;");
98
98
  base_sp.setContent(ap);
99
99
 
100
- //マウスクリックで図のBOXを何個も生成。
100
+ //ctrl + マウスクリックで図のBOXを何個も生成。
101
101
  ap.setOnMouseClicked(e -> {
102
102
  if (e.getButton() == MouseButton.PRIMARY && e.isControlDown()) {
103
103
  createBox(ap, e.getX(), e.getY());

1

アプリから問題の関連する箇所だけを抽出して簡略化したソースを追記しました。ポイントは動的にスクロールペインを追加することとarySclで追加を監視してCache(False)を試みたがダメだった点

2025/02/16 13:54

投稿

HSSHSK
HSSHSK

スコア9

test CHANGED
File without changes
test CHANGED
@@ -16,21 +16,205 @@
16
16
  ```
17
17
 
18
18
  ### 該当のソースコード
19
-
19
+ ### SampleFX11controller.java
20
- ```JavaFX
20
+ ```Java
21
- アプリの構成は次のようになっています。
21
+ package application;
22
+
23
+ import java.net.URL;
24
+ import java.util.ResourceBundle;
25
+
26
+ import javafx.collections.FXCollections;
27
+ import javafx.collections.ListChangeListener;
28
+ import javafx.collections.ObservableList;
29
+ import javafx.fxml.FXML;
30
+ import javafx.scene.control.MenuItem;
31
+ import javafx.scene.control.ScrollPane;
32
+ import javafx.scene.control.TextField;
33
+ import javafx.scene.input.MouseButton;
34
+ import javafx.scene.layout.AnchorPane;
35
+ import javafx.scene.layout.BorderPane;
36
+ import javafx.scene.layout.Pane;
37
+ import javafx.scene.layout.Region;
38
+ import javafx.scene.layout.VBox;
39
+
40
+ public class SampleFX11controller {
41
+
42
+
43
+ final ObservableList<ScrollPane> aryScl = FXCollections.observableArrayList();
44
+
22
- Pane
45
+ @FXML
46
+ private ResourceBundle resources;
47
+
48
+ @FXML
23
-  ├ TextField (図のA)
49
+ private URL location;
50
+
24
-  ├ VBox
51
+ @FXML
52
+ private MenuItem Menu_File_New;
53
+
54
+ @FXML
55
+ private BorderPane root;
56
+
57
+ @FXML
25
-  │  └ TextField (図のB)
58
+ void initialize() {
59
+ assert Menu_File_New != null : "fx:id=\"Menu_File_New\" was not injected: check your FXML file 'SampleFX11.fxml'.";
60
+ assert root != null : "fx:id=\"root\" was not injected: check your FXML file 'SampleFX11.fxml'.";
61
+
62
+ //メニュー File -> New でScrollPaneとその上にAnchorPaneを生成。
63
+ Menu_File_New.setOnAction(e -> {
26
-  └ ScrolePane
64
+ createBase();
27
-     └ VBox
65
+ });
66
+
67
+ //ScrollPaneの追加を監視して追加の都度setCache(False)を試みたが上手くいかない。
68
+ //System.out.println(aryScl.size()+" : "+scpn.lookup(".viewport")); => 件数 : 常にnull
69
+ //System.out.println("getChildrenUnmodifiable : "+scpn.getChildrenUnmodifiable().size()); => 常に0件
70
+ aryScl.addListener((ListChangeListener<ScrollPane>) change -> {
71
+ ScrollPane scpn = (ScrollPane)aryScl.get(aryScl.size() - 1);
72
+ System.out.println(aryScl.size()+" : "+scpn.lookup(".viewport"));
73
+ System.out.println("getChildrenUnmodifiable : "+scpn.getChildrenUnmodifiable().size());
74
+ if(scpn.lookup(".viewport") != null) {
75
+ scpn.lookup(".viewport").setCache(false);
76
+ }
77
+ });
78
+
79
+ }
80
+
81
+ //ここででScrollPaneとその上にAnchorPaneを生成。
82
+ void createBase() {
83
+ //一つ目のScrollPane(メニュー選択から動的に生成)。
84
+ ScrollPane base_sp = new ScrollPane();
85
+ base_sp.setMinSize(Region.USE_PREF_SIZE, Region.USE_PREF_SIZE);
86
+ base_sp.setPrefSize(550, 450);
87
+ base_sp.setMaxSize(Region.USE_COMPUTED_SIZE, Region.USE_COMPUTED_SIZE);
88
+ base_sp.setLayoutX(0);
89
+ base_sp.setLayoutY(50);
90
+ root.setCenter(base_sp);
91
+ aryScl.add(base_sp); //配列arySclにScrollPaneを追加。
92
+
93
+ AnchorPane ap = new AnchorPane();
94
+ ap.setMinSize(Region.USE_PREF_SIZE, Region.USE_PREF_SIZE);
95
+ ap.setPrefSize(1100, 900);
96
+ ap.setMaxSize(Region.USE_COMPUTED_SIZE, Region.USE_COMPUTED_SIZE);
97
+ ap.setStyle("-fx-background-color:white;");
98
+ base_sp.setContent(ap);
99
+
100
+ //マウスクリックで図のBOXを何個も生成。
101
+ ap.setOnMouseClicked(e -> {
102
+ if (e.getButton() == MouseButton.PRIMARY && e.isControlDown()) {
103
+ createBox(ap, e.getX(), e.getY());
104
+ }
105
+ });
106
+ }
107
+
108
+ void createBox(AnchorPane a, double x, double y) {
109
+
110
+ Pane box_p = new Pane();
111
+ box_p.setMinSize(Region.USE_PREF_SIZE, Region.USE_PREF_SIZE);
112
+ box_p.setPrefSize(80, 80);
113
+ box_p.setMaxSize(Region.USE_COMPUTED_SIZE, Region.USE_COMPUTED_SIZE);
114
+ box_p.setStyle("-fx-background-color:rgb(226, 241, 219);");
115
+ box_p.setLayoutX(x);
116
+ box_p.setLayoutY(y);
117
+ a.getChildren().add(box_p);
118
+
28
-        └ TextField (図のC)ここがぼやける。
119
+ TextField tx1 = new TextField();
120
+ tx1.setMinSize(Region.USE_PREF_SIZE, Region.USE_PREF_SIZE);
121
+ tx1.setPrefSize(80, 18);
122
+ tx1.setMaxSize(Region.USE_COMPUTED_SIZE, Region.USE_COMPUTED_SIZE);
123
+ tx1.setStyle("-fx-background-color:transparent;");
124
+ tx1.setText("TestA");
125
+ tx1.setLayoutX(0);
126
+ tx1.setLayoutY(0);
127
+
128
+ VBox vb1 = new VBox();
129
+ vb1.setMinSize(Region.USE_PREF_SIZE, Region.USE_PREF_SIZE);
130
+ vb1.setPrefSize(80, 18);
131
+ vb1.setMaxSize(Region.USE_COMPUTED_SIZE, Region.USE_COMPUTED_SIZE);
132
+ vb1.getStyleClass().add("vb");
133
+ vb1.setLayoutX(0);
134
+ vb1.setLayoutY(20);
135
+
136
+ TextField tx2 = new TextField();
137
+ tx2.setMinSize(Region.USE_PREF_SIZE, Region.USE_PREF_SIZE);
138
+ tx2.setPrefSize(80, 18);
139
+ tx2.setMaxSize(Region.USE_COMPUTED_SIZE, Region.USE_COMPUTED_SIZE);
140
+ tx2.setStyle("-fx-background-color:transparent;");
141
+ tx2.setText("TestB");
142
+ tx2.setLayoutX(0);
143
+ tx2.setLayoutY(0);
144
+ vb1.getChildren().add(tx2);
145
+
146
+ //複数のScrollPaneを動的に生成。
147
+ ScrollPane box_sp = new ScrollPane();
148
+ box_sp.setMinSize(Region.USE_PREF_SIZE, Region.USE_PREF_SIZE);
149
+ box_sp.setPrefSize(80, 40);
150
+ box_sp.setMaxSize(Region.USE_COMPUTED_SIZE, Region.USE_COMPUTED_SIZE);
151
+ box_sp.getStyleClass().add("bs");
152
+ box_sp.setLayoutX(0);
153
+ box_sp.setLayoutY(40);
154
+
155
+ VBox vb2 = new VBox();
156
+ vb2.setMinSize(Region.USE_PREF_SIZE, Region.USE_PREF_SIZE);
157
+ vb2.setPrefSize(80, 18);
158
+ vb2.setMaxSize(Region.USE_COMPUTED_SIZE, Region.USE_COMPUTED_SIZE);
159
+ vb2.setStyle("-fx-background-color:transparent;");
160
+ vb2.setLayoutX(0);
161
+ vb2.setLayoutY(0);
162
+ box_sp.setContent(vb2);
163
+
164
+ TextField tx3 = new TextField();
165
+ tx3.setMinSize(Region.USE_PREF_SIZE, Region.USE_PREF_SIZE);
166
+ tx3.setPrefSize(80, 18);
167
+ tx3.setMaxSize(Region.USE_COMPUTED_SIZE, Region.USE_COMPUTED_SIZE);
168
+ tx3.setStyle("-fx-background-color:transparent;");
169
+ tx3.setText("TestC");
170
+ tx3.setLayoutX(0);
171
+ tx3.setLayoutY(0);
172
+ vb2.getChildren().add(tx3);
173
+
174
+ box_p.getChildren().addAll(tx1, vb1, box_sp);
175
+ aryScl.add(box_sp); //配列arySclにScrollPaneを追加。
176
+
177
+ }
178
+
179
+ }
180
+ ```
181
+ ###Main.java
182
+ ```java
183
+ package application;
184
+
185
+ import javafx.application.Application;
186
+ import javafx.fxml.FXMLLoader;
187
+ import javafx.scene.Scene;
188
+ import javafx.scene.layout.BorderPane;
189
+ import javafx.stage.Stage;
190
+
191
+ public class Main extends Application {
192
+ @Override
193
+ public void start(Stage primaryStage) {
194
+ try {
195
+ BorderPane root = (BorderPane)FXMLLoader.load(getClass().getResource("SampleFX11.fxml"));
196
+ Scene scene = new Scene(root, 680, 400);
197
+ FXMLLoader loader = new FXMLLoader(this.getClass().getResource("Trial001.fxml"));
198
+ loader.setController(new SampleFX11controller());
199
+ scene.getStylesheets().add(getClass().getResource("application.css").toExternalForm());
200
+ primaryStage.setTitle("SampleFX11");
201
+ primaryStage.setScene(scene);
202
+ primaryStage.show();
203
+ } catch (Exception e) {
204
+ e.printStackTrace();
205
+ }
206
+ }
207
+
208
+ public static void main(String[] args) {
209
+ launch(args);
210
+ }
211
+ }
29
212
  ```
30
213
 
31
214
  ### 試したこと・調べたこと
32
215
  - [x] teratailやGoogle等で検索した
33
216
  - [x] ソースコードを自分なりに変更した
217
+    ⇒ リストarySclでスクロールペインの追加を監視してsetCache(False)を試みたがダメだった。
34
218
  - [ ] 知人に聞いた
35
219
  - [ ] その他
36
220