2013-04-12 1 views
0

Я хочу отключить кнопку на кадре из JDialog, Я пробовал все, но это не сработает. Выполнение программы начинается с кадра и при нажатии кнопки открывается диалоговое окно. Просто, когда вы нажимаете кнопку в диалоговом окне, кнопка кадра должна быть отключена, и диалог закроется.Невозможно отключить кнопку кадра от JDialog

BTW: все работает, его просто кнопка рамки, которая не отключается! Here's what it looks like

PS: Я кодирую это на NetBeans, поэтому я просто удалил ненужное кодирование для простоты.

Вот кодирование для кадра:

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     
} 

Вот кодирование для 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     
} 

ответ

2

Я не запускать это через IDE. Но я уверен, что вызов buttonDisable() в новом Frame() вместо вызова его на фактическом родительском фрейме - ваша проблема. Вам нужно сохранить «родительский» в диалоговом окне, чтобы потом получить доступ к нему и сделать что-то подобное в диалоговом окне.

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

Таким образом, ваш полный код будет выглядеть следующим образом:

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     
} 

и диалоговое окно будет выглядеть следующим образом

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

Я просто попытался это, она не работает. Что вы подразумеваете, сохраняя родителя в диалоговом окне? – Anafam

+0

@Anafam, вы не вызываете buttonDisable в правильном экземпляре. Действительно, вы должны сохранить ссылку на исходный фрейм и вызвать buttonDisable в этом фрейме (вместо этого вы создаете новый фрейм, отличный от первого). Вероятно, вам следует рассмотреть основные понятия Java, чтобы полностью понять вашу проблему. –

+0

В вашем коде фрейма вы создаете приватную переменную Dialog (не в соответствии с правилами именования, но это помимо точки), которая получает «это» в качестве аргумента. Когда мы смотрим на ваш код Dialog, мы видим этот красивый конструктор, который получает Frame, и просто использует фрейм для вызова super(). Но то, что вы на самом деле хотите, - это сохранить этот родительский элемент в частной переменной, чтобы впоследствии вы могли получить к нему доступ, когда вам действительно нужно, чтобы вы могли запускать некоторые определенные функции для этого родителя. Я также не понимаю, почему вам нужно второе главное в вашем диалоговом окне – 3xil3