¿Por qué necesitamos ampliar JFrame en un columpio aplicación?

¿Por qué necesitamos ampliar la JFrame clase cuando la construcción de una aplicación Swing. Que yo sepa extends se utiliza para heredar de la clase base. Ninguna de las funciones de la JFrame clase se utilizan en el programa siguiente, pero todavía está extendida. Sé que estoy perdiendo parte de la información. Es como algunas de las funciones de la clase JFrame se ejecutan en segundo plano.

1) Código

import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import javax.swing.JFrame;
import javax.swing.JTextField;
import javax.swing.JPasswordField;
import javax.swing.JOptionPane;

public class tuna extends JFrame{

   private JTextField item1;
   private JTextField item2;
   private JTextField item3;
   private JPasswordField passwordField;
   Container contentPane ;
   public tuna(){
      super("The title");

      setLayout(new FlowLayout());

      item1 = new JTextField(10);
      contentPane.add(item1);

      item2 = new JTextField("enter text here");
      add(item2);

      item3 = new JTextField("uneditable", 20);
      item3.setEditable(false);
      add(item3);

      passwordField = new JPasswordField("mypass");
      add(passwordField);

      thehandler handler = new thehandler();

      item1.addActionListener(handler);
      item2.addActionListener(handler);
      item3.addActionListener(handler);
      passwordField.addActionListener(handler);
   }

   public static void main(String[] args){
      tuna aye = new tuna();
   }

   private class thehandler implements ActionListener{

      public void actionPerformed(ActionEvent event){
         String string = "";

         if(event.getSource()==item1)
            string=String.format("field 1: %s",event.getActionCommand());
         else if (event.getSource()==item2)
            string=String.format("field 2: %s",event.getActionCommand());
         else if (event.getSource()==item3)
            string=String.format("field 3: %s",event.getActionCommand());
         else if (event.getSource()==passwordField)
            string=String.format("password field is: %", event.getActionCommand());
      }
   }
}
  • La premisa de esta pregunta es falso. Usted no tiene que extender un JFrame con el fin de usarlo.
  • en realidad, usted no debe extender un JFrame (ni de cualquier otra clase, excepto cuando realmente mejorar la funcionalidad, que es implementar algo que no puede lograrse mediante el uso de/configuración de esa clase) – la mayoría de los tutoriales y Netbeans están dando malos ejemplos 🙂

