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

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

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

TableView(UITableView)とは、リスト形式で表示するコントロールで、ほとんどのアプリに使用されています。画面を「行」に分けて管理し、一般的には各行をタップした際に詳細画面に移動します。

JavaFX

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

Java

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

Eclipse

Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

Q&A

解決済

1回答

3493閲覧

JavaFxのTableViewに値を追加したいです。

t-_.

総合スコア55

TableView

TableView(UITableView)とは、リスト形式で表示するコントロールで、ほとんどのアプリに使用されています。画面を「行」に分けて管理し、一般的には各行をタップした際に詳細画面に移動します。

JavaFX

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

Java

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

Eclipse

Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

0グッド

0クリップ

投稿2019/08/28 18:51

編集2019/08/28 18:56

前提・実現したいこと

JavafxのTableViewに値を追加したいです。

Scene BuilderでTableViewを作ってます。

ボタンを押して、TableViewを表示してます。Initializableで初期データをいれて表示が確認できました。
指定した個数分データを追加したするようにしてます。

データを追加するコードで以下のエラーが出てしまいます。
いわゆるヌルポです。

半日以上時間を費やしてしまいました。。。

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

Exception in thread "JavaFX Application Thread" java.lang.NullPointerException at fxdiary.NewTableForm.FXData(NewTableForm.java:204) at fxdiary.NewTableSplit.Split(NewTableSplit.java:23) at fxdiary.NewAction$1.handle(NewAction.java:48) at fxdiary.NewAction$1.handle(NewAction.java:1)

該当のソースコード

Split

