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

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

ただいまの
回答率

87.95%

JavaFXでのTableView作成

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 1,244

score 26

SceneBuilderを使用してTableViewを用いたプログラムを作成したいと思い、こちらのサイトを参考に
TableViewTableViewを表示させたいのですがうまく動きません。
リンク内容

eclipse上ではコントローラークラスでTableColumnのパラメータ化が必要、という警告が表示されますが
ここは直接のエラー原因ではないと思うんですがどうなんでしょうか?

コードとエラー内容を載せさせて頂きますのでわかる方いらっしゃったらご教示お願い致します。
メモ書きが多いのでみにくかったらすみません。

mainクラス

package application;

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.TextField;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.Pane;
import javafx.stage.Stage;
import javafx.fxml.FXMLLoader;

public class Main extends Application {
    Stage stage;

    @Override
    public void start(Stage primaryStage) throws Exception {
        stage = primaryStage;
        primaryStage.setTitle("100Reading");
        Pane myPane_top = (Pane)
        FXMLLoader.load(getClass().getResource("Book.fxml"));
        Scene myScene = new Scene(myPane_top);
        primaryStage.setScene(myScene);
        primaryStage.show();

    }

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

Controllerクラス

package application;

import java.net.URL;
import java.util.ResourceBundle;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.control.cell.PropertyValueFactory;//追加



/**
 *
 * @author Toru Takahashi
 */
public class BookTableViewController implements Initializable {

    //Javaコード側で操作したいUIコントロールのインスタンス
    @FXML
    private TableView<Book> table;
    @FXML
    private TableColumn idColumn;
    @FXML
    private TableColumn nameColumn;
    @FXML
    private TableColumn birthYearColumn;


    //イベントが発生したときに呼び出してもらうメソッド
    @FXML
    private void handleButtonAction(ActionEvent event) {
        System.out.println("You clicked me!");
    }

    //初期化コードを定義するメソッド
    @Override
    public void initialize(URL url, ResourceBundle rb) {

        //public PropertyValueFactory(String property)

        //指定されたプロパティ名を使用して、指定されたTableView行アイテムから再帰的に値を抽出するためにデフォルトのPropertyValueFactoryを作成し。
        //パラメータ:property - 指定されたオブジェクトの対応する値を再帰的に抽出する試行に使用するプロパティの名前。
        idColumn.setCellValueFactory(new PropertyValueFactory<Book, Integer>("id"));
        nameColumn.setCellValueFactory(new PropertyValueFactory<Book, String>("name"));
        birthYearColumn.setCellValueFactory(new PropertyValueFactory<Book, Integer>("birthYear"));

        // サンプルデータを1行追加
        table.getItems().add(new Book(101, "Lucius Junius Brutus", -550));
    }    
}

データクラス

//aテーブルに表示する3つの属性を定義するクラス

//JavaBeans:銀行、情報を一時的に預かってくれる
//a・JavaBeansにデータを格納する時は口座を開設する(newする)
//a・データの出し入れはgetさんとsetさん経由で行う(getter/setter)
//a・JavaBeansは1件しか保持することができないので、データを複数件格納したい時は名前を変えて複数口座開設する。

//aJavaFXのBeansは、「プロパティ」というクラスを使って値の更新を知るようになっている。
//aプロパティクラスは、整数、文字列とデータ種類ごとにクラスが用意されている。
//a整数値であるIDの場合、フィールドに保持するプロパティはIntegerProperty型(抽象クラス)とし、
//a実装型はここではSimpleIntegerProperty型を使っています
//aこのフィールドのgetterメソッドは命名規約が定まっており、プロパティ名+Property です。

package application;

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

public class Book {
    //aラッパークラス:基本データ型の値をラップ(=包み込む)してオブジェクトとして利用できるようにするクラス
    //Integerがラッパークラス
    private IntegerProperty id;
    private StringProperty name;
    private IntegerProperty birthYear;

    public Book(int anId, String aName, int aBirthYear) {
        id = new SimpleIntegerProperty(anId);
        name = new SimpleStringProperty(aName);
        birthYear = new SimpleIntegerProperty(aBirthYear);
    }

    //Beansのgetterクラス?
    public IntegerProperty idProperty() {
        return id;
    }

    public StringProperty nameProperty() {
        return name;
    }

