2013-04-12 37 views
0

我想禁用JDialog框架上的按钮,我尝试了一切,但它不起作用。该程序的执行从一个框架开始,当点击该按钮时,弹出对话框。很简单,当你点击对话框上的按钮时,框架的按钮应该被禁用,对话框将关闭。无法从JDialog禁用框架按钮

顺便说一句:一切正常,它只是框架的按钮,不会被禁用! 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盒编码:

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运行此。但我相当确信,在新的Frame()上调用buttonDisable()而不是在实际的父框架上调用它是您的问题。 您需要将您的“父母”保存在您的对话框中,以便您稍后可以访问它,并在对话框中执行类似操作。

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(不是真正根据命名规则,但除此之外)接收“this”作为参数。当我们查看你的Dialog代码时,我们看到了这个很好的构造函数来获取Frame,并且只是使用框架来调用super()。但是你真正想要的是将这个父母保存到一个私有变量中,以便稍后可以访问它,当你真正需要它时,你可以在父母上触发一些特定的功能。 我还不清楚为什么在对话框中需要第二个主对话 – 3xil3