1

使用 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);
    }
}

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

4

1 回答 1

2

我想出了如何测试它,需要明确请求窗格的焦点。只需添加这一行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);
    }
}
于 2020-05-24T10:24:19.070 回答