@Before public void setUp() {
Robot robot = BasicRobot.robotWithCurrentAwtHierarchy();
ApplicationLauncher.application("myApp").start();
Pause.pause(5, TimeUnit.SECONDS);
frame = WindowFinder.findFrame("frame0").using(robot);
JTableFixture table = frame.table(new GenericTypeMatcher<JTable>(JTable.class) {
@Override protected boolean isMatching(JTable table) {
return (table instanceof myTreeTable);
}
});
}
这段代码运行良好。如果我们删除 5 秒暂停,则找不到该表,因为应用程序需要几秒钟才能加载它。
我想知道是否有更干净的方法。我在 ApplicationLauncher 之后尝试使用 robots.waitForIdle() (我猜一旦 EDT 为空,所有内容都已加载),但它不起作用。
我知道暂停可以使用一些条件作为何时停止的事件,但我不明白如何编写它,因为JavaDoc和官方文档很差。
我明白了,我可能应该使用 ComponentFoundCondition,但我不明白!我厌倦了:
ComponentMatcher matcher = new GenericTypeMatcher<JTable>(JTable.class) {
@Override protected boolean isMatching(JTable table) {
return (table instanceof myTreeTable);
}
};
Pause.pause(new ComponentFoundCondition("DebugMsg", frame.robot.finder(), matcher));
有什么帮助吗?
您可以使用 ComponentFinder 来定位组件。例如,根据问题中的匹配器:
final ComponentMatcher matcher = new TypeMatcher(myTreeTable.class);
Pause.pause(new Condition("Waiting for myTreeTable") {
@Override
public boolean test() {
Collection<Component> list =
window.robot.finder().findAll(window.target, matcher);
return list.size() > 0;
}
}, 5000);
这是按名称查找的替代方法:
final ComponentMatcher nameMatcher = new ComponentMatcher(){
@Override
public boolean matches(Component c) {
return "ComponentName".equals(c.getName()) && c.isShowing();
}
};
Pause.pause(new Condition("Waiting") {
@Override
public boolean test() {
Collection<Component> list =
window.robot.finder().findAll(window.target, nameMatcher);
return list.size() > 0;
}
}, 5000);