【问题标题】:TestFX doesn't work when testing setOnKeyPressed on a Pane在窗格上测试 setOnKeyPressed 时,TestFX 不起作用
【发布时间】:2020-09-10 04:53:31
【问题描述】:

我在使用 TestFx 测试 JavaFX 应用程序时遇到问题。 我放了一个示例,仅使用 VBox 而不是我在实际应用程序中使用的 BorderPane。我只是用画布填充窗格,不要让它为空,但有或没有任何变化。

public class MainPanelTest extends ApplicationTest {

    Pane toTest;
    boolean pressed = false;

    @Override
    public void start(Stage stage) {
        toTest= new VBox(new Canvas(800,800));
        toTest.setOnKeyPressed(e -> {
                     System.out.println("Pressed");
                     pressed = true;
        });
        stage.setScene(new Scene(toTest));
        stage.show();
        stage.toFront();
    }

    @Test
    public void test_keyPressed_D() {
        clickOn(toTest);
        press(KeyCode.D);
        WaitForAsyncUtils.waitForFxEvents();
        assertTrue(pressed);
    }
}

例如,如果我使用 TextField 而不是窗格,则一切正常:

public class MainPanelTest extends ApplicationTest {

    TextField toTest;
    boolean pressed = false;

    @Override
    public void start(Stage stage) {
        toTest= new TextField();
        toTest.setOnKeyPressed(e -> {
                     System.out.println("Pressed");
                     pressed = true;
        });
        stage.setScene(new Scene(toTest));
        stage.show();
        stage.toFront();
    }

    @Test
    public void test_keyPressed_D() {
        clickOn(toTest);
        press(KeyCode.D);
        WaitForAsyncUtils.waitForFxEvents();
        assertTrue(pressed);
    }
}

这里有什么我遗漏的吗?在实际应用中,当我按下一个键时,事件被正确捕获。

【问题讨论】:

  • 密钥只传递给focusOwner
  • 谢谢,但我该如何测试呢?在按键之前我已经模拟了面板上的点击,不应该关注它吗?而在实际应用中,如果我按下一个键,事件就会被处理,那么如何在 testfx 中模拟呢?
  • 我想补充一点,如果 Pane 有 setOnKeyPressed 方法,这意味着它可以管理按键的按下,并且实际上在实际应用程序中它可以工作。问题只是在 TestFx 中,或者我的设置有问题。你能告诉我一个测试它的方法吗?

标签: javafx testfx


【解决方案1】:

我想出了如何测试它,它需要为窗格显式请求焦点。 只需添加这一行toTest.requestFocus();

本次测试通过:

public class MainPanelTest extends ApplicationTest {

    Pane toTest;
    boolean pressed = false;

    @Override
    public void start(Stage stage) {
        toTest= new VBox(new Canvas(800,800));
        toTest.setOnKeyPressed(e -> {
                     System.out.println("Pressed");
                     pressed = true;
        });
        stage.setScene(new Scene(toTest));
        stage.show();
        toTest.requestFocus();
    }

    @Test
    public void test_keyPressed_D() {        
        press(KeyCode.D);
        WaitForAsyncUtils.waitForFxEvents();
        assertTrue(pressed);
    }
}

【讨论】:

    猜你喜欢
    • 2016-04-13
    • 2018-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-10
    • 1970-01-01
    • 1970-01-01
    • 2015-02-08
    相关资源
    最近更新 更多