无法使用 Jruby/Jrubyfx 填充 TableView
Can't populate a TableView with Jruby/Jrubyfx
我正在尝试使用 TableView 制作 Jruby 应用程序,但我无法用数据填充 table,甚至找不到一些示例代码来执行此操作。这是我的 fxml 的相关部分:
<TableView prefHeight="400.0" prefWidth="200.0" id="table">
<columns>
<TableColumn prefWidth="75.0" text="name">
<cellValueFactory>
<PropertyValueFactory property="name" />
</cellValueFactory>
</TableColumn>
<TableColumn prefWidth="75.0" text="address">
<cellValueFactory>
<PropertyValueFactory property="address" />
</cellValueFactory>
</TableColumn>
</columns>
</TableView>
这里是相关的 ruby 代码:
class Person
attr_accessor :name, :address
def initialize
@name = 'foo'
@address = 'bar'
end
end
class HelloWorldApp < JRubyFX::Application
def start(stage)
with(stage, title: "Hello World!", width: 800, height: 600) do
fxml HelloWorldController
@data = observable_array_list
@data.add Person.new
stage['#table'].set_items @data
show
end
end
end
谁能指出我做错了什么或指出有效的示例代码?
参见 contrib/fxmltableview 示例;我认为这正是你想要做的。您 运行 遇到的问题是 PropertyValueFactory
是一个 Java class,它正在尝试访问一个 Person
,它是一个 JRuby class。默认情况下,这不会像这个问题所示那样工作,但您可以通过调用 Person.become_java!
轻松修复它。然而,即使你这样做了,它也不会工作,因为 PropertyValueFactory
期望 getter 形式的方法 [javatype] get[PropertyName]()
而 attr_accessor
只生成 getter 形式的方法形式 [rubytype] [propertyname]()
。要解决这个问题,请改用 fxml_accessor
,它会生成正确的方法(但不使用 @
变量,那些是原始的 属性 实例):
class Person
include JRubyFX # gain access to fxml_accessor
# must specify type as the concrete `Property` implementation
fxml_accessor :name, SimpleStringProperty
fxml_accessor :address, SimpleStringProperty
def initialize
# note use of self to call the method Person#name= instead of creating local variable
self.name = 'foo'
self.address = 'bar'
# could also technically use @address.setValue('bar'), but that isn't as rubyish
end
end
# become_java! is needed whenever you pass JRuby objects to java classes
# that try to call methods on them, such as this case. If you used your own
# cellValueFactory, this probably would not be necessary on person, but still
# needed on your CVF
Person.become_java!
我正在尝试使用 TableView 制作 Jruby 应用程序,但我无法用数据填充 table,甚至找不到一些示例代码来执行此操作。这是我的 fxml 的相关部分:
<TableView prefHeight="400.0" prefWidth="200.0" id="table">
<columns>
<TableColumn prefWidth="75.0" text="name">
<cellValueFactory>
<PropertyValueFactory property="name" />
</cellValueFactory>
</TableColumn>
<TableColumn prefWidth="75.0" text="address">
<cellValueFactory>
<PropertyValueFactory property="address" />
</cellValueFactory>
</TableColumn>
</columns>
</TableView>
这里是相关的 ruby 代码:
class Person
attr_accessor :name, :address
def initialize
@name = 'foo'
@address = 'bar'
end
end
class HelloWorldApp < JRubyFX::Application
def start(stage)
with(stage, title: "Hello World!", width: 800, height: 600) do
fxml HelloWorldController
@data = observable_array_list
@data.add Person.new
stage['#table'].set_items @data
show
end
end
end
谁能指出我做错了什么或指出有效的示例代码?
参见 contrib/fxmltableview 示例;我认为这正是你想要做的。您 运行 遇到的问题是 PropertyValueFactory
是一个 Java class,它正在尝试访问一个 Person
,它是一个 JRuby class。默认情况下,这不会像这个问题所示那样工作,但您可以通过调用 Person.become_java!
轻松修复它。然而,即使你这样做了,它也不会工作,因为 PropertyValueFactory
期望 getter 形式的方法 [javatype] get[PropertyName]()
而 attr_accessor
只生成 getter 形式的方法形式 [rubytype] [propertyname]()
。要解决这个问题,请改用 fxml_accessor
,它会生成正确的方法(但不使用 @
变量,那些是原始的 属性 实例):
class Person
include JRubyFX # gain access to fxml_accessor
# must specify type as the concrete `Property` implementation
fxml_accessor :name, SimpleStringProperty
fxml_accessor :address, SimpleStringProperty
def initialize
# note use of self to call the method Person#name= instead of creating local variable
self.name = 'foo'
self.address = 'bar'
# could also technically use @address.setValue('bar'), but that isn't as rubyish
end
end
# become_java! is needed whenever you pass JRuby objects to java classes
# that try to call methods on them, such as this case. If you used your own
# cellValueFactory, this probably would not be necessary on person, but still
# needed on your CVF
Person.become_java!