1package fxdiary; 2 3import java.io.IOException; 4 5import javafx.scene.Scene; 6 7public class NewTableSplit 8{ 9 public void Split( String[] Data, int Number, Scene Scene ) throws IOException 10 { 11 String[] DataText = new String[14]; 12 //13こ 13 for( int i = 0; i < Number; i++) 14 { 15 NewTableForm Table = new NewTableForm(); 16 String[] KeySplit = new String[Number]; 17 KeySplit = Data[i].split( ">>>" ); 18 for( int a = 0; a < KeySplit.length; a++ ) 19 { 20 DataText[a] = KeySplit[a]; 21 System.out.println(DataText[a]); 22 } 23 Table.FXData( DataText ); //データを送って『1』 24 } 25 } 26} 27

NewTableForm

1 2public class NewTableForm implements Initializable 3{ 4 @FXML 5 private TableView <Data> HistoryTable; 6 @FXML 7 private TableColumn<Data, String> TicketCol; 8 @FXML 9 private TableColumn<Data, String> OrderTimeCol; 10 @FXML 11 private TableColumn<Data, String> OrderPriceCol; 12 @FXML 13 private TableColumn<Data, String> TypeCol; 14 @FXML 15 private TableColumn<Data, String> LotsCol; 16 @FXML 17 private TableColumn<Data, String> PairCol; 18 @FXML 19 private TableColumn<Data, String> StopLossCol; 20 @FXML 21 private TableColumn<Data, String> LimitCol; 22 @FXML 23 private TableColumn<Data, String> CloseTimeCol; 24 @FXML 25 private TableColumn<Data, String> ClosePriceCol; 26 @FXML 27 private TableColumn<Data, String> FeeCol; 28 @FXML 29 private TableColumn<Data, String> SwapCol; 30 @FXML 31 private TableColumn<Data, String> PLCol; 32 33 private ObservableList<Data> Datas; 34 35 @Override 36 public void initialize( URL location, ResourceBundle resources ) 37 { 38 System.out.println( "Initialize" ); 39 40 Datas = FXCollections.observableArrayList 41 ( 42 new Data( "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0" ) 43 ); 44 45 HistoryTable.setItems( Datas ); 46 47 TicketCol.setCellValueFactory( 48 new PropertyValueFactory<>("Ticket")); 49 Callback<TableColumn<Data, String>, TableCell<Data, String>> TicketFactory = TextFieldTableCell.forTableColumn(); 50 TicketCol.setCellFactory(TicketFactory); 51 TicketCol.setOnEditCommit((TableColumn.CellEditEvent<Data, String> event) -> 52 { 53 Data Data = event.getTableView().getItems().get(event.getTablePosition().getRow()); 54 Data.setTicket(event.getNewValue()); 55 }); 56 57 OrderTimeCol.setCellValueFactory( 58 new PropertyValueFactory<>("OrderTime")); 59 Callback<TableColumn<Data, String>, TableCell<Data, String>> OrderTimeFactory = TextFieldTableCell.forTableColumn(); 60 OrderTimeCol.setCellFactory(OrderTimeFactory); 61 OrderTimeCol.setOnEditCommit((TableColumn.CellEditEvent<Data, String> event) -> 62 { 63 Data Data = event.getTableView().getItems().get(event.getTablePosition().getRow()); 64 Data.setOrderTime(event.getNewValue()); 65 }); 66 67 OrderPriceCol.setCellValueFactory( 68 new PropertyValueFactory<>("OrderPrice")); 69 Callback<TableColumn<Data, String>, TableCell<Data, String>> OrderPriceFactory = TextFieldTableCell.forTableColumn(); 70 OrderPriceCol.setCellFactory(OrderPriceFactory); 71 OrderPriceCol.setOnEditCommit((TableColumn.CellEditEvent<Data, String> event) -> 72 { 73 Data Data = event.getTableView().getItems().get(event.getTablePosition().getRow()); 74 Data.setOrderPrice(event.getNewValue()); 75 }); 76        ・ 77        (略) 78        ・ 79 // サンプルデータを1行追加 80 HistoryTable.getItems().add(new Data("101", "Lucius Junius Brutus", "-550", "-550", "-550", "-550", "-550", "-550", "-550", "-550", "-550", "-550", "-550")); 81 } 82 83 public void FXData( String[] Data )//データを受け取って。中身確認しました。 84 { 85 System.out.println( "FXData : " + Data[0] ); 86 Data FXDatas = new Data( Data[0], Data[1], Data[2], Data[3], Data[4], Data[5], Data[6], Data[7], Data[8], Data[9], Data[10], Data[11], Data[12] ); 87 88 Datas.addAll(FXDatas); //データを追加しているつもり『2』 //ここでエラー。。。ヌルポ 89 90 //System.out.println( Data[0]+ Data[1]+ Data[2]+ Data[3] +Data[4] +Data[5]+ Data[6] +Data[7] +Data[8]+ Data[9]+ Data[10]+ Data[11]+ Data[12] ); 91 } 92} 93

Data

1package fxdiary; 2 3import javafx.beans.property.SimpleStringProperty; 4import javafx.beans.property.StringProperty; 5 6public class Data 7{ 8 private StringProperty Ticket; 9 private StringProperty OrderTime; 10 private StringProperty OrderPrice; 11 private StringProperty Type; 12 private StringProperty Lots; 13 private StringProperty Pair; 14 private StringProperty StopLoss; 15 private StringProperty Limit; 16 private StringProperty CloseTime; 17 private StringProperty ClosePrice; 18 private StringProperty Fee; 19 private StringProperty Swap; 20 private StringProperty PL; 21 22 23 public Data 24 ( 25 String Ticket, 26 String OrderTime, 27 String OrderPrice, 28 String Type, 29 String Lots, 30 String Pair, 31 String StopLoss, 32 String Limit, 33 String CloseTime, 34 String ClosePrice, 35 String Fee, 36 String Swap, 37 String PL 38 ) 39 { 40 this.Ticket = new SimpleStringProperty(Ticket); 41 this.OrderTime = new SimpleStringProperty(OrderTime); 42 this.OrderPrice = new SimpleStringProperty(OrderPrice); 43 this.Type = new SimpleStringProperty(Type); 44 this.Lots = new SimpleStringProperty(Lots); 45 this.Pair = new SimpleStringProperty(Pair); 46 this.StopLoss = new SimpleStringProperty(StopLoss); 47 this.Limit = new SimpleStringProperty(Limit); 48 this.CloseTime = new SimpleStringProperty(CloseTime); 49 this.ClosePrice = new SimpleStringProperty(ClosePrice); 50 this.Fee = new SimpleStringProperty(Fee); 51 this.Swap = new SimpleStringProperty(Swap); 52 this.PL = new SimpleStringProperty(PL); 53 } 54 55 public StringProperty TicketProperty() 56 { 57 return Ticket; 58 } 59 public String getTicket() 60 { 61 return Ticket.get(); 62 } 63 public void setTicket( String Ticket ) 64 { 65 this.Ticket.set(Ticket);; 66 } 67 68 public StringProperty OrderTimeProperty() 69 { 70 return OrderTime; 71 } 72 public String getOrderTime() 73 { 74 return OrderTime.get(); 75 } 76 public void setOrderTime( String OrderTime ) 77 { 78 this.OrderTime.set(OrderTime);; 79 } 80 81 public StringProperty OrderPriceProperty() 82 { 83 return OrderPrice; 84 } 85 public String getOrderPrice() 86 { 87 return OrderPrice.get(); 88 } 89 public void setOrderPrice( String OrderPrice ) 90 { 91 this.OrderPrice.set(OrderPrice);; 92 } 93 9495  (略) 96  ・

fxml

1<?xml version="1.0" encoding="UTF-8"?> 2 3<?import java.lang.*?> 4<?import java.util.*?> 5<?import javafx.scene.control.*?> 6<?import javafx.scene.layout.*?> 7<?import javafx.scene.paint.*?> 8 9<AnchorPane id="AnchorPane" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="976.0" xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/2.2" fx:controller="fxdiary.NewTableForm"> 10 <children> 11 <TableView fx:id="HistoryTable" layoutX="0.0" layoutY="0.0" prefHeight="400.0" prefWidth="976.0"> 12 <columns> 13 <TableColumn id="Ticket" prefWidth="75.0" text="チケット番号" fx:id="TicketCol" /> 14 <TableColumn id="OrderTime" prefWidth="75.0" text="注文時間" fx:id="OrderTimeCol" /> 15 <TableColumn id="OrderPrice" prefWidth="75.0" text="注文価格" fx:id="OrderPriceCol" /> 16 <TableColumn id="Type" prefWidth="75.0" text="注文タイプ" fx:id="TypeCol" /> 17 <TableColumn id="Lots" prefWidth="75.0" text="ロット数" fx:id="LotsCol" /> 18 <TableColumn id="Pair" prefWidth="75.0" text="通貨ペア" fx:id="PairCol" /> 19 <TableColumn id="StopLoss" prefWidth="75.0" text="ストップロス" fx:id="StopLossCol" /> 20 <TableColumn id="Limit" prefWidth="75.0" text="リミット" fx:id="LimitCol" /> 21 <TableColumn id="CloseTime" prefWidth="75.0" text="決済時間" fx:id="CloseTimeCol" /> 22 <TableColumn id="ClosePrice" prefWidth="75.0" text="決済価格" fx:id="ClosePriceCol" /> 23 <TableColumn id="Fee" prefWidth="75.0" text="手数料" fx:id="FeeCol" /> 24 <TableColumn id="Swap" prefWidth="75.0" text="スワップ" fx:id="SwapCol" /> 25 <TableColumn id="PL" prefWidth="75.0" text="損益" fx:id="PLCol" /> 26 </columns> 27 </TableView> 28 </children> 29</AnchorPane>

試したこと

String[] Data はプリントして中に値が入っている事は確認してます。

いろいろ試しすぎて、ゴチャゴチャかもしれません。すみません。。。

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

SceneBuilder : ver1.0

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

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

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

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

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

CreeperSaviour

2019/09/04 09:55

文字数制限でコードが入りきらなかったのかもしれませんが、 こちらに変身する形で書くか、 https://pastebin.com/ などのサイトを使うなどして、全体のコードを送っていただけないでしょうか。
t-_.

2019/09/04 16:16 編集

ありがとうございます! 試行錯誤していたので、上のコードとは少し変わっています。 https://pastebin.com/u/t-_ Client.javaは、MQL4とソケット通信をして情報を送っています。 よろしくお願い致します。
CreeperSaviour

2019/09/07 05:29

[NewTableForm.java] public void FXData(String[] Data) { System.out.println( "FXData : " + Data[0] ); + for(String str : Data) { + System.out.println(" >> " + str); + } + System.out.println("length >> " + Data.length); Data FXDatas = new Data(Data[0], Data[1], Data[2], Data[3], Data[4], Data[5], Data[6], Data[7], Data[8], Data[9], Data[10], Data[11], Data[12]); Datas.addAll(FXDatas); } 行頭に+がある行を書き足して実行し、その実行結果を送っていただきたいと思っています。 ---------- 特に関係ないですが、javaのメソッドや変数名の最初は小文字にするなどの命名指針があるのでよければこちらをご覧ください。 https://qiita.com/rkonno/items/1b30daf83854fecbb814
t-_.

2019/09/07 06:03 編集

実行結果は下記になります。 /*---------------------------- Hello World!! New Load 「fxdataN_2」を送信しました。 Message from Server:チケット番号:40775628>>>注文時間:2019.09.05 19:45:05>>>注文価格:106.958>>>注文タイプ:0>>>ロット数:1>>>通貨ペア:USDJPY>>>ストップロス価格:0>>>リミット価格:0>>>決済時間:1970.01.01 00:00:00>>>決済価格:106.915>>>手数料:-500>>>スワップ:828>>>損益:-4300 Message from Server: チケット番号:40775627>>>注文時間:2019.09.05 19:45:03>>>注文価格:106.956>>>注文タイプ:0>>>ロット数:1>>>通貨ペア:USDJPY>>>ストップロス価格:0>>>リミット価格:0>>>決済時間:1970.01.01 00:00:00>>>決済価格:106.915>>>手数料:-500>>>スワップ:828>>>損益:-4100 Server End Initialize FXData : チケット番号:40775628 チケット番号:40775628 注文時間:2019.09.05 19:45:05 注文価格:106.958 注文タイプ:0 ロット数:1 通貨ペア:USDJPY ストップロス価格:0 リミット価格:0 決済時間:1970.01.01 00:00:00 決済価格:106.915 手数料:-500 スワップ:828 損益:-4300 >> チケット番号:40775628 >> 注文時間:2019.09.05 19:45:05 >> 注文価格:106.958 >> 注文タイプ:0 >> ロット数:1 >> 通貨ペア:USDJPY >> ストップロス価格:0 >> リミット価格:0 >> 決済時間:1970.01.01 00:00:00 >> 決済価格:106.915 >> 手数料:-500 >> スワップ:828 >> 損益:-4300 >> null length >> 14 FXData : チケット番号:40775627 チケット番号:40775627 注文時間:2019.09.05 19:45:03 注文価格:106.956 注文タイプ:0 ロット数:1 通貨ペア:USDJPY ストップロス価格:0 リミット価格:0 決済時間:1970.01.01 00:00:00 決済価格:106.915 手数料:-500 スワップ:828 損益:-4100 >> チケット番号:40775627 >> 注文時間:2019.09.05 19:45:03 >> 注文価格:106.956 >> 注文タイプ:0 >> ロット数:1 >> 通貨ペア:USDJPY >> ストップロス価格:0 >> リミット価格:0 >> 決済時間:1970.01.01 00:00:00 >> 決済価格:106.915 >> 手数料:-500 >> スワップ:828 >> 損益:-4100 >> null length >> 14 /*---------------------------- よろしくお願いいたします。 ---------- 命名指針に従ってコーディングすれば、一般的で見やすいと言う事ですね。 プログラミング自体全て独学だったので、このような情報は凄く助かります。 ありがとうございます。
t-_.

2019/09/07 06:09

追記: 配列の最後がnullだったので、要素数を13にして、nullをなくしても、同じエラーが出ました。 /*--------------- チケット番号:40775628 注文時間:2019.09.05 19:45:05 注文価格:106.958 注文タイプ:0 ロット数:1 通貨ペア:USDJPY ストップロス価格:0 リミット価格:0 決済時間:1970.01.01 00:00:00 決済価格:106.915 手数料:-500 スワップ:828 損益:-4300 >> チケット番号:40775628 >> 注文時間:2019.09.05 19:45:05 >> 注文価格:106.958 >> 注文タイプ:0 >> ロット数:1 >> 通貨ペア:USDJPY >> ストップロス価格:0 >> リミット価格:0 >> 決済時間:1970.01.01 00:00:00 >> 決済価格:106.915 >> 手数料:-500 >> スワップ:828 >> 損益:-4300 length >> 13 /*---------------------
CreeperSaviour

2019/09/07 07:23

ObservableListを使ったこと無いのと、あまりコードを深く読んでないので間違ってたら申し訳ないんですが、Datasをインスタンス化していないのでは? もしそうであれば NewTableForm.java内の private ObservableList<Data> Datas; を private ObservableList<Data> Datas = FXCollections.observableArrayList(list -> new Observable[] { list.TicketProperty(), list.OrderTimeProperty(), list.OrderPriceProperty(), list.TypeProperty(), list.LotsProperty(), list.PairProperty(), list.StopLossProperty(), list.LimitProperty(), list.CloseTimeProperty(), list.ClosePriceProperty(), list.FeeProperty(), list.SwapProperty(), list.PLProperty() }); に置き換えて実行してみてください。
t-_.

2019/09/07 10:11

インスタンス化はしてあります。 置き換えて実行しても、エラーは同じです。ぬるぽになります。 TableViewとかオブザーバとか曖昧にしか理解していなかったので、 仕組みをもう少し理解します。
guest

回答1

0

自己解決

自己解決しました。
ObservableListに追加をすれば自動的にTableViewに更新されるとのことだったので、
グローバル変数にして、Splitの中で追加をすれば出来ました。

NewTableForm

1static ObservableList<Data> Datas ;

NewTableSplit

1package fxdiary; 2 3import java.io.IOException; 4 5import javafx.scene.Scene; 6 7public class NewTableSplit 8{ 9 NewTableForm Table = new NewTableForm(); 10 static String[] DataText = new String[ 13 ]; 11 public void Split( String[] Data, int Number, Scene Scene ) throws IOException 12 { 13 for( int i = 0; i < Number; i++) 14 { 15 String[] KeySplit = new String[Number]; 16 KeySplit = Data[i].split( ">>>" ); 17 for( int a = 0; a < KeySplit.length; a++ ) 18 { 19 DataText[a] = KeySplit[a]; 20 System.out.println( DataText[a] ); 21 } 22 23 NewTableForm.Datas.addAll( new Data( DataText[0], DataText[1], DataText[2], DataText[3], DataText[4], DataText[5], DataText[6], DataText[7], DataText[8], DataText[9], DataText[10], DataText[11], DataText[12])); 24 } 25 } 26}

投稿2019/09/11 03:08

t-_.

総合スコア55

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問