Pergunta

    @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); 
             }  
        });
    }

Este código funciona bem.Se removermos a pausa de 5 segundos, a tabela não será encontrada porque o aplicativo leva alguns segundos para carregá-la.

Gostaria de saber se existe uma maneira mais limpa de fazer isso.Tentei com robot.waitForIdle() depois do ApplicationLauncher (acho que quando o EDT está vazio, tudo está carregado), mas simplesmente não funciona.

Eu sei que a pausa pode usar algumas condições como um evento sobre quando parar, mas não entendo como escrevê-la, pois o JavaDoc e o documento oficial são ruins.

  • Pause.pause(WaitForComponentToShowCondition.untilIsShowing(frame.component())) :Preciso de um componente, se eu passar o frame wrapper ele não funciona.E não posso passar da mesa porque é exatamente isso que estou esperando para conseguir.
  • Entendo que provavelmente deveria trabalhar com ComponentFoundCondition, mas não entendi!Cansei com:

           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)); 
    

Qualquer ajuda?

Foi útil?

Solução

Você poderia usar Localizador de Componentes para localizar o componente.Por exemplo, com base no matcher da pergunta:

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); 

Aqui está uma alternativa com pesquisa por nome:

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);
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top