Jython - 任何人都知道为什么这个动作没有按照我的意愿行事?

时间:2015-07-19 17:32:59

标签: swing jtable jython python-unittest

这是关于单元测试(使用Python的unittest模块)。我试图以编程方式实现用户按“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”总是出错...并且让单元格编辑器返回None。我也试过在这两个Runnables之间睡一觉,以防万一这是一个“事件不得不起泡/下降”的问题......

NB我也尝试使用更合理的值作为ActionEvent的第3个参数,例如action_value(即'startEditing')。没有快乐。

我当然可以这样做:     dates_table.editCellAt(sel_row,0) ...有了这个没有注释,有趣的是,在这里的第二种方法中,我将JTextField(“编辑委托”)文本设置为“鼠标”,然后使用action.actionPerformed ...按“F2”。 ...它的工作原理,在我的表格单元格渲染器中,我只允许日期值或无,而不是字符串,因此引发了AssertionError。这意味着我已经设法模拟F2键按下(注意虽然此操作的名称是“startEditing”,但它也会在现实生活中停止编辑会话,如测试中那样)。

...我可以满足于使用editCellAt,并确定F2在右侧InputMap中有正确的条目,并且弹出的值是一个名为“startEditing”的Action(可以检查),事实证明它能够结束编辑,我可以只是满足于此。

但是当我的理解被证明不够好时,我非常讨厌它!我想知道为什么这不起作用......

1 个答案:

答案 0 :(得分:0)

找到答案并将其放在此处供参考。

我对JTable的requestFocus()操作确实在右行上留下了选择,但没有选择任何(单个)列。即使正常运行(未测试),JTable列最初也不响应F2。令我感到困惑的是,为什么这个牢房最初并没有被厚重的黑色边框包围。因此,答案是将此行放在requestFocus行之后:

dates_table.setColumnSelectionInterval( 0, 0 )