0

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

顺便说一句:一切正常,它只是没有被禁用的框架按钮! 这是它的样子

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                   
}
4

1 回答 1

2

我还没有通过 IDE 运行它。但我相当有信心在 new 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                   
}
于 2013-04-12T22:11:46.350 回答