Extiende JFrame versus crearlo dentro del programa

Resuelto satnam asked hace 10 años • 6 respuestas

Al crear una aplicación usando Swing, he visto a personas hacer una de las dos cosas para crear un JFrame. ¿Cuál es un mejor enfoque y por qué?

Soy un principiante en Java y programación. Mi única fuente de aprendizaje son los libros, YouTube y Stack Overflow.

import {imports};

public class GuiApp1 {

    public static void main(String[] args) {

        new GuiApp1();
    }

    public GuiApp1()  {
        JFrame guiFrame = new JFrame();

        guiFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        guiFrame.setTitle("Example GUI");
        guiFrame.setSize(300,250);
        ................
    }

Y

import {imports};

public class GuiApp1 extends JFrame {

    public Execute() {
        getContentPane().setBackground(Color.WHITE);
        getContentPane().setLayout(null);
        setSize(800, 600);
        .............
    }

    public static void main(String[] args) {
        Execute frame1 = new Execute();
        frame1.setVisible(true);

    }
}
satnam avatar Feb 25 '14 10:02 satnam
Aceptado

Pensamientos:

  • Evite extender JFrame ya que vincula su GUI a ser, bueno, un JFrame. Si, en cambio, se concentra en crear JPanels, entonces tendrá la libertad de usar estos JPanels en cualquier lugar que necesite: en un JFrame, JDialog, JApplet, o dentro de otro JPanel, o intercambiándolos con otros JPanels a través de un CardLayout.
  • Evite la herencia en general, especialmente de clases complejas. Esto evitará errores perniciosos, como anulaciones involuntarias de métodos (intente crear un JFrame o JPanel que tenga un método getX()y getY()para ver a qué me refiero).
  • Evite la herencia de clases complejas si está utilizando un IDE: si anula una clase compleja, cuando llame a métodos en objetos de estas clases, se le ofrecerán muchas, demasiadas opciones de métodos.
  • La encapsulación es buena, lo es y permite la creación de código más seguro. Exponga sólo lo que necesita ser expuesto y controle esa exposición tanto como sea posible.
Hovercraft Full Of Eels avatar Feb 25 '2014 03:02 Hovercraft Full Of Eels

Prefiere la composición a la herencia .

El segundo ejemplo usa herencia, pero sin una buena razón, ya que no cambia la funcionalidad de JFrame.


Además, si esos son ejemplos de código que está viendo, busque una nueva fuente 1 complementaria . Incluso en las pocas líneas de código que se muestran, cada una hace cosas muy cuestionables. P.EJ

  1. Ninguna GUI se crea en el hilo de envío de eventos.
  2. getContentPane().setBackground(Color.WHITE); getContentPane().setLayout(null); setSize(800, 600);
    • La primera parte de la 1.ª línea ( getContentPane()) no es necesaria desde Java 1.5
    • La segunda línea utiliza un nulldiseño, que se dividirá en más formas que puedo contar o describir.
    • Es mejor reemplazar la tercera línea conpack();
  3. JFrame guiFrame = new JFrame(); guiFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); guiFrame.setTitle("Example GUI"); guiFrame.setSize(300,250);
    • La primera y tercera línea podrán contratarse para:
      JFrame guiFrame = new JFrame("Example GUI");
    • Es mejor configurar la segunda línea enguiFrame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
    • La tercera línea vuelve a establecer un tamaño para el marco.

Suplemento

  1. Habiendo mencionado que busca SO, aquí tiene un consejo. Consulte las publicaciones de los 15 principales proveedores de respuestas en los principales usuarios de Swing . Cualquier consejo/código que obtenga de estas personas, cometería pocos o ninguno de los errores en esos ejemplos de código.

    Algunos no proporcionan a menudo (o nunca) ejemplos autónomos como lo hacemos habitualmente algunos de nosotros (y no miramos esos ejemplos necesariamente para el diseño OO en lugar de simplemente para la técnica), pero cualquier código que proporcionen o consejos que den , debe ser muy considerado.
Andrew Thompson avatar Feb 25 '2014 03:02 Andrew Thompson

Personalmente, se prefiere el primer enfoque (crear una instancia de JFrame), prefiero este porque...

No bloquea su aplicación en un contenedor dedicado... ve a muchas personas que quieren agregar subprogramas a marcos y marcos a subprogramas, si simplemente hubieran puesto la mayoría de la GUI en un para empezar JPanel, no lo harían. No tengo estos problemas.

También significa que la interfaz de usuario que crea es mucho más flexible. Por ejemplo, puedes reutilizarlo, ya sea en la aplicación actual o en aplicaciones futuras, no te encierras.

La principal queja que tengo con la extensión JFramees que en realidad no le estás agregando ninguna característica o funcionalidad nueva, que podría reutilizarse de manera efectiva más allá de usarsetVisible

El otro problema que tengo con la extensión JFramees que la gente luego anula rápidamente paint, lo cual es realmente malo. Hay tantos problemas al hacer esto que es simplemente doloroso tener que enumerarlos repetidamente...

Entonces... por más de 2 centavos. Cree una instancia JFramey agréguele su contenido. Si es necesario, cree una staticllamada a un método showMyAwesomeGUIque lo haga por usted...

MadProgrammer avatar Feb 25 '2014 03:02 MadProgrammer

El primer enfoque es mejor.

Normalmente no se agrega ninguna funcionalidad nueva al marco, por lo que tiene sentido crear una instancia directa de la clase.

Reimeus avatar Feb 25 '2014 03:02 Reimeus

Opte por el primer enfoque.

Porque con eso puedes tener más cuadros por crear. Porque la aplicación puede tener más de una ventana. Como en el segundo caso, no puedes crear más fotogramas.

ravi.patel avatar Feb 25 '2014 03:02 ravi.patel