日記#762#763

#762 8月31日

今日は表の1行削除について進めていた。
ある程度は上手くいってたのだが、そのなかでgroupという属性(クラス)を持ったオブジェクトが存在し、それは参照したい型に変換できないという特徴を持っていた。
だから、"toString:~"はtoString()という機能を使用して取得した取得したクラスをテキスト形式にに変換したもので比較をしてみることにした。
そうした時、これが条件文でなぜか同じテキストで比較して一致しないので困っている。

結果は下記。
1行目が取得したクラス
2行目がそれをテキスト表示にしたもの
3行目が比較した結果けどわわーへ
だ。
全てNoとなっているため、なぜかクラスをテキスト表示にしたものとその内容をコピペして比較対象にした結果が一致していないことを表している。
本来であれば"class javafx.scene.Group"の部分以外Yesが表示になるはずだった。
だがそうはならなかった。
理由も分からないので別にアプローチをしてみる。

class javafx.scene.layout.AnchorPane
toString:class javafx.scene.layout.AnchorPane
No
class javafx.scene.layout.AnchorPane
toString:class javafx.scene.layout.AnchorPane
No
class javafx.scene.layout.AnchorPane
toString:class javafx.scene.layout.AnchorPane
No
class javafx.scene.layout.AnchorPane
toString:class javafx.scene.layout.AnchorPane
No
class javafx.scene.layout.AnchorPane
toString:class javafx.scene.layout.AnchorPane
No
class javafx.scene.layout.AnchorPane
toString:class javafx.scene.layout.AnchorPane
No
class javafx.scene.layout.AnchorPane
toString:class javafx.scene.layout.AnchorPane
No
class javafx.scene.layout.AnchorPane
toString:class javafx.scene.layout.AnchorPane
No
class javafx.scene.layout.AnchorPane
toString:class javafx.scene.layout.AnchorPane
No
class javafx.scene.layout.AnchorPane
toString:class javafx.scene.layout.AnchorPane
No
class javafx.scene.Group
toString:class javafx.scene.Group
No
class javafx.scene.layout.AnchorPane
toString:class javafx.scene.layout.AnchorPane
No
class javafx.scene.layout.AnchorPane
toString:class javafx.scene.layout.AnchorPane
No
class javafx.scene.layout.AnchorPane
toString:class javafx.scene.layout.AnchorPane
No
class javafx.scene.layout.AnchorPane
toString:class javafx.scene.layout.AnchorPane
No
class javafx.scene.layout.AnchorPane
toString:class javafx.scene.layout.AnchorPane
No


別件で一気にバックアップしようと思っていたら、一気にできなかったのでバックアップ用のUSB内のデータを消したら元のPCに残っていない物もあったみたい。
消しちゃったが、完成したもの自体はあらゆるところにアップロードしてあるし、いずれはそれらをこんな時期もあったなぁと思える地点に到達できていれば問題ないのであまりショックは大きくなかった。

#763 9月1日

今日は昨日上手くいかなかった部分に対して別のアプローチをしてみた。

それは、"チェック用に同じ属性(クラス)を持たせた変数を用意して、確認したい対象の属性とチェック用の変数の属性が一致するかどうかを確認する"というものだ。

ソースコード的には下記のようにしている。

if (targetchildren_pregridpane.get(n).getClass() == checkclass_AnchorPane.getClass()) {
    System.out.println("Class to Class Yes");
} else if (targetchildren_pregridpane.get(n).getClass() != checkclass_AnchorPane.getClass()) {
    System.out.println("Class to Class No");
}

targetchildren_pregridpane.get(n).getClass()が確認される側でget(n)のnはループ文の中に上記のソースコードが入っているからである。
属性(クラス)の取得方法は.getClass()で行っている。

一方、checkclass_AnchorPane.getClass()は確認する側で、チェック用に用意した変数である。

これを追加した結果が下記になる。

