Jython - 任何人都知道为什么这个 Action 没有按照我的意愿进行?
Jython - anyone got an idea why this Action isn't doing what I want?
这是关于单元测试的(使用 Python 的单元测试模块)。我正在尝试以编程方式实现用户按下 "F2" 以开始编辑 JTable 的单元格。
实用方法 "run_in_edt" 将传递的方法包装在 Runnable 中,然后使用 invokeAndWait 运行它,而不是 invokeLater。
def test_can_edit_table_date(self):
main_frame = FTCase2.app.main_frame
dates_table = main_frame.dates_table
def start_editing():
dates_table.requestFocus()
f2_key_stroke = javax.swing.KeyStroke.getKeyStroke( java.awt.event.KeyEvent.VK_F2, 0 )
im = dates_table.getInputMap( javax.swing.JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT )
action_value = im.get( f2_key_stroke )
self.assertEqual( action_value, 'startEditing' )
am = dates_table.actionMap
self.f2_action = am.get( action_value )
self.assertIsNotNone( self.f2_action )
sel_row = dates_table.selectedRow
self.assertNotEqual( sel_row, -1 )
self.assertTrue( dates_table.isCellEditable( sel_row, 0 ))
self.start_editing_action_event = java.awt.event.ActionEvent( dates_table,
java.awt.event.ActionEvent.ACTION_FIRST, 'X' )
self.f2_action.actionPerformed( self.start_editing_action_event )
# dates_table.editCellAt( sel_row, 0 )
# self.assertTrue( dates_table.editing )
_utils.run_in_edt( start_editing )
# time.sleep( 1 )
def write_string_in_cell_editor():
self.assertTrue( dates_table.editing )
cell_editor = dates_table.cellEditor
self.assertIsNotNone( cell_editor )
cell_value = cell_editor.cellEditorValue
cell_editor.component.text = "mouse"
self.f2_action.actionPerformed( self.start_editing_action_event)
_utils.run_in_edt( write_string_in_cell_editor )
问题:"dates_table.editing" 总是出现错误...并获取单元格编辑器 returns None。我也试过在这两个 Runnable 之间休眠,以防万一 "events having to bubble up/down"...
注意我还尝试使用更合理的值作为 ActionEvent 的第三个参数,例如 action_value(即 'startEditing')。不开心。
我当然可以:
dates_table.editCellAt( sel_row, 0 )
...在未注释的情况下,有趣的是,在此处的第二种方法中,我将 JTextField 的 ("editor delegate") 文本设置为 "mouse",然后使用 [=38] "press F2" =]... 并且...它有效,因为在我的 table 单元格渲染器中我只允许日期值或 None,而不是字符串,因此引发了 AssertionError。这意味着我已经成功地模拟了一个 F2 按键(注意,虽然这个动作的名称是 "startEditing",但它也会停止编辑会话,在现实生活中和测试中一样)。
...我可以满足于使用 editCellAt,并确定 F2 在正确的 InputMap 中有正确的条目,并且弹出的值是一个名称为 [= 的动作(可以检查) 34=],它被证明能够结束编辑,我可以满足于此。
但是当我的理解力被暴露出来时,我很讨厌!我想知道为什么这不起作用...
找到答案放在这里供参考
我对 JTable 的 requestFocus() 操作确实在右行留下了选择,但没有选择(单个)列。即使 运行 正常(未测试),JTable 列最初也没有响应 F2。令我困惑的是,为什么牢房最初没有被粗黑的边框包围。因此,答案是将此行放在 requestFocus 行之后:
dates_table.setColumnSelectionInterval( 0, 0 )
这是关于单元测试的(使用 Python 的单元测试模块)。我正在尝试以编程方式实现用户按下 "F2" 以开始编辑 JTable 的单元格。
实用方法 "run_in_edt" 将传递的方法包装在 Runnable 中,然后使用 invokeAndWait 运行它,而不是 invokeLater。
def test_can_edit_table_date(self):
main_frame = FTCase2.app.main_frame
dates_table = main_frame.dates_table
def start_editing():
dates_table.requestFocus()
f2_key_stroke = javax.swing.KeyStroke.getKeyStroke( java.awt.event.KeyEvent.VK_F2, 0 )
im = dates_table.getInputMap( javax.swing.JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT )
action_value = im.get( f2_key_stroke )
self.assertEqual( action_value, 'startEditing' )
am = dates_table.actionMap
self.f2_action = am.get( action_value )
self.assertIsNotNone( self.f2_action )
sel_row = dates_table.selectedRow
self.assertNotEqual( sel_row, -1 )
self.assertTrue( dates_table.isCellEditable( sel_row, 0 ))
self.start_editing_action_event = java.awt.event.ActionEvent( dates_table,
java.awt.event.ActionEvent.ACTION_FIRST, 'X' )
self.f2_action.actionPerformed( self.start_editing_action_event )
# dates_table.editCellAt( sel_row, 0 )
# self.assertTrue( dates_table.editing )
_utils.run_in_edt( start_editing )
# time.sleep( 1 )
def write_string_in_cell_editor():
self.assertTrue( dates_table.editing )
cell_editor = dates_table.cellEditor
self.assertIsNotNone( cell_editor )
cell_value = cell_editor.cellEditorValue
cell_editor.component.text = "mouse"
self.f2_action.actionPerformed( self.start_editing_action_event)
_utils.run_in_edt( write_string_in_cell_editor )
问题:"dates_table.editing" 总是出现错误...并获取单元格编辑器 returns None。我也试过在这两个 Runnable 之间休眠,以防万一 "events having to bubble up/down"...
注意我还尝试使用更合理的值作为 ActionEvent 的第三个参数,例如 action_value(即 'startEditing')。不开心。
我当然可以: dates_table.editCellAt( sel_row, 0 ) ...在未注释的情况下,有趣的是,在此处的第二种方法中,我将 JTextField 的 ("editor delegate") 文本设置为 "mouse",然后使用 [=38] "press F2" =]... 并且...它有效,因为在我的 table 单元格渲染器中我只允许日期值或 None,而不是字符串,因此引发了 AssertionError。这意味着我已经成功地模拟了一个 F2 按键(注意,虽然这个动作的名称是 "startEditing",但它也会停止编辑会话,在现实生活中和测试中一样)。
...我可以满足于使用 editCellAt,并确定 F2 在正确的 InputMap 中有正确的条目,并且弹出的值是一个名称为 [= 的动作(可以检查) 34=],它被证明能够结束编辑,我可以满足于此。
但是当我的理解力被暴露出来时,我很讨厌!我想知道为什么这不起作用...
找到答案放在这里供参考
我对 JTable 的 requestFocus() 操作确实在右行留下了选择,但没有选择(单个)列。即使 运行 正常(未测试),JTable 列最初也没有响应 F2。令我困惑的是,为什么牢房最初没有被粗黑的边框包围。因此,答案是将此行放在 requestFocus 行之后:
dates_table.setColumnSelectionInterval( 0, 0 )