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

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

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

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

JavaFX

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

Q&A

解決済

1回答

1954閲覧

JavaFX tableview 金額をソート

useuser

総合スコア11

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

JavaFX

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

0グッド

0クリップ

投稿2017/06/26 01:44

JavaFXのtableviewでデフォルトのソート機能をカスタマイズしたいと考えています。
やりたいことは、tableviewに表示している内容で金額の項目があり、「\10,000」という風に文字列として出力しています。このままカラムをクリックし、デフォルトのソート機能を使うと文字列としてソートされてしまいます。
これを、数値でソートし、文字列で表示したいのですが、どういった方法で行えばいいのかわかりません。
やろうとしたことは、文字列の値(金額)を表示用としもう一つ隠し値を数値で持ちその値を使いソートする。また別の方法としてソート時のイベントを取得しソート方法をカスタマイズする(文字列を数値に変換しソート後文字列に戻し表示させる)
上記の二つの方法を、試みましたが両方とも実装できませんでした。
上記の方法、または、別の方法で金額のソートを実現できる方法を教えていただけないでしょうか?

※当方、JRubyで実装しており、Rubyのコードで教えていただけると幸いです。

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

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

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

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

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

guest

回答1

0

ベストアンサー

JavaFXとしての自然な戦略は次のようなものではないかと思います。

  • 金額のカラムはあくまで数値(整数)として扱う

cellValueFactoryは数値としての値を取るようにSimpleIntegerPropertyなどを用います。

  • TableView上への表示("\xxx,xxx"のような形式)はカスタムセルで実現

本件の目的にはjavafx.scene.control.cells.TextFieldTableCellが便利そうです。値(数値)をどのような文字列で表現するかはjavafx.util.StringConverterの派生クラスを定義することで実現します。

ruby, jruby, jrubyfxについてちゃんとした勉強ができてないのでよい実装ではないかも知れませんが、動かしてみた簡単なコードを載せておきます。

ruby

1require 'java' 2require 'jrubyfx' 3 4module Jfxu 5 include_package "javafx.util" 6end 7 8module Jfxscc 9 include_package "javafx.scene.control.cell" 10end 11 12class TableTestApp < JRubyFX::Application 13 def start(stage) 14 tableView = createTableView() 15 tableView.setItems(createTableModel()) 16 17 with(stage, title: "Table Test", width: 300, height: 200) do 18 layout_scene do 19 tableView 20 end 21 show 22 end 23 end 24 25 def createTableView() 26 tableView = TableView.new 27 tc1 = TableColumn.new('Id') 28 tc1.setCellValueFactory(lambda{|f| SimpleIntegerProperty.new(f.getValue.id)}) 29 tc2 = TableColumn.new('Name') 30 tc2.setCellValueFactory(lambda{|f| SimpleStringProperty.new(f.getValue.name)}) 31 tc3 = TableColumn.new('Salary') 32 tc3.setCellValueFactory(lambda{|f| SimpleIntegerProperty.new(f.getValue.salary)}) 33 tc3.setCellFactory(lambda{|tc| Jfxscc::TextFieldTableCell.new(MoneyConverter.new)}) 34 tc3.style = "-fx-alignment: CENTER-RIGHT;" 35 tableView.getColumns.addAll(tc1, tc2, tc3) 36 tableView 37 end 38 39 def createTableModel() 40 ml = FXCollections.observableArrayList 41 ml.add(Model.new(1, 'John', 100000)) 42 ml.add(Model.new(2, 'Paul', 20000)) 43 ml.add(Model.new(3, 'George', 3000)) 44 ml.add(Model.new(4, 'Ringo', 400)) 45 ml 46 end 47end 48 49class MoneyConverter < Jfxu::StringConverter 50 def toString(m) 51 java.lang.String.format("\\%,d", m) 52 end 53end 54 55class Model 56 attr_accessor(:id, :name, :salary) 57 58 def initialize(id, name, salary) 59 @id = id 60 @name = name 61 @salary = salary 62 end 63end 64 65TableTestApp.launch 66

補足:

  • 右寄せのスタイル

金額のカラムの右寄せのためstyleプロパティーを直接設定しています。このようにしたのはrubyコードのみで完結させるためですが、本来はスタイルシートへ定義しておくべきと思います。

  • 環境

Windows10
jruby 9.1.12.0
jrubyfx 1.2.0
java 1.8.0_131
なおJavaFXの画面そのものは出るのですが、当方の環境設定不備あるいはコードの不備かは不明ですが上記コードをjruby xxx.rbで実行するとコンソールに以下のような警告メッセージが出てしまっています。もしコードに不備があった場合はご容赦ください。

C:/jruby-9.1.12.0/lib/ruby/gems/shared/gems/jrubyfx-fxmlloader-0.4.1-java/lib/fxmlloader/elts.rb:158: warning: `<<' after local variable or literal is interpreted as binary operator C:/jruby-9.1.12.0/lib/ruby/gems/shared/gems/jrubyfx-fxmlloader-0.4.1-java/lib/fxmlloader/elts.rb:158: warning: even though it seems like here document

投稿2017/06/26 05:28

編集2017/06/26 06:06
KSwordOfHaste

総合スコア18392

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

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

useuser

2017/06/26 06:05

ご回答ありがとうございます。 参考にさせていただき、無事思っていた動作が実装できました。 本当にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問