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

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

ただいまの
回答率

89.10%

JavafxのTableview内のcolumnにXMLで読み込んだ情報を表示させたい

受付中

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 125

前提・実現したいこと

訳あって進学のためにJavaとJavafxを独学で勉強し始めたものですが、
JavafxのTableview内のcolumnにXMLで読み込んだ情報を表示させるという処理の作成でfxmlを読み込む前に詰んでしまい、前に進まないです…

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

    at javafx.fxml/javafx.fxml.FXMLLoader.constructLoadException(FXMLLoader.java:2625)
    at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2603)
    at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2466)
    at javafx.fxml/javafx.fxml.FXMLLoader.load(FXMLLoader.java:2435)
    at qa_xmlculmn/qa_xmlculmn.table.AmaTable.start(AmaTable.java:23)
    at javafx.graphics/com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$9(LauncherImpl.java:846)
    at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runAndWait$12(PlatformImpl.java:455)
    at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater$10(PlatformImpl.java:428)
    at java.base/java.security.AccessController.doPrivileged(Native Method)
    at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater$11(PlatformImpl.java:427)
    at javafx.graphics/com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:96)
    at javafx.graphics/com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
    at javafx.graphics/com.sun.glass.ui.win.WinApplication.lambda$runLoop$3(WinApplication.java:174)
    at java.base/java.lang.Thread.run(Thread.java:834)
Caused by: java.lang.ClassCastException: class com.sun.javafx.collections.ObservableListWrapper cannot be cast to class qa_xmlculmn.table.Persons (com.sun.javafx.collections.ObservableListWrapper is in module javafx.base of loader 'app'; qa_xmlculmn.table.Persons is in module qa_xmlculmn of loader 'app')
    at qa_xmlculmn/qa_xmlculmn.table.File_read.setItem(File_read.java:84)
    at qa_xmlculmn/qa_xmlculmn.table.File_read.loadXml(File_read.java:50)
    at qa_xmlculmn/qa_xmlculmn.table.Controller.initialize(Controller.java:40)
    at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2573)

該当のソースコード

<?xml version="1.0" encoding="UTF-8"?>
<Amazin_Info>
  <AmaInfo>
    <name>iPad Fro</name>
    <price>20000</price>
    <sugo>頻繁に割れる</sugo>
    <biko>修理代がやや高い、送料無料</biko>
  </AmaInfo>
  <AmaInfo>
    <name>iPad 8</name>
    <price>70000</price>
    <sugo>紙より薄い</sugo>
    <biko>送料が高い</biko>
  </AmaInfo>
  <AmaInfo>
    <name>apple</name>
    <price>100000</price>
    <sugo>買えば将来安泰</sugo>
    <biko>サブカル系になる</biko>
  </AmaInfo>
</Amazin_Info>
<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.scene.control.Label?>
<?import javafx.scene.control.TableColumn?>
<?import javafx.scene.control.TableView?>
<?import javafx.scene.layout.AnchorPane?>
<?import javafx.scene.layout.VBox?>
<?import javafx.scene.text.Font?>

<VBox prefHeight="400.0" prefWidth="640.0" xmlns="http://javafx.com/javafx/11.0.1" xmlns:fx="http://javafx.com/fxml/1">
  <children>
    <AnchorPane maxHeight="-1.0" maxWidth="-1.0" prefHeight="-1.0" prefWidth="-1.0" VBox.vgrow="ALWAYS">
      <children>
        <Label alignment="CENTER" layoutX="155.0" layoutY="177.0" style="&#10;" text="Drag components from Library here…" textAlignment="CENTER" textFill="#9f9f9f" wrapText="false">
          <font>
            <Font size="18.0" />
          </font>
        </Label>
            <TableView layoutX="65.0" layoutY="68.0" prefHeight="263.0" prefWidth="510.0">
              <columns>
                <TableColumn prefWidth="75.0" text="名称" />
                <TableColumn prefWidth="75.0" text="価格" />
                  <TableColumn prefWidth="75.0" text="凄さ" />
                  <TableColumn prefWidth="75.0" text="備考" />
              </columns>
            </TableView>
      </children>
    </AnchorPane>
  </children>
</VBox>
package qa_xmlculmn.table;

import javafx.beans.property.IntegerProperty;
import javafx.beans.property.SimpleIntegerProperty;
import javafx.beans.property.SimpleStringProperty;
import javafx.beans.property.StringProperty;

public class Persons {

