【问题标题】:Learning Java: cannot call a method [closed]学习Java:不能调用方法[关闭]
【发布时间】:2013-12-06 22:45:14
【问题描述】:

我对应用程序开发很陌生,所以我希望你们能教一两件事。

我得到了 1 个JFrame 和 1 个JTextField。我使用的方法每次单击按钮时都会返回一个数字并将其写入JTextfield

有效!但是,问题是当我希望该方法有自己的类时。

我在我的方法类中得到了这个:

打包新包;

package test;

public class class1 extends class2 {

    class2 testingobj = null;

    /** this is the constructor. It is given a parameter, so it knows 
     *  about the class2
     */
    public class1(class2 frame) {
        this.testingobj = frame;
    }

    private int num = 0;

    public int testing(){
        if(num <=8){
            num ++;
            testingobj.jTextField1.setText("" +num);
        }
        return num;
    }
}

这在我的课堂上使用Jbutton 和`JTextField':

 /*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package test;

/**
 *
 * @author Admin
 */
public class class2 extends javax.swing.JFrame {

    class1 testing2ndobj = new class1(this);

    /**
     * Creates new form class2
     */
    public class2() {
        initComponents();
    }

    /**
     * This method is called from within the constructor to initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is always
     * regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">                          
    private void initComponents() {

        jTextField1 = new javax.swing.JTextField();
        jButton1 = new javax.swing.JButton();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

        jButton1.setText("jButton1");
        jButton1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton1ActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGap(122, 122, 122)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(jButton1)
                    .addComponent(jTextField1, javax.swing.GroupLayout.PREFERRED_SIZE, 199, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addContainerGap(79, Short.MAX_VALUE))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGap(73, 73, 73)
                .addComponent(jButton1)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addComponent(jTextField1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(173, Short.MAX_VALUE))
        );

        pack();
    }// </editor-fold>                        

    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
testing2ndobj.testing();
    }                                        

    /**
     * @param args the command line arguments
     */
    public static void main(String args[]) {
        /* Set the Nimbus look and feel */
        //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
        /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.
         * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html 
         */
        try {
            for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
                if ("Nimbus".equals(info.getName())) {
                    javax.swing.UIManager.setLookAndFeel(info.getClassName());
                    break;
                }
            }
        } catch (ClassNotFoundException ex) {
            java.util.logging.Logger.getLogger(class2.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (InstantiationException ex) {
            java.util.logging.Logger.getLogger(class2.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (IllegalAccessException ex) {
            java.util.logging.Logger.getLogger(class2.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (javax.swing.UnsupportedLookAndFeelException ex) {
            java.util.logging.Logger.getLogger(class2.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        }
        //</editor-fold>

        /* Create and display the form */
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new class2().setVisible(true);
            }
        });
    }

    // Variables declaration - do not modify                     
    private javax.swing.JButton jButton1;
    public javax.swing.JTextField jTextField1;
    // End of variables declaration                   
}

问题 1) 我可以运行应用程序,但是当我按下按钮时没有任何反应。这是为什么?当我跨班级工作时,有什么我必须记住的黄金法则吗?

谢谢!

编辑:已解决。

【问题讨论】:

  • 风格注释:Java 类使用 CamelCase 命名。不要使用小写的首字母。
  • 真的很乱,我想试试,但不想花时间读完这本小说。
  • 对于初学者,在示例中您通常应该说Class2 extends Class1,而不是相反,并且Class2 很少同时拥有-A Class1 (testingobj) 和 Be -A Class1 (extends)。很难准确说出您的意图。
  • 看起来您的 main 方法在您的 actionPerformed 方法中。我错过了右括号吗?如果是错字,请编辑您的问题
  • 你把相关部分也拿出来了,这段代码连编译都编译不了。您必须以某种方式将事件处理程序(可能是jButton1ActionPerformed)附加到按钮,而且很可能您没有这样做。

标签: java class object methods


【解决方案1】:

据我所知,您在这里混合了面向对象和简单模块原则。 我想,您的主要目的是拥有一个模块(您已将其实现为class1)和一个模块,您已将其实现为class2

鉴于此,您正在使用不同的机制来尝试将两个模块联系在一起。 您正在使用 class1 extends class2 并且正在使用类型为 class1class2 的属性/字段/变量。

在我们继续之前,请注意您的问题的 cmets:java 中的类名以大写开头,例如Class2MyWindowMyFrame(这两个名字都比前者好)。

现在到继承的东西。你有class2,它扩展了JFrame,没关系。您希望 class2 成为“框架”(就此而言,是一个窗口)。

但是你也写class1扩展class2,所以class1也是JFrame,因为class2JFrame。这不是你想要的。

您的意图是拥有一个单独的模块,因此您应该将class1(或MyController 再次作为更好的名称)声明为

public class class1 {
   ...
}

没有扩展的东西。

接下来,您需要了解,类只是实际“对象”的抽象“模板”。要将一个类变成一个真实的对象,您需要调用构造函数(例如,new class1())。构造函数可以看作是一个特殊的方法,它使用new 关键字调用并返回给定类型的new 对象(在本例中为class1)。

您需要和想要的是将两个类连接在一起。目前,您的main 创建了一个class2 的实例,它创建了一个class1 的实例,它再次创建了一个class2 的(不同的!)实例。在您的代码中,每个对象只知道其他对象,它使用new 创建,但不知道创建 this 对象的对象。

所以main 知道class2 的第一个实例。这知道class1 的实例。这知道它设置文本字段的class2 的第二个实例。但由于class2 的第二个实例不可见(因为setVisible() 仅在第一个实例中调用),所以按下按钮时您看不到任何内容。

你应该做的是如下实现class1

public class class1 extends class2 {

    class2 testingobj = null;

    /** this is the constructor. It is given a parameter, so it knows 
     *  about the class2
     */
    public class1(class2 frame) {
        this.testingobj = frame;
    }

    private int num = 0;

    public int testing(){
        if(num <=8){
            num ++;
            testingobj.jTextField1.setText("" +num);
        }
        return num;
    }
}

在你的class2 中你应该写

class1 testing2ndobj = new class1(this);

而不是

class1 testing2ndobj = new class1();

这会将 this class1 的引用提供给 class2,以便它可以访问正确的 JTextField

【讨论】:

  • 谢谢先生,成功了。很好的解释和回答。上帝保佑你。
【解决方案2】:

我对你的代码有评论,我不知道这是否有帮助。 您在 Class2 中使用 Class1 的聚合,但在 Class1 中您进行了继承。如果关系不是继承,则应删除继承。

请在您的问题中将 jTextField1 放在 class2 中,让我知道您是如何获得它以及在调用方法 testing() 之前设置它的位置;

【讨论】:

    【解决方案3】:

    您在错误的class2 实例上调用setText。这是我看到的调用堆栈:

    1. main 方法创建一个class2 实例。
    2. (我假设您单击此处的按钮)
    3. class2 实例中的事件处理程序创建一个 class1 实例
    4. 新的class1 实例创建了一个新的class2 实例(main 创建的实例分开
    5. class2 实例在class1 实例上调用testing()
    6. class1 实例调用其内部class2 实例上的方法。这会在 class2 实例上设置不可见的文本。

    如果您的testing() 方法需要在一个单独的类中,但影响到主class2 实例,您应该在构造函数中将class2 实例传递给class1

    public class class1 extends class2 {
    
      // NO! class2 testingobj = new class2();
    
      private class2 testingobj;
      public class1(class2 dependency) {
        testingobj = dependency;
      }
    

    【讨论】:

      猜你喜欢
      • 2012-01-31
      • 2014-03-15
      • 1970-01-01
      • 1970-01-01
      • 2011-10-18
      • 1970-01-01
      • 1970-01-01
      • 2010-09-06
      • 1970-01-01
      相关资源
      最近更新 更多