2017-06-13 4 views
0

J'ai écrit ma propre classe pour le dialogue modal, mais quand je l'appelle à partir de mon code, il n'y a pas de réaction sur les boutons en cliquant. Si je définis setModal(false) tout fonctionne très bien. Je suppose qu'il y a quelques problèmes avec la concurrence, mais je ne suis pas sûr à ce sujet. Où est mon erreur?ActionListeners ne fonctionne pas en modal JDialog

public class PauseTaskDialog extends JDialog { 

private JPanel contentPane; 
private JButton buttonOK; 
private JButton buttonCancel; 
private JCheckBox prioritisingCheckBox; 
private JCheckBox simultaneousWorkCheckBox; 
private JCheckBox problemsWithDataCheckBox; 
private JTextArea comment; 

private String taskID; 

public PauseTaskDialog(String task) { 

    this.setContentPane(contentPane); 
    this.setModal(true); 
    this.setLocationRelativeTo(null); 
    this.pack(); 

    this.setTitle("Task pause reasons"); 

    this.taskID = task; 

    comment.setFont(comment.getFont().deriveFont(14f)); 
    comment.setLineWrap(true); 
    comment.setWrapStyleWord(true); 

    buttonOK.addActionListener(e -> { 
     onOK(); 
    }); 

    buttonCancel.addActionListener(e -> { 
     onCancel(); 
    }); 

    this.setVisible(true); 
} 


private void onOK() { 
    // some code here   
} 

private void onCancel() { 
    // some code there 
} 
} 

J'appelle la boîte de dialogue de mon code de cette façon:

PauseTaskDialog dialog = new PauseTaskDialog(taskID); 
+0

ajoutez votre version java –

+0

@AdeelAhmed, 1.8.0_131 – whyiamhere

+0

Pour une meilleure aide plus rapidement, postez un [MCVE] ou [Short, Self Contained, Example correct] (http://www.sscce.org/). –

Répondre

1

De l'docs:

Note: modalité changement de la boîte de dialogue visible peut avoir aucun effet jusqu'à ce qu'il soit caché et ensuite montré à nouveau.

Essayez d'appeler setModal(true) avant setVisible.

Mais setModal est dépréciée, vous devez appeler au lieu setModalityType (le type dont vous avez besoin est probablement APPLICATION_MODAL), vérifier tutorial. cela n'a rien à voir avec JButton listeners ne fonctionne pas, si vous pouvez CLIQUEZ sur JButton alors cela signifie que vous exécutez leurs écouteurs (s'il y en a), si vous ne cliquez pas sur eux (JButton a une animation qui montre qu'ils sont cliqués) alors ils sont cachés/pas sur le front, cela n'a rien à voir avec la concurrence.

+0

Le problème est que l'animation du bouton est en cours d'exécution, mais une action pour ce bouton ne l'est pas. Le code dans ActionListeners ne démarre pas. La seule action que je peux effectuer dans cette boîte de dialogue consiste à cliquer sur le bouton Fermer (X) de la fenêtre. Lorsque je supprime la modalité, tout fonctionne correctement. – whyiamhere

+0

['setModel'] (https://docs.oracle.com/javase/8/docs/api/java/awt/Dialog.html#setModal-boolean-) est marqué comme obsolète, le' modilityType' fournit simplement plus contrôle flexible - juste dire;) – MadProgrammer

+0

Littéralement il y a cinq minutes, ça m'a frappé, j'ai compris ce que vous vouliez dire. Vous vouliez coller la ligne 'setModal()' ** juste avant ** (pas simplement quelque part auparavant) la ligne 'setVisible()'. Je suis désolé pour malentendu, l'anglais n'est pas ma langue maternelle. Bonne journée: D – whyiamhere