class javafx.scene.layout.AnchorPane
toString:class javafx.scene.layout.AnchorPane
No
Class to Class Yes
class javafx.scene.layout.AnchorPane
toString:class javafx.scene.layout.AnchorPane
No
Class to Class Yes
class javafx.scene.layout.AnchorPane
toString:class javafx.scene.layout.AnchorPane
No
Class to Class Yes
class javafx.scene.layout.AnchorPane
toString:class javafx.scene.layout.AnchorPane
No
Class to Class Yes
class javafx.scene.layout.AnchorPane
toString:class javafx.scene.layout.AnchorPane
No
Class to Class Yes
class javafx.scene.layout.AnchorPane
toString:class javafx.scene.layout.AnchorPane
No
Class to Class Yes
class javafx.scene.layout.AnchorPane
toString:class javafx.scene.layout.AnchorPane
No
Class to Class Yes
class javafx.scene.layout.AnchorPane
toString:class javafx.scene.layout.AnchorPane
No
Class to Class Yes
class javafx.scene.layout.AnchorPane
toString:class javafx.scene.layout.AnchorPane
No
Class to Class Yes
class javafx.scene.layout.AnchorPane
toString:class javafx.scene.layout.AnchorPane
No
Class to Class Yes
class javafx.scene.Group
toString:class javafx.scene.Group
No
Class to Class No
class javafx.scene.layout.AnchorPane
toString:class javafx.scene.layout.AnchorPane
No
Class to Class Yes
class javafx.scene.layout.AnchorPane
toString:class javafx.scene.layout.AnchorPane
No
Class to Class Yes
class javafx.scene.layout.AnchorPane
toString:class javafx.scene.layout.AnchorPane
No
class javafx.scene.layout.AnchorPane
toString:class javafx.scene.layout.AnchorPane
class javafx.scene.layout.AnchorPane
toString:class javafx.scene.layout.AnchorPane
No
toString:class javafx.scene.layout.AnchorPane
No
Class to Class Yes
class javafx.scene.layout.AnchorPane
Class to Class Yes
class javafx.scene.layout.AnchorPane
class javafx.scene.layout.AnchorPane
toString:class javafx.scene.layout.AnchorPane
No
Class to Class Yes
class javafx.scene.layout.AnchorPane
toString:class javafx.scene.layout.AnchorPane
No
Class to Class Yes

Class to Class Yesが追加したところ。
ここがAnchorPaneの下ではYesになっており、Groupの下ではNoになっているのできちんと比較が機能していることが分かる。
取得した属性(クラス)を一度文字に起こして比較しているほうは相変わらず全部Noとなってしまっているので、一旦は今回考えた方法で進める方がよさそうだ。

ひとまず形はどうあれこの問題はすぐ抜け出すことができて良かった。

そうして実行してみた結果

事前
事後

オブジェクトの削除は上手くいっているのだが、思っていた挙動と違う。
表も操作して1行分削除しないといけなさそうだ。

ついでに、この処理を行った後は表にオブジェクトをドラッグアンドドロップして1行追加させてやることもできない。

どうしたものか。


そこから考えてこうしてみた。

まずは初期の表は下のように項目名のみ残す形にしてみた。

この表に対してドラッグアンドドロップを行うとちゃんと増える。
ここまでは今までと同じ。

そしてここから✕ボタンを押すと、

ちゃんと1行ごと消えた!!!

削除処理は変えていない。
むしろ、削除する対象の行より下の行のオブジェクトたちを先に1行上に移動させる処理を追加した。

変えたのはドラッグアンドドロップ側の処理を変更した。
まずは表の初期状態の行が1つ減ったことでAnchorPaneというオブジェクトを固定するオブジェクトを探す手間を省いた。
1行追加する処理を簡潔にした。

どうしてこのようにしたかというと、初期状態の表を取得すると下記のようになっているからだ。

[AnchorPane@738be0a7, AnchorPane@775bd0c3, AnchorPane@4a60ef89, AnchorPane@6bf8aab9, AnchorPane@378b07f6, Group@4a2ec96b]

ここに含まれているGroup@4a2ec96bが厄介で、今回1行削除処理が上手くいかなかったのはこれのせいといっても過言ではない。
これは初期状態の表の最後に取得されるものである。

そのため、表の行が2行でそこから処理によって行を増やすとこのGroup@~の後ろに追加されていく。

つまり、先に1行分余白を作っている状態で追加されるとその余白にしていた分の後ろに追加されるGroup@~の前のAnchorPane@~に情報が入ってしまうのですごく処理がややこしくなる。

ここまでで上手く伝わっていないかもしれないが、とにかく初期状態の表にはGroup@~があるので消したくない必要最低限の項目だけを表示させておくことがより良い処理のしやすさにつながるということを意識できればよいということである。

ちなみに、行を追加したときの結果はこちら。

[AnchorPane@738be0a7, AnchorPane@775bd0c3, AnchorPane@4a60ef89, AnchorPane@6bf8aab9, AnchorPane@378b07f6, Group@4a2ec96b, AnchorPane@445db5e6, 
AnchorPane@f28fc70, AnchorPane@639f3258, AnchorPane@4aa277e4, AnchorPane@63f909d3]

これでテキスト及び画像のコピーと表の1行削除のボタンの処理が完成したので、今度こそデータベースとの連携を始めていきたい。

この記事が気に入ったらサポートをしてみませんか?