2013-12-06 9 views
0

Я очень новичок в разработке приложений, поэтому надеюсь, вы, ребята, можете научить кое-что.Изучение Java: нельзя назвать метод

Я получил 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) Я могу запустить приложение, но ничего не происходит, когда я нажимаю на кнопку. Почему это? Есть ли какое-нибудь золотое правило, которое я должен помнить, когда я работаю по классам?

Спасибо!

EDIT: Решено.

+2

примечание стиля: классы Java используют имена CamelCase. Не используйте строчные буквы первой строчки. –

+0

это действительно грязно, я бы попытался, но не хочу тратить время на чтение этого романа. – MightyPork

+0

Для начала, в примерах, вы обычно должны сказать, что 'Class2 расширяет Class1', а не наоборот, и для класса Class2 редко встречается как A-A' Class1' ('testobj'), так и Be-A' Class1' ('extends'). Трудно точно сказать, что вы намереваетесь. – chrylis

ответ

0

Насколько я могу видеть , вы смешиваете объектно-ориентированные и простые принципы модуля здесь. Я предполагаю, что вы в первую очередь намерены иметь модуль (который вы поняли как class1) и модуль, который вы поняли как class2.

Учитывая, что вы используете разные механизмы, которые пытаются связать оба модуля вместе. Вы используете class1 extends class2, и вы используете атрибуты/поля/переменные, которые напечатаны как class1 и class2.

Прежде чем продолжить, обратите внимание на комментарии к вашему вопросу: имена классов в java начинаются с капитала, например. Class2, или MyWindow или MyFrame (оба из них были бы лучше имен, чем прежние).

Теперь, чтобы наследовать вещи. У вас есть class2, который распространяется на JFrame, и это нормально. Вы хотите, чтобы class2 был «рамкой» (окно, если на то пошло).

Но вы также пишете class1 расширяет class2, так class1 также является JFrame, потому что class2 является JFrame. Это не то, что вы намерены.

Что вы намерены, является наличие отдельного модуля, так что вы должны просто объявить class1 (или MyController как лучшее имя, опять же), как

public class class1 { 
    ... 
} 

без расширяет материал.

Далее, вам нужно понять, что классы - это только абстрактные «шаблоны» фактических «объектов». Чтобы создать класс в реальном объекте, вы вызываете конструктор (например, new class1()). Конструктор можно рассматривать как специальный метод, который вызывается с ключевым словом new и который возвращает объект нового данного типа (class1 в этом примере).

Что нужно и нужно, так это объединить оба класса. В настоящее время ваш main создает экземпляр class2, который создает экземпляр class1, который снова создает экземпляр (другой!) class2. В вашем коде каждый объект знает только о других объектах, он создает с new, но не об объекте, который создал этот объект.

Так 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(); 

Это даст справку о этоclass1 - class2, чтобы получить доступ к правильному JTextField.

+0

Спасибо, сэр, это сработало. Очень хорошее объяснение и ответ. Будьте здоровы. – user3074245

0

У меня есть комментарий к вашему коду, я не знаю, поможет ли это или нет. Вы используете агрегацию для Class1 внутри Class2, но в Class1 вы сделали наследование. Вы должны удалить наследование, если отношение не является наследованием.

Просьба также указать в свой вопрос jTextField1 внутри класса2, чтобы я мог узнать, как вы его получили и где вы установили его перед вызовом метода test();

0

Вы звоните в номер setText в другом месте class2. Вот стек вызовов, который я вижу:

  1. Основной метод создает экземпляр class2.
  2. (я предполагаю, что вы нажимаете на кнопку здесь)
  3. обработчик событий в вашем class2 экземпляра создает экземпляр class1
  4. Новый class1 экземпляр создает новый экземпляр class2 (, отдельный от экземпляра, созданного по main)
  5. Основной номер class2 экземпляров тел testing() на примере class1.
  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; 
    } 
Смежные вопросы