Dúvida básica com classes

Pessoal, eu to com uma dúvida básica aqui com classes. Criei uma classe “DefaultFrame” com todas as características que eu gostaria de ter em um frame

import javax.swing.*;
import java.awt.*;

public class DefaultFrame {
 
    JFrame frame = new JFrame("Background Example");
    final ImageIcon imageIcon = new ImageIcon("oi.jpg");
    JTextArea textArea = new JTextArea() {
      Image image = imageIcon.getImage();
      Image grayImage = GrayFilter.createDisabledImage(image);
      {setOpaque(false);}  // instance initializer
            @Override
      public void paintComponent (Graphics g) {
        g.drawImage(grayImage, 0, 0, this);
        super.paintComponent(g);
      }
    };
    JScrollPane scrollPane = new JScrollPane(textArea);
    Container content = frame.getContentPane();
    content.add(scrollPane, BorderLayout.CENTER);
    frame.setDefaultCloseOperation(3);
    frame.setSize(250, 250);
    frame.setVisible(true);
    
  }
}

Se eu colocar um método Main e executar, ele roda perfeito, do jeito que eu quero. Mas não estou sabendo implementá-lo em outras classes que usam JFrame e eu quero separar a lógica da aplicação da parte visual.
Eu pensava que se apenas colocasse “Classe X extends DefaultFrame”, todas estas opções já estariam presentes no meu Frame. O que preciso fazer para que todo novo frame que eu criar já tenha todas estas características?!

Obrigado!

Ninguém aí arrisca minha gente?! Creio que seja uma coisa bem básica…

[quote=amlima01]Pessoal, eu to com uma dúvida básica aqui com classes. Criei uma classe “DefaultFrame” com todas as características que eu gostaria de ter em um frame

import javax.swing.*;
import java.awt.*;

public class DefaultFrame {
 
    JFrame frame = new JFrame("Background Example");
    final ImageIcon imageIcon = new ImageIcon("oi.jpg");
    JTextArea textArea = new JTextArea() {
      Image image = imageIcon.getImage();
      Image grayImage = GrayFilter.createDisabledImage(image);
      {setOpaque(false);}  // instance initializer
            @Override
      public void paintComponent (Graphics g) {
        g.drawImage(grayImage, 0, 0, this);
        super.paintComponent(g);
      }
    };
    JScrollPane scrollPane = new JScrollPane(textArea);
    Container content = frame.getContentPane();
    content.add(scrollPane, BorderLayout.CENTER);
    frame.setDefaultCloseOperation(3);
    frame.setSize(250, 250);
    frame.setVisible(true);
    
  }
}

Se eu colocar um método Main e executar, ele roda perfeito, do jeito que eu quero. Mas não estou sabendo implementá-lo em outras classes que usam JFrame e eu quero separar a lógica da aplicação da parte visual.
Eu pensava que se apenas colocasse “Classe X extends DefaultFrame”, todas estas opções já estariam presentes no meu Frame. O que preciso fazer para que todo novo frame que eu criar já tenha todas estas características?!

Obrigado!

[/quote]

Mas quando extende a classe DefaultFrame isso já não acontece?
Abraços.

[quote=nel][quote=amlima01]
Mas quando extende a classe DefaultFrame isso já não acontece?
Abraços.[/quote]

Opa Nel, não tá não. Eu não tenho muita experiência em orientação a objetos, mas conheço bem de C. Eu criei esta classe DefaultFrame e entao criei outra simples, apenas com a declaração de classe e a main e extendendo da Default, acho que só com a main já seria o suficiente pra pelo menos aparecer o Frame, não?! Ele compila sem erros, mas não aparece nada. O código é esse:

import javax.swing.*;
import java.awt.*;

public class Test extends DefaultFrame{
     public static void main(String[] args) {
        
    }

}

Boa noite a todos.

Em primeiro lugar, a sua classe “DefaultFrame” é uma classe simples que não extende (Herda de JFrame).

Em segundo lugar, se voce quer que outras classes herdem dela como JFrame então a classe DefaultFrame tem que herdar de um JFrame.

Em terceiro lugar, voce tenta adicionar o JTextArea com BorderLayou.Center, porém nem se quer definiu o Layout do Frame como BorderLayout.

Mesmo que você quisesse que o seu frame apenas aparecesse (visualizasse) somente na classe DefaultFrame, onde voce instancia um JFrame e seta ele como visible = true, voce teria que adicioná-lo no construtor da classe DefaulFrame, e voce não o implementou.

