質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.33%
JavaFX

JavaFXとは、Java仮想マシン上で動作するリッチインターネットアプリケーション (RIA) のGUIライブラリです。Swingとは異なり、FXMLと呼ばれる XMLとCSSを併用してデザインを記述します。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

2回答

441閲覧

JavaFX上のテキストがぼやける

HSSHSK

総合スコア9

JavaFX

JavaFXとは、Java仮想マシン上で動作するリッチインターネットアプリケーション (RIA) のGUIライブラリです。Swingとは異なり、FXMLと呼ばれる XMLとCSSを併用してデザインを記述します。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

2グッド

0クリップ

投稿2025/02/13 05:36

編集2025/02/17 04:34

実現したいこと

現在JavaFXでドロー系アプリを開発しています。
ScrollPane配下にgetContentでVBoxを設定しそのさらに配下にTextFieldを設定していますが文字がぼやけています。調べてみるとJavaFXのバグだそうですが、stackoverflowなどでは解決策として、ScrollPaneの配下のviewportをSetCache(false)にすると解決するようですが、そもそもJava上でviewpointを取得できません。
ぼやけを解消する良い考え方がありましたら教えてください。

発生している問題・分からないこと

ScrollPane配下ではないTextFieldはぼやけないが(図のA、B)、ScrollPane配下だとぼやける(図のC)。イメージ説明
【参考】
https://stackoverflow.com/questions/26098295/scrollpane-content-becomes-blurry-after-dragging

エラーメッセージ

error

1特にメッセージはありません。

該当のソースコード

SampleFX11controller.java

Java

1package application; 2 3import java.net.URL; 4import java.util.ResourceBundle; 5 6import javafx.collections.FXCollections; 7import javafx.collections.ListChangeListener; 8import javafx.collections.ObservableList; 9import javafx.fxml.FXML; 10import javafx.scene.control.MenuItem; 11import javafx.scene.control.ScrollPane; 12import javafx.scene.control.TextField; 13import javafx.scene.input.MouseButton; 14import javafx.scene.layout.AnchorPane; 15import javafx.scene.layout.BorderPane; 16import javafx.scene.layout.Pane; 17import javafx.scene.layout.Region; 18import javafx.scene.layout.VBox; 19 20public class SampleFX11controller { 21 22 23 final ObservableList<ScrollPane> aryScl = FXCollections.observableArrayList(); 24 25 @FXML 26 private ResourceBundle resources; 27 28 @FXML 29 private URL location; 30 31 @FXML 32 private MenuItem Menu_File_New; 33 34 @FXML 35 private BorderPane root; 36 37 @FXML 38 void initialize() { 39 assert Menu_File_New != null : "fx:id=\"Menu_File_New\" was not injected: check your FXML file 'SampleFX11.fxml'."; 40 assert root != null : "fx:id=\"root\" was not injected: check your FXML file 'SampleFX11.fxml'."; 41 42 //メニュー File -> New でScrollPaneとその上にAnchorPaneを生成。 43 Menu_File_New.setOnAction(e -> { 44 createBase(); 45 }); 46 47 //ScrollPaneの追加を監視して追加の都度setCache(False)を試みたが上手くいかない。 48 //System.out.println(aryScl.size()+" : "+scpn.lookup(".viewport")); => 件数 : 常にnull 49 //System.out.println("getChildrenUnmodifiable : "+scpn.getChildrenUnmodifiable().size()); => 常に0件 50 aryScl.addListener((ListChangeListener<ScrollPane>) change -> { 51 ScrollPane scpn = (ScrollPane)aryScl.get(aryScl.size() - 1); 52 System.out.println(aryScl.size()+" : "+scpn.lookup(".viewport")); 53 System.out.println("getChildrenUnmodifiable : "+scpn.getChildrenUnmodifiable().size()); 54 if(scpn.lookup(".viewport") != null) { 55 scpn.lookup(".viewport").setCache(false); 56 } 57 }); 58 59 } 60 61 //ここででScrollPaneとその上にAnchorPaneを生成。 62 void createBase() { 63 //一つ目のScrollPane(メニュー選択から動的に生成)。 64 ScrollPane base_sp = new ScrollPane(); 65 base_sp.setMinSize(Region.USE_PREF_SIZE, Region.USE_PREF_SIZE); 66 base_sp.setPrefSize(550, 450); 67 base_sp.setMaxSize(Region.USE_COMPUTED_SIZE, Region.USE_COMPUTED_SIZE); 68 base_sp.setLayoutX(0); 69 base_sp.setLayoutY(50); 70 root.setCenter(base_sp); 71 aryScl.add(base_sp); //配列arySclにScrollPaneを追加。 72 73 AnchorPane ap = new AnchorPane(); 74 ap.setMinSize(Region.USE_PREF_SIZE, Region.USE_PREF_SIZE); 75 ap.setPrefSize(1100, 900); 76 ap.setMaxSize(Region.USE_COMPUTED_SIZE, Region.USE_COMPUTED_SIZE); 77 ap.setStyle("-fx-background-color:white;"); 78 base_sp.setContent(ap); 79 80 //ctrl + マウスクリックで図のBOXを何個も生成。 81 ap.setOnMouseClicked(e -> { 82 if (e.getButton() == MouseButton.PRIMARY && e.isControlDown()) { 83 createBox(ap, e.getX(), e.getY()); 84 } 85 }); 86 } 87 88 void createBox(AnchorPane a, double x, double y) { 89 90 Pane box_p = new Pane(); 91 box_p.setMinSize(Region.USE_PREF_SIZE, Region.USE_PREF_SIZE); 92 box_p.setPrefSize(80, 80); 93 box_p.setMaxSize(Region.USE_COMPUTED_SIZE, Region.USE_COMPUTED_SIZE); 94 box_p.setStyle("-fx-background-color:rgb(226, 241, 219);"); 95 box_p.setLayoutX(x); 96 box_p.setLayoutY(y); 97 a.getChildren().add(box_p); 98 99 TextField tx1 = new TextField(); 100 tx1.setMinSize(Region.USE_PREF_SIZE, Region.USE_PREF_SIZE); 101 tx1.setPrefSize(80, 18); 102 tx1.setMaxSize(Region.USE_COMPUTED_SIZE, Region.USE_COMPUTED_SIZE); 103 tx1.setStyle("-fx-background-color:transparent;"); 104 tx1.setText("TestA"); 105 tx1.setLayoutX(0); 106 tx1.setLayoutY(0); 107 108 VBox vb1 = new VBox(); 109 vb1.setMinSize(Region.USE_PREF_SIZE, Region.USE_PREF_SIZE); 110 vb1.setPrefSize(80, 18); 111 vb1.setMaxSize(Region.USE_COMPUTED_SIZE, Region.USE_COMPUTED_SIZE); 112 vb1.getStyleClass().add("vb"); 113 vb1.setLayoutX(0); 114 vb1.setLayoutY(20); 115 116 TextField tx2 = new TextField(); 117 tx2.setMinSize(Region.USE_PREF_SIZE, Region.USE_PREF_SIZE); 118 tx2.setPrefSize(80, 18); 119 tx2.setMaxSize(Region.USE_COMPUTED_SIZE, Region.USE_COMPUTED_SIZE); 120 tx2.setStyle("-fx-background-color:transparent;"); 121 tx2.setText("TestB"); 122 tx2.setLayoutX(0); 123 tx2.setLayoutY(0); 124 vb1.getChildren().add(tx2); 125 126 //複数のScrollPaneを動的に生成。 127 ScrollPane box_sp = new ScrollPane(); 128 box_sp.setMinSize(Region.USE_PREF_SIZE, Region.USE_PREF_SIZE); 129 box_sp.setPrefSize(80, 40); 130 box_sp.setMaxSize(Region.USE_COMPUTED_SIZE, Region.USE_COMPUTED_SIZE); 131 box_sp.getStyleClass().add("bs"); 132 box_sp.setLayoutX(0); 133 box_sp.setLayoutY(40); 134 135 VBox vb2 = new VBox(); 136 vb2.setMinSize(Region.USE_PREF_SIZE, Region.USE_PREF_SIZE); 137 vb2.setPrefSize(80, 18); 138 vb2.setMaxSize(Region.USE_COMPUTED_SIZE, Region.USE_COMPUTED_SIZE); 139 vb2.setStyle("-fx-background-color:transparent;"); 140 vb2.setLayoutX(0); 141 vb2.setLayoutY(0); 142 box_sp.setContent(vb2); 143 144 TextField tx3 = new TextField(); 145 tx3.setMinSize(Region.USE_PREF_SIZE, Region.USE_PREF_SIZE); 146 tx3.setPrefSize(80, 18); 147 tx3.setMaxSize(Region.USE_COMPUTED_SIZE, Region.USE_COMPUTED_SIZE); 148 tx3.setStyle("-fx-background-color:transparent;"); 149 tx3.setText("TestC"); 150 tx3.setLayoutX(0); 151 tx3.setLayoutY(0); 152 vb2.getChildren().add(tx3); 153 154 box_p.getChildren().addAll(tx1, vb1, box_sp); 155 aryScl.add(box_sp); //配列arySclにScrollPaneを追加。 156 157 } 158 159}

###Main.java

java

1package application; 2 3import javafx.application.Application; 4import javafx.fxml.FXMLLoader; 5import javafx.scene.Scene; 6import javafx.scene.layout.BorderPane; 7import javafx.stage.Stage; 8 9public class Main extends Application { 10 @Override 11 public void start(Stage primaryStage) { 12 try { 13 BorderPane root = (BorderPane)FXMLLoader.load(getClass().getResource("SampleFX11.fxml")); 14 Scene scene = new Scene(root, 680, 400); 15 FXMLLoader loader = new FXMLLoader(this.getClass().getResource("Trial001.fxml")); 16 loader.setController(new SampleFX11controller()); 17 scene.getStylesheets().add(getClass().getResource("application.css").toExternalForm()); 18 primaryStage.setTitle("SampleFX11"); 19 primaryStage.setScene(scene); 20 primaryStage.show(); 21 } catch (Exception e) { 22 e.printStackTrace(); 23 } 24 } 25 26 public static void main(String[] args) { 27 launch(args); 28 } 29}

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した

   ⇒ リストarySclでスクロールペインの追加を監視してsetCache(False)を試みたがダメだった。

  • 知人に聞いた
  • その他
上記の詳細・結果

viewportがJava上で取得できないし、そもそもviewportをsetCache(false)にすることが解決策かもわからない。

補足

Liberica Standard JDK 21.0.6+10 x86 64 for Windows
※)JavaFXが同梱されている。
Windows11

TN8001😄を押しています
TN8001👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

TN8001

2025/02/13 10:53

参考URLはリンクにしてください。 [ヘルプ|対応しているMarkdownの記法を知りたい](https://teratail.com/help#about-markdown) [java - ScrollPane content becomes blurry after dragging - Stack Overflow](https://stackoverflow.com/questions/26098295) > 該当のソースコード fxmlかJavaコードを提示いただいたほうがいいと思います。 > Windows11 こちらの手元では再現できないんですが、高DPIだったりしますか? 過去にはそういった問題があったようですが、まだ直っていないってことなんですかね?? [[JDK-8211294] ScrollPane content is blurry with 125% scaling - Java Bug System](https://bugs.openjdk.org/browse/JDK-8211294?jql=component%20%3D%20javafx%20AND%20text%20~%20%22scrollpane%20blurry%22) これも関連かな? [java - Blurred text in JavaFX TextArea - Stack Overflow](https://stackoverflow.com/questions/23728517)
HSSHSK

2025/02/14 01:40

早速の回答ありがとうございます。 提示いただいたurlはすべて見ました。情報自体10年くらいのもので、特に [[JDK-8211294] ScrollPane content is blurry with 125% scaling - Java Bug System] はバグがfixの扱いになっていますが依然として表示されてしまいます。 PCは特に高DPIではないと思います。⇒ 120 添付の図はアプリの中で動的に生成するので、FXMLはありません、またソースは複雑になりすぎるので添付しませんでした。すみません。
TN8001

2025/02/14 02:44

参考URLはリンクになるように、質問を編集してください。 質問はいつでも何度でも編集できます^^ > 添付の図はアプリの中で動的に生成するので、FXMLはありません、またソースは複雑になりすぎるので添付しませんでした。 なるほど。実アプリ上でしか確認はしていないのですね(こちらで再現しないのも納得です) 動的に作っているとその直後にはgetChildrenUnmodifiableとかは、まだ準備できていないのかもしれませんね。 runLaterでワンテンポ遅らせると動いたとの記述があります。 [java - Blurred text in JavaFX TextArea - Stack Overflow](https://stackoverflow.com/questions/23728517#comment63385514_31622654) でもめんどくさいし、cssだけで解決できないのかなぁ??
jimbe

2025/02/14 03:01

>添付の図はアプリの中で動的に生成するので、FXMLはありません、またソースは複雑になりすぎるので添付しませんでした 無ければ作ってみるとか、複雑なら簡単にしたテストプログラムを作ってみるとかが必要でしょう、 デバッグは慣れていないと目の前のモノのみでどうにかしようとしてしまいますが、もしかしたらその『動的に生成』や『複雑』の中に問題があるのかもしれないので、状況を再現する為だけの極小さなプログラムを別に作って確認するのも手法です。 小さなプログラムで再現すれば元のプログラムの動的や複雑は関係無いと証明されますし、ここに公開も出来るでしょうし、小さい分調べる必要の有る箇所も少ないでしょう。 逆に小さいプログラムで再現しなければ、動的とか複雑の中に問題がある可能性が出てきます。今行っている調査は的外れかもしれません。
shiketa

2025/02/14 04:17

> 添付の図はアプリの中で動的に生成するので、FXMLはありません、またソースは複雑になりすぎるので添付しませんでした。すみません。 なんだろ。そんなにめんどうくさがらずに提示したらいいのに。 こんなかんじですよね。 ```java import javafx.application.Application; import javafx.scene.Scene; import javafx.scene.control.*; import javafx.scene.layout.VBox; import javafx.stage.Stage; public class Main { public static void main(String[] args) throws Exception { Application.launch(App.class, args); } public static class App extends Application { @Override public void start(Stage primaryStage) throws Exception { primaryStage.setScene(new Scene(new VBox(new Label("textA"), new TextField("TextFieldA"), new VBox(new Label("textB"), new TextField("TextFieldB")), new ScrollPane(new VBox(new Label("textC"), new TextField("TextFieldC")))))); primaryStage.show(); } } } ```
HSSHSK

2025/02/16 15:49

簡単なソースを作りました。 File => Newで台紙を開く。 台紙上でctrl+マウスクリックでオブジェクト生成。 台紙とオブジェクトにスクロールペインがある。 スクロールペインが作成される都度、System.out.printlnでスクロールペインの子ノードの状態が表示される。 以上です。
TN8001

2025/02/17 05:28

> 参考URLはリンクにしてください。 対応ありがとうございます^^
shiketa

2025/02/17 05:34

わたしはこれいじょう手をだすことはしませんが。 提示されたMain.javaで参照している SampleFX11.fxml, Trial001.fxml, application.css の三つのファイルも提示されなければ、このあと検証してくれる方は困るとおもいます。せっかく提示されたソースですが、これらがなければ手元で再現できませんので。
guest

回答2

0

ベストアンサー

再現できました^^

小数点のある位置に追加すると、TextFieldCだけボケました。
クリック座標に追加等の処理があるんでしょうか?

  • なにもしない
    アプリ画像 ボケる
  • setCache(false)
    アプリ画像 ボケない

java

1import javafx.application.Application; 2import javafx.scene.Scene; 3import javafx.scene.control.ScrollPane; 4import javafx.scene.control.TextField; 5import javafx.scene.layout.Pane; 6import javafx.scene.layout.VBox; 7import javafx.stage.Stage; 8 9public class App extends Application { 10 public static void main(String[] args) { 11 Application.launch(App.class, args); 12 } 13 14 @Override public void start(Stage primaryStage) { 15 16 // 整数ならsetCacheにかかわらずボケない? 17 // var x = 5; 18 var x = 0.5; 19 20 var textField = new TextField("TextFieldA"); 21 textField.setLayoutX(x); 22 23 var vBox = new VBox(new TextField("TextFieldB")); 24 vBox.setLayoutX(x); 25 vBox.setLayoutY(50); 26 27 var scrollPane = new ScrollPane(new VBox(new TextField("TextFieldC"))); 28 scrollPane.setLayoutX(x); 29 scrollPane.setLayoutY(100); 30 31 primaryStage.setScene(new Scene(new Pane(textField, vBox, scrollPane))); 32 primaryStage.show(); 33 34 35 scrollPane.lookup(".viewport").setCache(false); 36 } 37}

FXML版

xml

1<?xml version="1.0" encoding="UTF-8"?> 2 3<?import javafx.scene.control.*?> 4<?import javafx.scene.layout.*?> 5 6<Pane fx:id="root" xmlns="http://javafx.com/javafx/17.0.12" xmlns:fx="http://javafx.com/fxml/1" 7 fx:controller="com.example.demo.HelloController"> 8 <TextField layoutX="0.5" text="TextFieldA"/> 9 <VBox layoutX="0.5" layoutY="50.0"> 10 <TextField text="TextFieldB"/> 11 </VBox> 12 <ScrollPane fx:id="scrollPane" layoutX="0.5" layoutY="100.0"> 13 <VBox> 14 <TextField text="TextFieldC"/> 15 </VBox> 16 </ScrollPane> 17</Pane>

java

1package com.example.demo; 2 3import javafx.beans.binding.Bindings; 4import javafx.fxml.FXML; 5import javafx.scene.control.ScrollPane; 6import javafx.scene.layout.Pane; 7import javafx.stage.Window; 8import javafx.stage.WindowEvent; 9 10public class HelloController { 11 @FXML private Pane root; 12 @FXML private ScrollPane scrollPane; 13 14 @FXML void initialize() { 15 // どちらかひとつでいい 16 17 // [event handling - How to listen for WindowEvent.WINDOW_SHOWN in the nodes of the scene graph? - Stack Overflow](https://stackoverflow.com/questions/8944445) 18 root.sceneProperty().addListener((observable, oldValue, newValue) -> { 19 newValue.windowProperty().addListener((observable1, oldValue1, newValue1) -> { 20 newValue1.addEventHandler(WindowEvent.WINDOW_SHOWN, event -> { 21 scrollPane.lookup(".viewport").setCache(false); 22 }); 23 }); 24 }); 25 26 // [java - JavaFX 2 Window event handling in controllers - Stack Overflow](https://stackoverflow.com/questions/21602362) 27 Bindings.<Window>select(root.sceneProperty(), "window") 28 .addListener((observable, oldValue, newValue) -> { 29 newValue.addEventHandler(WindowEvent.WINDOW_SHOWN, event -> { 30 scrollPane.lookup(".viewport").setCache(false); 31 }); 32 }); 33 34 35 // 手元ではこれだけで行けたがそれでいいのかは知らんw 36 // Platform.runLater(() -> scrollPane.lookup(".viewport").setCache(false)); 37 } 38}

java

1package com.example.demo; 2 3import javafx.application.Application; 4import javafx.fxml.FXMLLoader; 5import javafx.scene.Scene; 6import javafx.stage.Stage; 7 8import java.io.IOException; 9 10public class HelloApplication extends Application { 11 public static void main(String[] args) { 12 launch(); 13 } 14 15 @Override public void start(Stage stage) throws IOException { 16 FXMLLoader fxmlLoader = new FXMLLoader(HelloApplication.class.getResource("hello-view.fxml")); 17 Scene scene = new Scene(fxmlLoader.load(), 320, 240); 18 stage.setTitle("Hello!"); 19 stage.setScene(scene); 20 stage.show(); 21 } 22}

event handling - How to listen for WindowEvent.WINDOW_SHOWN in the nodes of the scene graph? - Stack Overflow

java - JavaFX 2 Window event handling in controllers - Stack Overflow


何か手がないかOpenJFXのソースをつらつら眺めていたら、目からうろこの驚くべき手法を発見しましたっ!!🤩

このようにsetSkinすれば、表示を待たずともviewportが作成されます。

java

1ScrollPane box_sp = new ScrollPane(); 2box_sp.setSkin(new ScrollPaneSkin(box_sp)); 3box_sp.lookup(".viewport").setCache(false);

ScrollPaneSkin.java · openjdk/jfx

投稿2025/02/14 09:57

編集2025/02/17 05:29
TN8001

総合スコア9937

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

HSSHSK

2025/02/15 01:42 編集

検証ありがとうございます。setCache(false)で解決ができることが確認できてよかったです。私のアプリでは整数点の位置に配置していますがぼやけます(ただしdoubleで位置を指定ー影響があるかわかりませんが)。 Oracleの説明によるとviewportの描画スピードを高めるためにキャッシュしているそうです。stackoverflowではそれがぼやけの原因と書いてありました。javaFXのバグ。 ただし随分前にバグフィックスされているとありましたがまだ現象が出ているようです。
TN8001

2025/02/16 03:19

「質問へのコメント」は読んでないんですかね? > 参考URLはリンクになるように、質問を編集してください。 > 質問はいつでも何度でも編集できます^^ FXMLはないと言いながら、Controllerがあったりと意味が分かりません。 ほっとこうかなとも思いましたが、絡んでしまった以上閲覧者向けにFXML版も追記しました。
HSSHSK

2025/02/16 13:55

簡単なソースを作りました。
TN8001

2025/02/16 15:46 編集

> 簡単なソースを作りました。 再現に必要なすべてのファイルを用意してください(.fxml・.css) こちらでざっと確認しましたが、ボケは確認できませんでした(box_sp.setLayoutX(0.5); とすればもちろんボケます) cssを一旦外してみるとどうなりますか? --- > 参考URLはリンクになるように、質問を編集してください。 どこのことを言っているか通じていませんか? ↓こんな感じになっていると思うんです。 ~~~~~~~~~~~~~~~~~~~~ 【参考】 ScrollPane content becomes blurry after dragging ### エラーメッセージ ```error 特にメッセージはありません。 https://stackoverflow.com/questions/26098295/scrollpane-content-becomes-blurry-after-dragging ``` ### 該当のソースコード ~~~~~~~~~~~~~~~~~~~~ そこをこうしてくださいということです。 ~~~~~~~~~~~~~~~~~~~~ 【参考】 [java - ScrollPane content becomes blurry after dragging - Stack Overflow](https://stackoverflow.com/questions/26098295) ### 該当のソースコード ~~~~~~~~~~~~~~~~~~~~ いや別にどうでもいいっちゃいいんですけどね、ここまでシカトされると意地になってしまうというかw
HSSHSK

2025/02/16 15:49

簡単なソースを作りました。 File => Newで台紙を開く。 台紙上でctrl+マウスクリックでオブジェクト生成。 台紙とオブジェクトにスクロールペインがある。 スクロールペインが作成される都度、System.out.printlnでスクロールペインの子ノードの状態が表示される。 以上です。
HSSHSK

2025/02/17 01:21

いや別にどうでもいいっちゃいいんですけどね、ここまでシカトされると意地になってしまうというかw ⇒ あなたはいいです。
TN8001

2025/02/17 02:15

runLaterでいけるかと思いましたがダメですね...(いける場合もあるが大体はダメ) そうなると「別スレッドで100msぐらい待機してから...」みたいな、バカバカしいことをするしかないならガッカリですね😭 しかしっ!! 何か手がないかOpenJFXのソースをつらつら眺めていたら、目からうろこの驚くべき手法を発見しましたっ!!🤩 たった1行の追加でviewportを確実に取得できますっ!!😍 参考URLがリンクに修正されたのを確認後、本手法をHSSHSKさんにご紹介したいと思いますっ!!👍
HSSHSK

2025/02/17 04:38

参考URL修正しました。 FXMLとCSSは文字数オーバーで添付できませんでした。
HSSHSK

2025/02/17 04:50

大変助かります。よろしくお願いします。
HSSHSK

2025/02/17 05:55

回答ありがとうございます。 試したところ問題が解決しました! ベストアンサーに選ばせていただきました。 ひじょうに助かりました。ぼやけず表示されます。お手数をおかけしました。お付き合いいただきありがとうございました。
TN8001

2025/02/17 06:17

そうですかよかったです^^ なんかダル絡みしてしまいすいませんでした。
HSSHSK

2025/02/17 08:02

いえいえ大丈夫です。
guest

0

viewportがJava上で取得できないし、

Scenic View https://github.com/JonathanGiles/scenic-view で観察すると、ScrollPaneの子ノードとして、viewportというスタイルクラスを持ったStackPaneが存在しています。
「おそらく」これがScrollPaneのviewportです。

java

1 final ScrollPane scrollPane = ...; 2 ... 3 scrollPane.getChildrenUnmodifiable() 4 .stream() 5 .filter(it -> it.getStyleClass().contains("viewport")) 6 .forEach(it -> ...));

あとは、お好きに。


scrollPane.getChildrenUnmodifiable()の部分で子ノードの数がゼロになっていて取得できないです。

追記

ScrollPaneを生成した直後に参照しているのでは?
きっと、ウィンドウが表示された後でなければ、それらは取得できないでしょう。
たとえば、このタイミング。

java

1 final ScrollPane scrollPane = ...; 2 primaryStage.addEventHandler(WindowEvent.WINDOW_SHOWN, new EventHandler<WindowEvent>() { 3 @Override 4 public void handle(WindowEvent event) { 5 System.out.println(scrollPane.getChildrenUnmodifiable()); 6 } 7 }); 8 primaryStage.setScene(new Scene(scrollPane)); 9 primaryStage.show();

投稿2025/02/13 08:33

編集2025/02/14 01:55
shiketa

総合スコア4075

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

HSSHSK

2025/02/14 01:31

早速の回答ありがとうございます。 scrollPane.getChildrenUnmodifiable()の部分で子ノードの数がゼロになっていて取得できないです。つまり、 scrollPane.getChildrenUnmodifiable().size() = 0 になります。下記も試みましたが結果はnullになりました。 StackPane sp = (StackPane)scp.lookup("scrollPane .viewport"); うまく取得できないです。
HSSHSK

2025/02/15 01:48 編集

コントローラークラスのinitializeメソッドで処理したいのですがどのようにすればよいでしょうか。 例えば次のようにsceneがロードされるのを監視してそこでviewportを取得することはできませんか。 (コントローラー側でStageを使ってwindowが生成されるのを監視することが難しいため) void initialize() {     root.sceneProperty().addListener((observable, oldScene, newScene) -> {       if (newScene != null) {              System.out.println( scrollPane.getChildrenUnmodifiable().size()); ↑※)size() = 0ゼロになります。 度々すいません。よろしくお願いします。※)ただし上記で新しくSceneが生成された後で、scrollPane.getChildrenUnmodifiable()を試みましたがやはりsize() = 0になります。
shiketa

2025/02/15 02:06

scneeが変わっても、その時点ではまだウィンドウが表示されていないのでしょう。 `newScene.addEventHandler(WindowEvent.WINDOW_SHOWN, ... `としてはいかがでしょうか。
HSSHSK

2025/02/15 15:10 編集

度々申し訳ありません。下記のようにしてみましたがSystem.out.println("windown shown"); が 表示されませんでした。色々と申し訳ないです。 newScene.addEventHandler(WindowEvent.WINDOW_SHOWN, new EventHandler<WindowEvent>(){ @Override public void handle(WindowEvent event) { System.out.println("windown shown"); event.consume(); } });
shiketa

2025/02/16 04:07 編集

~~FXMLの動作をつらつら考えると、initialize()メソッドが呼び出された時点で、すでにウィンドウが表示されているのでしょう。だから、initialize()メソッドでWindowEvent.WINDOW_SHOWN イベントを拾おうとしても、すでに手遅れ。なのかも。~~ ~~もっと言えば、今回のケースではinitialize()メソッドでの root.sceneProperty().addListener(...) に意味がないのだとおもいます。だって、(おそらく)sceneもすでに設定された後だろうから。~~ ~~FXMLLoader.load()の近辺でどうにかするしかないように思います。~~
TN8001

2025/02/16 03:26

@shiketaさん 逆じゃないですかね? まだWindowがないからaddEventHandlerが空振っている的な。 [event handling - How to listen for WindowEvent.WINDOW_SHOWN in the nodes of the scene graph? - Stack Overflow](https://stackoverflow.com/questions/8944445) [java - JavaFX 2 Window event handling in controllers - Stack Overflow](https://stackoverflow.com/questions/21602362) わたしはなんもわかってはいませんがw
shiketa

2025/02/16 04:07

> 逆じゃないですかね? 確かに。TN8001さんのFXML版で確認したところ、わたしの思い込みでした。
HSSHSK

2025/02/16 15:49

簡単なソースを作りました。 File => Newで台紙を開く。 台紙上でctrl+マウスクリックでオブジェクト生成。 台紙とオブジェクトにスクロールペインがある。 スクロールペインが作成される都度、System.out.printlnでスクロールペインの子ノードの状態が表示される。 以上です。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.33%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問