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

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

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

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

Java

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

FXML

FXMLは、JavaFXに用意されているXMLベースのGUI記述言語です

Q&A

解決済

2回答

973閲覧

fx:idを効率的に管理したい

motox

総合スコア3

JavaFX

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

Java

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

FXML

FXMLは、JavaFXに用意されているXMLベースのGUI記述言語です

1グッド

0クリップ

投稿2023/03/13 08:46

実現したいこと

JavaFxのFXMLにおいて、ラベルを何個も羅列しているもののfx:idを効率的に管理したい。

前提

JavaFxとFXMlを使用していて、縦に10個ほどラベルがあり、それぞれに色を割り当てたり文字を変えたりしたいです。
開発の都合上、表などの使用は考えていません。
わからないですが、idをString型で指定したりできないですかね....

発生している問題・エラーメッセージ

Controller↓

java

1//割り当てたいCSS 2private final String selectedCss = "-fx-background-color: lightblue;-fx-border-width: 1px;-fx-border-color: black;"; 3private final String notSelectedCss = "-fx-background-color: white;-fx-border-width: 1px;-fx-border-color: black;"; 4 5//それぞれの項目の取得 6@FXML 7private Label label1; 8@FXML 9private Label label2; 10@FXML 11private Label label3; 12@FXML 13private Label label4; 14@FXML 15private Label label5; 16@FXML 17private Label label6; 18 19//例えば初期化 20public void initialize() { 21 label1.setStyle(selectedCss); 22 label2.setStyle(notSelectedCss); 23 label3.setStyle(notSelectedCss); 24 label4.setStyle(notSelectedCss); 25 label5.setStyle(notSelectedCss); 26 label6.setStyle(notSelectedCss); 27} 28 29//たとえば下にシフト 30private int verticalNumber = 6; 31private int verticalCount = 0; 32public void getDownKey() { 33 if (verticalCount < verticalNumber - 1) { 34 verticalCount += 1; 35 switch (verticalCount) { 36 case 1: 37 label2.setStyle(selectedCss); 38 label1.setStyle(notSelectedCss); 39 break; 40 case 2: 41 label3.setStyle(selectedCss); 42 label2.setStyle(notSelectedCss); 43 break; 44 case 3: 45 label4.setStyle(selectedCss); 46 label3.setStyle(notSelectedCss); 47 break; 48 case 4: 49 label5.setStyle(selectedCss); 50 label4.setStyle(notSelectedCss); 51 break; 52 case 5: 53 label6.setStyle(selectedCss); 54 label5.setStyle(notSelectedCss); 55 break; 56 } 57 } 58} 59//このように一つ一つ設定していくしかわからないです.....

FXML (レイアウト情報は省略)↓

FXML

1 2<Label fx:id="label1" text="Label1" /> 3<Label fx:id="label2" text="Label2" /> 4<Label fx:id="label3" text="Label3" /> 5<Label fx:id="label4" text="Label4" /> 6<Label fx:id="label5" text="Label5" /> 7<Label fx:id="label6" text="Label6" />

試したこと

一つ一つのidに対して処理を書き、switch文でごり押ししていました。

TN8001👍を押しています

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

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

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

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

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

guest

回答2

0

たとえば。

  • VBoxにLabelを好きなだけ放り込む。
  • VBoxにはidを振る。
  • Labelにはidを振らずレイアウトだけしておく。

fxml

1<?xml version="1.0" encoding="UTF-8"?> 2<?import javafx.scene.control.Label?> 3<?import javafx.scene.layout.AnchorPane?> 4<?import javafx.scene.layout.VBox?> 5<AnchorPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/8.0.161" xmlns:fx="http://javafx.com/fxml/1" fx:controller="aa.MainPane"> 6 <children> 7 <VBox fx:id="vvv" layoutX="48.0" layoutY="48.0" prefHeight="305.0" prefWidth="213.0"> 8 <children> 9 <Label text="Label" /> 10 <Label text="Label" /> 11 <Label text="Label" /> 12 <Label text="Label" /> 13 <Label text="Label" /> 14 <Label text="Label" /> 15 </children> 16 </VBox> 17 </children> 18</AnchorPane>
  • VBoxからLabelを取り出し、idを振るなら降ればいい
  • あとでなにかしたくなるのであれば、Listにでも放り込んでおけばいい。
  • VBoxだけ置いといて、動的にLabelを突っ込んでもいいかも。

java

