Hacktoberfest 2026: as issues que os mantenedores marcaram para outubro, abertas e boas para iniciantes. Ver issues do Hacktoberfest

Stuck waiting for event queue when DialogWrapper is created dynamically

Aberta
#239 0 comentários 0 reações 0 responsáveis Ver no GitHub

Ninguém assumiu esta issue ainda.

Avaliação

Dificuldade
4/5
Tempo estimado
3-5 dias
Facilidade para iniciantes
35/100
Tipo de issue
Bug
Clareza
Razoavelmente clara
Status de atividade
Estagnada
Stack de tecnologia
java
Domínio
desktop, testing

Direção de pesquisa

Comece pelo projeto mínimo na issue, especialmente pelo DialogTest e pelo caminho de criação de DialogWrapper, e execute ./gradlew test (ou gradlew test no Windows). Compare os atrasos relatados com a solução alternativa de JDialog; considera-se concluído quando as interações com DialogWrapper criados dinamicamente não forem mais bloqueadas pelos atrasos relatados e o teste de reprodução passar.

Escrita pelo modelo de indexação a partir do texto da issue.

Descrição

Issue

I use IntelliJ's DialogWrapper to show dialogs in an IntelliJ plugin. This dialog is opened by a different window. When trying to simulate input events using AssertJ Swing, however, simply changing the text of an input box easily takes 30 seconds. Clicking a button takes 11 seconds.

The issue seems to be that, once the sub-dialog has been opened, the robot gets stuck in waitForIdle(EventQueue). This makes this issue related to #13 and #201. The difference is that I do not use a custom event queue.

Reproducible example

I have created a minimal reproducible example. The code can be found below.

Java code

package com.fwdekker.assertjswingtest;

import com.intellij.openapi.ui.DialogWrapper;
import org.assertj.swing.edt.GuiActionRunner;
import org.assertj.swing.fixture.FrameFixture;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;

import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JPanel;

import static org.assertj.swing.fixture.Containers.showInFrame;

// Uses AssertJ Swing to test the interaction between the dialogs.
class DialogTest {
    private FrameFixture frame;

    @BeforeEach
    void beforeEach() {
        frame = showInFrame(GuiActionRunner.execute(MainDialog::new).getRootPane());
    }

    @AfterEach
    void afterEach() {
        frame.cleanUp();
    }

    @Test
    void myTest() {
        // This action takes 10 seconds
        frame.button("mainButton").click();
    }
}

// The main dialog that opens the sub-dialog.
class MainDialog extends JDialog {
    MainDialog() {
        JPanel contentPane = new JPanel();
        JButton mainButton = new JButton("Open");
        mainButton.setName("mainButton");
        mainButton.addActionListener(e -> new SubDialog().showAndGet());
        contentPane.add(mainButton);

        setContentPane(contentPane);
        setModal(true);
        pack();
    }
}

// The sub-dialog using IntelliJ's `DialogWrapper`.
class SubDialog extends DialogWrapper {
    private JPanel contentPane = new JPanel();

    SubDialog() {
        super(null);
        init();
    }

    @Override
    protected JPanel createCenterPanel() {
        return contentPane;
    }
}

Gradle build file

plugins {
    id "java"
    id "org.jetbrains.intellij" version "0.4.9"
}

repositories {
    mavenCentral()
}

dependencies {
    testCompile group: "org.assertj", name: "assertj-core", version: "3.8.0"
    testCompile group: "org.assertj", name: "assertj-swing-junit", version: "3.8.0"
    testCompile group: "org.junit.jupiter", name: "junit-jupiter-api", version: "5.5.0"
    testCompile group: "org.junit.jupiter", name: "junit-jupiter-engine", version: "5.5.0"
}

intellij {
    version = "2019.1.1"
}

test {
    useJUnitPlatform()
}

Alternatively, download a .zip of the minimal project. You can run the test from the command line with ./gradlew test (Unix-like) or gradlew test (Windows).

Workarounds

I was able to find two workarounds for this issue. They are suboptimal solutions, but may be useful for others who have this issue:

  • Replacing the DialogWrapper with a conventional JDialog fixes the issue, but is not feasible for my use case.
  • Moving the creation of the sub-dialog outside of the button's action listener fixes the issue, but I do not think this is the idiomatic way of creating dialogs.
Linguagem predominante
Java
Estrelas
121
Forks
52
Métricas de merge de PRs
Nenhum PR com merge em 30d

Preparar o ambiente

Primeiros passos

  1. Leia a issue inteira e depois o guia de contribuição do projeto.
  2. Comente na issue dizendo que vai assumir — evita que duas pessoas façam o mesmo trabalho.
  3. Faça um fork do repositório e trabalhe em uma branch.
  4. Abra um pull request que referencie o número da issue.

Mais de assertj/assertj-swing

Todas as issues de assertj/assertj-swing

Issues semelhantes

Mais issues de Java

Receba novas issues na sua caixa de entrada

Um resumo curto de issues do GitHub para quem está começando.