Resumindo e corrigindo melhor o seu código ele ficaria assim:

   import javax.swing.*;  
   import java.awt.*;  
  
   public class DefaultFrame  extends JFrame {  // Sua classe tem extender (herdar) de JFrame se quiser que outros frames seja herdados dele

           protected final ImageIcon imagem = new ImageIcon("oi.jpg");
           
           public DefaultFrame(){
                 super("Background Example");
                 setDefaultCloseOperation(ExitOnClose);
                 initComponents();
                 pack(); // Repinta redimensionando o Frame
                 setLocationRelativeTo(null); // Centraliza o Frame
           }

           protected void initComponents(){
                 setLayout(new BorderLayout()); // Defini primeiro o layout
                 setPreferredSize(new Dimension(250,250);
                 JTextArea textArea = new JTextArea() {  
                       Image image = imageIcon.getImage();  
                       Image grayImage = GrayFilter.createDisabledImage(image);  
                       {setOpaque(false);}  // instance initializer  
                       @Override  
                       public void paintComponent (Graphics g) {  
                              g.drawImage(grayImage, 0, 0, this);  
                              super.paintComponent(g);  
                       }  
                 };  
                 JScrollPane scrollPane = new JScrollPane(textArea);  
                 getContentPane().add(scrollPane, BorderLayout.CENTER);    
      
         }  
    }  

Voce vai me perguntar o porque eu não coloquei o método setVisible(true) dentro do construtor (public DefaultFrame()) da classe, ora eu sei que vai, e vou responder que isto não é uma prática muito recomendável, eis que, quando voce instanciar qualquer frame que herda da sua classe, automaticamene ele será visualizado, porém voce corre o risco de poluir a tela, caso abrir mais de um frame, e haverá ocasiões em que voce só quer instanciar o Frame, apenas para colocá-lo na memória de forma invisível, portanto só utilize o método setVisible(true), no momento em que instanciar o frame fora da classe.

Cappichi.

Um abraço.

[quote=discorpio]Boa noite a todos.

Em primeiro lugar, a sua classe “DefaultFrame” é uma classe simples que não extende (Herda de JFrame).

Em segundo lugar, se voce quer que outras classes herdem dela como JFrame então a classe DefaultFrame tem que herdar de um JFrame.

Em terceiro lugar, voce tenta adicionar o JTextArea com BorderLayou.Center, porém nem se quer definiu o Layout do Frame como BorderLayout.

Mesmo que você quisesse que o seu frame apenas aparecesse (visualizasse) somente na classe DefaultFrame, onde voce instancia um JFrame e seta ele como visible = true, voce teria que adicioná-lo no construtor da classe DefaulFrame, e voce não o implementou.

Resumindo e corrigindo melhor o seu código ele ficaria assim:

   import javax.swing.*;  
   import java.awt.*;  
  
   public class DefaultFrame  extends JFrame {  // Sua classe tem extender (herdar) de JFrame se quiser que outros frames seja herdados dele

           protected final ImageIcon imagem = new ImageIcon("oi.jpg");
           
           public DefaultFrame(){
                 super("Background Example");
                 setDefaultCloseOperation(ExitOnClose);
                 initComponents();
                 pack(); // Repinta redimensionando o Frame
                 setLocationRelativeTo(null); // Centraliza o Frame
           }

           protected void initComponents(){
                 setLayout(new BorderLayout()); // Defini primeiro o layout
                 setPreferredSize(new Dimension(250,250);
                 JTextArea textArea = new JTextArea() {  
                       Image image = imageIcon.getImage();  
                       Image grayImage = GrayFilter.createDisabledImage(image);  
                       {setOpaque(false);}  // instance initializer  
                       @Override  
                       public void paintComponent (Graphics g) {  
                              g.drawImage(grayImage, 0, 0, this);  
                              super.paintComponent(g);  
                       }  
                 };  
                 JScrollPane scrollPane = new JScrollPane(textArea);  
                 getContentPane().add(scrollPane, BorderLayout.CENTER);    
      
         }  
    }  

Voce vai me perguntar o porque eu não coloquei o método setVisible(true) dentro do construtor (public DefaultFrame()) da classe, ora eu sei que vai, e vou responder que isto não é uma prática muito recomendável, eis que, quando voce instanciar qualquer frame que herda da sua classe, automaticamene ele será visualizado, porém voce corre o risco de poluir a tela, caso abrir mais de um frame, e haverá ocasiões em que voce só quer instanciar o Frame, apenas para colocá-lo na memória de forma invisível, portanto só utilize o método setVisible(true), no momento em que instanciar o frame fora da classe.

Cappichi.

Um abraço.[/quote]

Opa, valeu Discorpio… vou testar aqui, qualquer coisa posto de novo.

Obrigado!