    // 人間でいう人体パーツなどの構成をまとめたクラス

    private static final int NULL = 0;
    private final SimpleStringProperty name;
    private final SimpleIntegerProperty price;
    private final SimpleStringProperty sugo;
    private final SimpleStringProperty biko;

    public Persons(String name, int price, String sugo, String biko){
        this.name = new SimpleStringProperty();
        this.price = new SimpleIntegerProperty();
        this.sugo = new SimpleStringProperty();
        this.biko = new SimpleStringProperty();
    }

    public Persons() {
        this("",NULL,"","");
    }

    // プロパティの宣言
    public StringProperty nameProperty() {
        return name;
    }
    public IntegerProperty priceProperty() {
        return price;
    }
    public StringProperty sugoProperty() {
        return sugo;
    }
    public StringProperty bikoProperty() {
        return biko;
    }



    public void setName(String ss) {
        name.set(ss);
    }
    public String getName() {
        return name.get();
    }
    public void setPrice(int ss) {
        price.set(ss);
    }
    public int getPrice() {
        return price.get();
    }
    public void setSugo(String ss) {
        sugo.set(ss);
    }
    public String getSugo() {
        return sugo.get();
    }
    public void setBiko(String ss) {
        biko.set(ss);
    }
    public String getBiko() {
        return biko.get();
    }


}
package qa_xmlculmn.table;

import java.net.URL;
import java.util.ResourceBundle;

import javafx.collections.ObservableList;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.scene.layout.VBox;

public class Controller implements Initializable {

    private ObservableList<Persons> pList;

    @FXML
    private VBox amaPane;

    @FXML
    private TableView<Persons>amaview;

    @FXML
    private TableColumn<Persons, String> name;
    @FXML
    private TableColumn<Persons, Integer> price;
    @FXML
    private TableColumn<Persons, String> sugo;
    @FXML
    private TableColumn<Persons, String> biko;



    @Override
    public void initialize(URL location, ResourceBundle resources) {

        Persons ps = new Persons();
        File_read fr = new File_read();
        fr.loadXml("C:/Ama/file/vlp1");
        amaview.setItems(pList);

        name.setCellValueFactory(new PropertyValueFactory<Persons, String>("name"));
        price.setCellValueFactory(new PropertyValueFactory<Persons, Integer>("price"));
        sugo.setCellValueFactory(new PropertyValueFactory<Persons, String>("sugo"));
        biko.setCellValueFactory(new PropertyValueFactory<Persons, String>("biko"));


    }

}
package qa_xmlculmn.table;

import java.io.IOException;

import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;

public class AmaTable extends Application {

    public static void main(String[] args) {
        launch(args);
    }

    @Override
    public void start(Stage primaryStage) throws Exception {

        try {
            FXMLLoader loader = new FXMLLoader(getClass().getResource("TableTest.fxml"));
            Parent parent = loader.load();


            // シーンの作成を行う
            Scene scene = new Scene(parent, 600, 400);


            // ウィンドウのセット、表示
            primaryStage.setScene(scene);
            primaryStage.show();

        }catch(IOException e) {
            e.printStackTrace();
        }




    }

}
package qa_xmlculmn.table;

import java.io.File;
import java.io.IOException;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;

import org.w3c.dom.DOMException;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

import javafx.collections.FXCollections;
import javafx.collections.ObservableList;

public class File_read {

    // カラムに入れるためのリスト
    private ObservableList<Persons> pList = FXCollections.observableArrayList();

    public boolean loadXml(String path) {
        boolean flg = true;

        // ファイルの存在チェック
        File file = new File(path +"/psAmazin.xml");
        if (file.exists()) {
            // あり
            DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
            try {
                DocumentBuilder documentBuilder = factory.newDocumentBuilder();
                Document document = documentBuilder.parse(file);
                Element root = document.getDocumentElement();
                // ルート要素の子ノードを取得する
                NodeList rootNode = root.getChildNodes();

                for (int loop = 0; loop < rootNode.getLength(); loop++) {
                    Node node1 = rootNode.item(loop);
                    if (node1.getNodeType() == Node.ELEMENT_NODE) {
                        Element element = (Element) node1;
                        if (element.getNodeName().equals("AmaInfo")) {
                            NodeList childrenNode = node1.getChildNodes();
                            Persons item = new Persons();
                            for (int loop2 = 0; loop2 < childrenNode.getLength(); loop2++) {
                                Node node2 = childrenNode.item(loop2);
                                if (node2.getNodeType() == Node.ELEMENT_NODE) {
                                    item = setItem(node2.getNodeName(), node2.getTextContent(), item);
                                }
                            }
                        }
                    }
                }
                flg = false;
            } catch (DOMException | ParserConfigurationException | SAXException | IOException e) {
                flg = true;
            }
        }
        return flg;
    }

    public Persons setItem(String nodeName, String content, Persons item) {

        switch (nodeName) {
        case "name":
            item.setName(content);
            break;
        case "price":
            int i = Integer.parseInt(content);
            item.setPrice(i);
            break;
        case "sugo":
            item.setSugo(content);
            break;
        case "biko":
            item.setBiko(content);
        default:
            break;
        }

        pList.add(item);
        return (Persons)pList;

    }
}

試したこと

SceanBuilderでControllerの紐づけはそれぞれ正しい場所に行っています。

補足情報(FW/ツールのバージョンなど)

Eclipse4.14.0

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • asahina1979

    2020/07/01 09:08

    同名のクラスの場合、同じクラスローダーから読み込まれてるかチェックしてください

    キャンセル

回答 1

0

例外の直接の原因は、ここです。JavaFXはまったく関係していません。

public class File_read {
   private ObservableList<Persons> pList = FXCollections.observableArrayList();
...
    public Persons setItem(String nodeName, String content, Persons item) {
...
        return (Persons)pList;  // これ。
    }

ObservableList<Persons>Personsにキャストしたら、それは、
Caused by: java.lang.ClassCastException: class com.sun.javafx.collections.ObservableListWrapper cannot be cast to class qa_xmlculmn.table.Personsと怒られるでしょうね。


軽く動かしてみましたが、fxmlファイルの中身もきちんと定義されていないようでした。参考まで。

diff --git a/src/main/resources/qa_xmlculmn/table/TableTest.fxml b/src/main/resources/qa_xmlculmn/table/TableTest.fxml
index 771c767..46e5c5b 100644
--- a/src/main/resources/qa_xmlculmn/table/TableTest.fxml
+++ b/src/main/resources/qa_xmlculmn/table/TableTest.fxml
@@ -7,7 +7,7 @@
 <?import javafx.scene.layout.VBox?>
 <?import javafx.scene.text.Font?>

-<VBox prefHeight="400.0" prefWidth="640.0" xmlns="http://javafx.com/javafx/11.0.1" xmlns:fx="http://javafx.com/fxml/1">
+<VBox fx:id="amaPane" prefHeight="400.0" prefWidth="640.0" xmlns="http://javafx.com/javafx/8.0.181" xmlns:fx="http://javafx.com/fxml/1" fx:controller="qa_xmlculmn.table.Controller">
     <children>
         <AnchorPane maxHeight="-1.0" maxWidth="-1.0" prefHeight="-1.0" prefWidth="-1.0" VBox.vgrow="ALWAYS">
             <children>
@@ -16,12 +16,12 @@
                         <Font size="18.0" />
                     </font>
                 </Label>
-                <TableView layoutX="65.0" layoutY="68.0" prefHeight="263.0" prefWidth="510.0">
+                <TableView fx:id="amaview" layoutX="65.0" layoutY="68.0" prefHeight="263.0" prefWidth="510.0">
                     <columns>
-                        <TableColumn prefWidth="75.0" text="名称" />
-                        <TableColumn prefWidth="75.0" text="価格" />
-                        <TableColumn prefWidth="75.0" text="凄さ" />
-                        <TableColumn prefWidth="75.0" text="備考" />
+                        <TableColumn fx:id="name" prefWidth="75.0" text="名称" />
+                        <TableColumn fx:id="price" prefWidth="75.0" text="価格" />
+                        <TableColumn fx:id="sugo" prefWidth="75.0" text="凄さ" />
+                        <TableColumn fx:id="biko" prefWidth="75.0" text="備考" />
                     </columns>
                 </TableView>
             </children>

また、このあたりも無茶苦茶ですね。

public class Controller implements Initializable {
    private ObservableList<Persons> pList;
...
    public void initialize(URL location, ResourceBundle resources) {
        Persons ps = new Persons();
        File_read fr = new File_read();
        fr.loadXml(...);
        amaview.setItems(pList);


File_readのpListと、ControllerのpListはベツモノです。setItems()でNPEが発生するでしょう。おそらく。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 89.10%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る