1package aa; 2 3import javafx.fxml.FXML; 4import javafx.scene.control.Label; 5import javafx.scene.layout.VBox; 6 7import java.util.ArrayList; 8import java.util.List; 9import java.util.UUID; 10 11public class MainPane { 12 13 @FXML 14 private VBox vvv; 15 16 private final List<Label> labels = new ArrayList<>(); 17 18 @FXML 19 // This method is called by the FXMLLoader when initialization is complete 20 void initialize() { 21 assert vvv != null : "fx:id=\"vvv\" was not injected: check your FXML file 'test.fxml'."; 22 23 for (Object obj : vvv.getChildren()) { 24 if (obj instanceof Label) { 25 Label label = (Label) obj; 26 labels.add(label); 27 label.setId(UUID.randomUUID().toString()); 28 label.setText(label.getId()); 29 } 30 } 31 } 32}

java

1package aa; 2 3import javafx.application.Application; 4import javafx.fxml.FXMLLoader; 5import javafx.scene.Scene; 6import javafx.scene.layout.AnchorPane; 7import javafx.stage.Stage; 8 9public class TestApp extends Application { 10 11 public static void main(final String[] args) throws Exception { 12 Application.launch(TestApp.class, args); 13 } 14 15 @Override 16 public void start(final Stage stage) throws Exception { 17 final FXMLLoader loader = new FXMLLoader(this.getClass().getResource("/aa/test.fxml")); 18 final AnchorPane anchorPane = loader.load(); 19 final MainPane mainPane = loader.getController(); 20 stage.setScene(new Scene(anchorPane)); 21 stage.show(); 22 } 23}

投稿2023/03/13 13:53

shiketa

総合スコア4041

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

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

motox

2023/03/14 03:21

ご丁寧にありがとうございます!! 試してみます!
guest

0

ベストアンサー

開発の都合上、表などの使用は考えていません。

考えたほうが効率的だと思いますけどね^^;

idをString型で指定したりできないですかね....

FAQですね。
そういったことをしたくなったら、配列の使用を検討してください。
Labelのみのコンテナを用意できるのなら、それを配列の代わりに使用することもできます^^

xml

1<?xml version="1.0" encoding="UTF-8"?> 2 3<?import javafx.scene.control.*?> 4<?import javafx.scene.layout.VBox?> 5<VBox xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/11.0.1" 6 fx:controller="com.example.demo1.Controller"> 7 <VBox fx:id="vBox1"> 8 <children> 9 <Label fx:id="label1" text="Label1"/> 10 <Label fx:id="label2" text="Label2"/> 11 <Label fx:id="label3" text="Label3"/> 12 <Label fx:id="label4" text="Label4"/> 13 <Label fx:id="label5" text="Label5"/> 14 <Label fx:id="label6" text="Label6"/> 15 </children> 16 </VBox> 17 <Button onAction="#onButtonClick" text="Down"/> 18</VBox>

java

1package com.example.demo1; 2 3import javafx.fxml.FXML; 4import javafx.scene.control.Label; 5import javafx.scene.layout.VBox; 6 7public class Controller { 8 private final String selectedCss = "-fx-background-color: lightblue;-fx-border-width: 1px;-fx-border-color: black;"; 9 private final String unselectedCss = "-fx-background-color: white;-fx-border-width: 1px;-fx-border-color: black;"; 10 11 @FXML private VBox vBox1; 12 13 @FXML private Label label1; 14 @FXML private Label label2; 15 @FXML private Label label3; 16 @FXML private Label label4; 17 @FXML private Label label5; 18 @FXML private Label label6; 19 20 private Label[] labels; 21 22 @FXML void initialize() { 23 labels = new Label[]{ label1, label2, label3, label4, label5, label6, }; 24 for (Label label : labels) label.setStyle(unselectedCss); 25 labels[0].setStyle(selectedCss); 26 27// for (Node label : vBox1.getChildren()) label.setStyle(unselectedCss); 28// vBox1.getChildren().get(0).setStyle(selectedCss); 29 } 30 31 private int verticalCount = 0; 32 33 public void getDownKey() { 34 if (verticalCount < labels.length - 1) { 35 labels[verticalCount].setStyle(unselectedCss); 36 verticalCount++; 37 labels[verticalCount].setStyle(selectedCss); 38 } 39 40// if (verticalCount < vBox1.getChildren().size() - 1) { 41// vBox1.getChildren().get(verticalCount).setStyle(unselectedCss); 42// verticalCount++; 43// vBox1.getChildren().get(verticalCount).setStyle(selectedCss); 44// } 45 } 46 47 @FXML protected void onButtonClick() { 48 getDownKey(); 49 } 50}

FXMLでリストを作る方法もあるようですが、長くなるだけでメリットを感じない^^;
create array of Label using FXML in JavaFX - Stack Overflow

投稿2023/03/13 10:19

TN8001

総合スコア9825

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

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

motox

2023/03/13 13:53

再度ありがとうございます!!! chatGPTにはFXMLでリストを作るのを教えられて詰まってたんですよ...w がんばってみます!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問