    public IntegerProperty birthYearProperty() {
        return birthYear;
    }

}

FXML

<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.scene.control.Button?>
<?import javafx.scene.control.TableColumn?>
<?import javafx.scene.control.TableView?>
<?import javafx.scene.layout.AnchorPane?>

<AnchorPane prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/8.0.171" xmlns:fx="http://javafx.com/fxml/1" fx:controller="BookTableViewController">
   <children>
      <TableView fx:id="table" layoutX="34.0" layoutY="33.0" prefHeight="308.0" prefWidth="521.0">
        <columns>
          <TableColumn fx:id="idColumn" prefWidth="156.0" text="ID" />
          <TableColumn fx:id="nameColumn" prefWidth="167.0" text="氏名" />
          <TableColumn fx:id="birthYearColumn" prefWidth="197.0" text="誕生年" />
        </columns>
      </TableView>
      <Button layoutX="503.0" layoutY="354.0" mnemonicParsing="false" text="Click Me!" />
   </children>
</AnchorPane>

エラーコード

Exception in Application start method
java.lang.reflect.InvocationTargetException
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at com.sun.javafx.application.LauncherImpl.launchApplicationWithArgs(LauncherImpl.java:389)
    at com.sun.javafx.application.LauncherImpl.launchApplication(LauncherImpl.java:328)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at sun.launcher.LauncherHelper$FXHelper.main(Unknown Source)
Caused by: java.lang.RuntimeException: Exception in Application start method
    at com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:917)
    at com.sun.javafx.application.LauncherImpl.lambda$launchApplication$154(LauncherImpl.java:182)
    at java.lang.Thread.run(Unknown Source)
Caused by: javafx.fxml.LoadException: 
/C:/Users/省略

    at javafx.fxml.FXMLLoader.constructLoadException(FXMLLoader.java:2601)
    at javafx.fxml.FXMLLoader.access$700(FXMLLoader.java:103)
    at javafx.fxml.FXMLLoader$ValueElement.processAttribute(FXMLLoader.java:922)
    at javafx.fxml.FXMLLoader$InstanceDeclarationElement.processAttribute(FXMLLoader.java:971)
    at javafx.fxml.FXMLLoader$Element.processStartElement(FXMLLoader.java:220)
    at javafx.fxml.FXMLLoader$ValueElement.processStartElement(FXMLLoader.java:744)
    at javafx.fxml.FXMLLoader.processStartElement(FXMLLoader.java:2707)
    at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2527)
    at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2441)
    at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3214)
    at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3175)
    at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3148)
    at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3124)
    at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3104)
    at javafx.fxml.FXMLLoader.load(FXMLLoader.java:3097)
    at application.Main.start(Main.java:21)
    at com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$161(LauncherImpl.java:863)
    at com.sun.javafx.application.PlatformImpl.lambda$runAndWait$174(PlatformImpl.java:326)
    at com.sun.javafx.application.PlatformImpl.lambda$null$172(PlatformImpl.java:295)
    at java.security.AccessController.doPrivileged(Native Method)
    at com.sun.javafx.application.PlatformImpl.lambda$runLater$173(PlatformImpl.java:294)
    at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:95)
    at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
    at com.sun.glass.ui.win.WinApplication.lambda$null$147(WinApplication.java:177)
    ... 1 more
Caused by: java.lang.ClassNotFoundException: BookTableViewController
    at java.net.URLClassLoader.findClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at javafx.fxml.FXMLLoader$ValueElement.processAttribute(FXMLLoader.java:920)
    ... 22 more
Exception running application application.Main
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

checkベストアンサー

0

Caused by: java.lang.ClassNotFoundException: BookTableViewController

とあるので、コントローラクラスの紐付けをしていないのではないですか?

参考にされたリンクの

対応するコントローラクラスの確認・変更は、左側ペイン階層ツリーで最上位のコントロール(このサンプルの場合AnchorPane)を選択状態にし、右側ペインの[コード]を展開し、[コントローラ・クラス]欄で行います。次の画面に示します。

という箇所のように設定しましたか?

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2019/06/26 12:38

    ありがとうございます!
    記事のそこの部分が自分の動かしているScene Builerで見つからなかったのでとばしてたみたいです。
    よく探したら違う位置にコントローラークラスを定義する場所があったため定義して実行したところ動きました。

    キャンセル

  • 2019/06/26 12:42

    参考にされているサイトがJavaFX2時代のもののようですので、現行のバージョンとは結構違います。
    なるべくご使用されているものと同じもの、大抵は新しいものを参考にすると良いかと思います。

    キャンセル

  • 2019/06/27 13:06

    全然気づきませんでした…。確かにバージョンが違いますね。
    ご指摘ありがとうございます。

    キャンセル

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

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

関連した質問

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