4 Kommentare

  1. 16

    No es necesario extender JFrame y de hecho muchos de nosotros que hacer un montón de Oscilación de programación hacen que sea un punto de no para extender esta clase. Yo, trato de extender clases, donde tengo la intención de alterar el comportamiento natural de la clase, es decir, reemplazar a uno de los métodos no estáticos de la clase. Ya que rara vez tienen que hacer esto para un JFrame, yo rara vez va a querer extenderlo.

    Otra razón para evitar la ampliación de: ¿y si más adelante desea mostrar la interfaz gráfica de usuario que acabas de crear en un JDialog o un JOptionPane o en otro recipiente, como parte de una compleja interfaz gráfica de usuario? Si la clase se extiende JFrame esto va a ser difícil de hacer. Yo, trato de engranaje mi GUI clases hacia la creación de JPanels así que esto es mucho más fácil de hacer.

    Un ejemplo tonto, basado en el código:

    import javax.swing.*;
    
    //this guy extends *nothing*
    public class TunaExample {
       private static final int COLS = 10;
       private JPanel mainPanel = new JPanel(); //this is what I'll add to contentPane
       private JTextField field1 = new JTextField(COLS);
       private JTextField field2 = new JTextField(COLS);
       private JPasswordField passwordField = new JPasswordField(COLS);
       private JComponent[] allComponents = { new JLabel("Field 1:"), field1,
             new JLabel("Field 2:"), field2, new JLabel("Password:"), passwordField };
    
       public TunaExample() {
          field2.setEditable(false);
          field2.setFocusable(false);
          field1.setText("Field 1");
          field2.setText("Uneditable");
    
          for (JComponent comp : allComponents) {
             mainPanel.add(comp);
          }
       }
    
       public JComponent getMainComponent() {
          return mainPanel;
       }
    
       private static void createAndShowGui() {
          TunaExample tunaExample = new TunaExample();
    
          //creating my JFrame only when I need it and where I need it
          JFrame frame = new JFrame("Tuna Example");
          frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
          frame.getContentPane().add(tunaExample.getMainComponent());
          frame.pack();
          frame.setLocationByPlatform(true);
          frame.setVisible(true);
       }
    
       public static void main(String[] args) {
          SwingUtilities.invokeLater(new Runnable() {
             public void run() {
                createAndShowGui();
             }
          });
       }
    }
  2. 4

    La primera cosa a tener en cuenta en el código es este:

    super("The title");

    Esta realidad llama a la JFrame constructor, y se la pasó "The title" como una Cadena de título. Este es un ejemplo claro de la utilización de la Jframe funcionalidad en el código. Esto creará la ventana que aparece para usted.

    Usando métodos como la add son todos heredados de la JFrame clase. Estas agregar Components al objeto JFrame.

    ¿por Qué la Herencia?

    Bien, simplemente, la clase ES un JFrame, con un poco de más. Cuando usted tiene un Is A operación, utilizar la herencia. La otra ventaja de este método es que la clase puede ser referido como un JFrame. Que es:

    JFrame tuna = new tuna();
    //Note: All classes are meant to start with a capital letter.

    Otro punto de vista

    Es importante tener en cuenta que usted no estrictamente TIENEN QUE heredar de una clase JFrame. Usted puede utilizar Composition. En este caso tendrías algo como:

     public class Tuna {
          private JFrame parentWindow;
          //Rest of class.
     }

    Como se mencionó anteriormente, la convención es seguir la Is A y Has A enfoque. Si la clase A Es un ejemplo de la clase B, tendemos a utilizar la herencia. Si la clase A tiene una instancia de la clase B, a continuación, utilizar la composición, aunque en la mayoría de los casos, la herencia es intercambiable con la Composición.

    Otro otro punto de vista

    Como se ha mencionado en los comentarios, siempre se debe buscar una API existentes que ofrece este tipo de funcionalidad, antes de intentar aplicar a ti mismo.

    • Tengo una pregunta más. Cuando estoy escribiendo JFrame tuna = new tuna(); estoy creando un objeto de la clase JFrame o me estoy refiriendo a la tuna clase JFrame
    • usted está haciendo ambos. Se está creando un objeto de atún (que debe ser nombrado «Atún», ya que es una clase), pero dado que el Atún extends JFrame, también es JFrame. Se llevará a cabo por un JFrame variable, aunque por lo que la variable no será capaz de hacer referencia a cualquiera de los nuevos métodos que no son ya parte de JFrame. 1+ a Chris decente de respuesta por el camino.
    • Aprender algo nuevo cada día!
    • una regla de oro es: nunca extender si se puede llegar a la misma por con api existentes. En consecuencia, la mayoría de la parte posterior de su respuesta es .. subóptima 🙂 Y la herencia es intercambiable con la Composición de la, es simplemente incorrecto
    • En la mayoría de los casos, usted puede conseguir la misma funcionalidad con la Composición como usted puede con la herencia. Yo creo que es un perfecto sonido declaración. OP de la pregunta era acerca de porque nos heredar de una superclase en el contexto de un JFrame. Creo que me he explicado muy bien. Yo no creo que acerca de la API, y voy a editar que ahora.
    • la repetición de una declaración incorrecta no es hacer lo correcto 😉
    • Ser condescendiente tampoco ayuda. Puede usted explicar por qué es una declaración incorrecta?
    • seguro que – como puede (mejor que yo) seria de libros de texto en OO básicos. No condescendiente con la intención, por cierto.
    • De acuerdo, pero ¿podría resumir rápidamente para mí? Si es de aquí, cualquier otros lectores podrán ver este y puedo enmendar mi respuesta en consecuencia.

  3. 2

    Utilizar JFrame en su aplicación se puede extender como usted lo hizo en su código, o hacer una object como

    JFrame frame= new JFrame();

    y, a continuación, usted puede hacerlo

    frame.setTitle("Title");
    frame.setLayout(layout);

    hacerlo en cualquier forma que son fáciles, pero el uso de JFrame en la Aplicación y acceder a sus métodos, etc usted tiene que utilizar uno de estos métodos

  4. 0

    Si quieres crear una aplicación independiente, puede extender JPanel o JFrame o crear su instancia en la implementación de la clase.

    Como una regla, una aplicación independiente con un Swing GUI basada en tiene al menos una jerarquía de contención con un JFrame como su raíz. Por ejemplo, si una aplicación tiene una ventana principal y dos cuadros de diálogo, a continuación, la aplicación tiene tres contención de las jerarquías, y por lo tanto, tres de nivel superior de los contenedores. http://docs.oracle.com/javase/tutorial/uiswing/components/toplevel.html?

    http://docs.oracle.com/javase/tutorial/uiswing/components/frame.html

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea