2013-04-12 1 views
0

Je veux désactiver un bouton sur le cadre à partir d'un JDialog, J'ai tout essayé mais cela ne fonctionnera pas. L'exécution du programme commence à partir d'une image et lorsque le bouton est cliqué, la boîte de dialogue s'affiche. Simple, lorsque vous cliquez sur le bouton dans la boîte de dialogue, le bouton du cadre doit être désactivé et la boîte de dialogue se ferme.Impossible de désactiver le bouton d'image de JDialog

BTW: tout fonctionne, c'est juste le bouton du cadre qui n'est pas désactivé! PS: Je suis en train de coder ceci sur NetBeans, donc j'ai supprimé le codage inutile par souci de simplicité.

Voici le codage pour le cadre:

public class Frame extends javax.swing.JFrame { 

Dialog D = new Dialog(this, true); 

public Frame(){ 
    setTitle("Frame"); 
    initComponents(); 
    setResizable(false); 
} 

void buttonDisable(){ 
    Btn1.setEnabled(false); 
} 

private void Btn1ActionPerformed(java.awt.event.ActionEvent evt) {          
    D.setVisible(true); 
}          

public static void main(String args[]) { 

    java.awt.EventQueue.invokeLater(new Runnable() { 
     @Override 
     public void run() { 
      new Frame().setVisible(true); 
     } 
    }); 
} 
// Variables declaration - do not modify      
public javax.swing.JButton Btn1; 
// End of variables declaration     
} 

Voici le codage pour la JDialog Box:

public class Dialog extends javax.swing.JDialog { 

public Dialog(java.awt.Frame parent, boolean modal) { 
    super(parent, modal); 
    initComponents(); 
    setTitle("Dialog"); 
}      

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {           
    new Frame().buttonDisable(); 
    dispose(); 
}           



public static void main(String args[]) { 

    java.awt.EventQueue.invokeLater(new Runnable() { 
     public void run() { 
      Dialog dialog = new Dialog(new javax.swing.JFrame(), true); 
      dialog.addWindowListener(new java.awt.event.WindowAdapter() { 
       @Override 
       public void windowClosing(java.awt.event.WindowEvent e) { 
        System.exit(0); 
       } 
      }); 
      dialog.setVisible(true); 
     } 
    }); 
} 
// Variables declaration - do not modify      
private javax.swing.JButton jButton1; 
// End of variables declaration     
} 

Répondre

2

Je n'ai pas exécuter ce à travers un IDE. Mais je suis assez confiant qu'appeler buttonDisable() sur un nouveau Frame() au lieu de l'appeler sur le cadre parent réel est votre problème. Vous devez enregistrer votre "parent" dans votre boîte de dialogue pour pouvoir y accéder plus tard et faire quelque chose comme ça dans votre boîte de dialogue.

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {           
    parentFrame.buttonDisable(); 
    dispose(); 
}  

donc votre code complet ressemblerait à ceci:

public class Frame extends javax.swing.JFrame { 

Dialog d = new Dialog(this, true); 

public Frame(){ 
    setTitle("Frame"); 
    initComponents(); 
    setResizable(false); 
} 

void buttonDisable(){ 
    Btn1.setEnabled(false); 
} 

private void Btn1ActionPerformed(java.awt.event.ActionEvent evt) {          
    d.setVisible(true); 
}          

public static void main(String args[]) { 

    java.awt.EventQueue.invokeLater(new Runnable() { 
     @Override 
     public void run() { 
      new Frame().setVisible(true); 
     } 
    }); 
} 
// Variables declaration - do not modify      
public javax.swing.JButton Btn1; 
// End of variables declaration     
} 

et la boîte de dialogue se présente comme suit

public class Dialog extends javax.swing.JDialog { 

private Frame parentFrame; 
public Dialog(Frame parent, boolean modal) { 
    super(parent, modal); 
    initComponents(); 
    setTitle("Dialog"); 

    this.parentFrame=parent;//hold reference to the parent 

    this.setVisible(true); 
}      

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {           
    this.parentFrame.buttonDisable();//invoke method on the parent reference 
    dispose(); 
}           


// Variables declaration - do not modify      
private javax.swing.JButton jButton1; 
// End of variables declaration     
} 
+0

Je viens d'essayer cela, il ne fonctionne pas. Que voulez-vous dire en sauvant le parent dans le dialogue? – Anafam

+0

@Anafam vous n'appelez pas buttonDisable sur la bonne instance. En effet, vous devriez garder une référence à l'image d'origine et appeler buttonDisable sur cette image (à la place, vous créez une nouvelle image qui est différente de la première). Vous devriez probablement revoir les concepts de base de Java pour bien comprendre votre problème. –

+0

Dans votre code Frame, vous créez une variable privée Dialog (pas vraiment selon les règles de nommage, mais c'est en plus du point) qui reçoit "this" comme argument. Quand nous regardons votre code Dialog, nous voyons ce beau constructeur qui obtient le cadre, et utilise simplement le cadre pour appeler le super(). Mais ce que vous voulez réellement, c'est enregistrer ce parent dans une variable privée afin que vous puissiez y accéder plus tard, quand vous en avez réellement besoin pour pouvoir déclencher des fonctionnalités spécifiques sur ce parent. Je ne comprends pas non plus pourquoi vous avez besoin d'une deuxième ligne principale dans votre boîte de dialogue – 3xil3