Chamar Frame, sem limpar ele (AJUDA) [RESOLVIDO]

9 respostas
pedroroxd

Pessoal, to com 1 Frame com a tabela... A pessoa seleciona uma linha da tabela, e a linha selecionada ficam nos jTextField...
(jTexField1 = Nome / jTextField2 = Valor por unidade / jTextField3 = Quantidade).
Quando a pessoa clica no botão adicionar pedido, o pedido vai para um jFrame, que coloca eles em Lists. (List 1 = Quantidade, List2 = Nome, List3 = Preço por unidade, List4 = Preço total [que é quantidade * preço por unidade].

Botão adicionar:

if (JOptionPane.showConfirmDialog(null,"Tem certeza que deseja adicionar para o pedido?")==JOptionPane.OK_OPTION){
             JOptionPane.showMessageDialog(null, "O Pedido Foi Adicionado para o formulário de pedidos. Para confirmar seu pedido, favor ir ao formulário de confirmação.");

             //Depois é só colocar isso no action do menu//
            String us = jLabel8.getText();
            String mesa = jLabel6.getText();
            String frase = us + " da mesa " + mesa + " deseja:" ;

            String quant = jTextField2.getText();
            String oq = jTextField1.getText();

            String precouni = "R$: " + jTextField3.getText();

        String quanted = jTextField2.getText();
        double quantedd = Double.parseDouble(quanted);
        String preco = jTextField3.getText();
        double precoo = Double.parseDouble(preco);
        double quanti = quantedd * precoo;
        String numero = new Double(quanti).toString();
        String numeroo = "R$: " + numero;

             FrameConfirmaPedidos vera = new FrameConfirmaPedidos();
             vera.setVisible(true);
             vera.escrevenome(frase,memo,quanted,oq,precouni,numero,numeroo);  

    }
Ae o FrameConfirmaPedidos, tem o void escrevenome:
public void escrevenome(String frase, String memo, String quanted, String oq, String precouni,String numero,String numeroo) {
    jLabel5.setText(frase);

    list1.add(quanted);
    list2.add(oq);
    list3.add(precouni);
    list4.add(numeroo);
    list5.add(memo);
    list6.add(numero);      
   }

[color=red]PROBLEMA:[/color] Quando a pessoa clica para adicionar o pedido, ele adiciona certinho no FrameConfirmaPedidos, mas como ele ta criando um novo (FrameConfirmaPedidos vera = new FrameConfirmaPedidos(); / vera.setVisible(true);) , os pedidos que estão dentro das List são limpados..
[color=red]PROBLEMA2 :[/color] Eu não quero chamar o frame quando a pessoa clicar no botão, e sim quando ela clicar no menu, mas se eu colocar no menu new FrameConfirmaPedidos().setVisible(true), ele vai criar um novo, e as coisas que tão lá dentro vão sumir também...

O que posso fazer? Tem algum geito de chamar um Frame sem ser pelo:
new FrameConfirmaPedidos().setVisible(true);
É porque quando chama pelo new, ele cria um novo, no defaut dele... então eu perco as coisas que estão preencidas dentro dele...

9 Respostas

ViniGodoy

Não parece meio lógico? É só guardar o Frame numa propriedade e não dar new todas as vezes.

Logo no início, como propriedade da classe (fora de qualquer método), faça:

FrameConfirmaPedidos frmConfirmaPedidos = new FrameConfirmaPedidos();

Depois, nos seus métodos, faça somente:

frmConfirmaPedidos.setVisible(true);

Isso evita ficar recriando o seu frame toda santa vez…

pedroroxd

Valew ae…
Que burro eu rs…
Nem tinha pensado nessa possibilidade…

Primeira parte RESOLVIDA :slight_smile:

Aproveitando a boa vontade…
Agora se eu chamar ele (FrameConfirmaPedidos) pelo mesmo Frame (FramePedidos) dá certo… não limpa nada…
Mas como que eu chamo ele por outro Frame?
(Tem o FramePrincipal com o menu, ae eu quero chamar o FrameConfirmaPedidos…)

Eu tentei isso, mas não deu certo (o Frame vem vazio):

try { FramePedidos k = new FramePedidos(); k.frmConfirmaPedidos.setVisible(true); } catch (ClassNotFoundException ex) { Logger.getLogger(FramePrincipal.class.getName()).log(Level.SEVERE, null, ex); } catch (SQLException ex) { Logger.getLogger(FramePrincipal.class.getName()).log(Level.SEVERE, null, ex); }

ViniGodoy

Você tem algumas alternativas:

a) Criar apenas uma vez o FrameConfirmaPedidos e passar ele como parâmetro para os outros frames.
b) Usar o padrão singleton nos seus frames.

Se for um trabalho escolar, ou uma aplicação pequena, a última é uma boa opção. Para isso, faça o seguinte:

1. Torne o construtor do FrameConfirmaPedidos private
2. Crie um atributo static "instance" dentro do seu frame, contendo uma instância dele mesmo;
3. Crie um método getInstance(), publico, para retornar o seu frame.

public FrameConfirmaPedidos extends JFrame
{
   private static FrameConfirmaPedidos instance = new FrameConfirmaPedidos();

   private FrameConfirmaPedidos() {
      //Código do construtor aqui
   }

   public FrameConfirmaPedidos getInstance() {
      return instance;
   }
}
Então, nos locais onde você dá um "setVisible", faça apenas:
FrameConfirmaPedidos.getInstance().setVisible(true);

Você pode fazer isso para outros frames também. Esse padrão garante que apenas 1 instância do frame será criada na sua aplicação toda.

Atenção: Esse padrão tem problemas sérios caso você use multiplos classloaders, e há várias formas de quebra-lo. Normalmente, ele não é considerado a melhor das práticas de programação, mas para uma aplicação curta, ou para um trabalho de escola, pode quebrar um galhão.

ViniGodoy

Você tem algumas alternativas:

a) Criar apenas uma vez o FrameConfirmaPedidos e passar ele como parâmetro para os outros frames.
b) Usar o padrão singleton nos seus frames.

Se for um trabalho escolar, ou uma aplicação pequena, a última é uma boa opção. Para isso, faça o seguinte:

1. Torne o construtor do FrameConfirmaPedidos private
2. Crie um atributo static "instance" dentro do seu frame, contendo uma instância dele mesmo;
3. Crie um método getInstance(), publico, para retornar o seu frame.

public FrameConfirmaPedidos extends JFrame
{
   private static FrameConfirmaPedidos instance = new FrameConfirmaPedidos();

   private FrameConfirmaPedidos() {
      //Código do construtor aqui
   }

   public FrameConfirmaPedidos getInstance() {
      return instance;
   }
}
Então, nos locais onde você dá um "setVisible", faça apenas:
FrameConfirmaPedidos.getInstance().setVisible(true);

Você pode fazer isso para outros frames também. Esse padrão garante que apenas 1 instância do frame será criada na sua aplicação toda.

Atenção: Esse padrão tem problemas sérios caso você use multiplos classloaders, e há várias formas de quebra-lo. Normalmente, ele não é considerado a melhor das práticas de programação, mas para uma aplicação curta, ou para um trabalho de escola, pode quebrar um galhão.

pedroroxd

Como que ficaria então?

Esse é o meu FrameConfirmaPedidos:
package views;

import java.sql.SQLException;
import javax.swing.UIManager;

/**
 *
 * @author pepi
 */
public class FrameConfirmaPedidos extends javax.swing.JFrame {

    /** Creates new form FrameConfirmaPedidos */
    public FrameConfirmaPedidos() {

     this.setExtendedState(FramePrincipal.MAXIMIZED_BOTH);
           try {
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
    } catch (Exception ex) {
        ex.printStackTrace();
    }

setTitle("Faça Seu Pedido!");

        initComponents();
    }


    public void escrevenome(String frase, String memo, String quanted, String oq, String precouni,String numero,String numeroo) throws ClassNotFoundException, SQLException {
    jLabel5.setText(frase);

    list1.add(quanted);
    list2.add(oq);
    list3.add(precouni);
    list4.add(numeroo);
    list5.add(memo);
    list6.add(numero);       


   }

    /** 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() {

        list1 = new java.awt.List();
        jLabel1 = new javax.swing.JLabel();
        list2 = new java.awt.List();
        jLabel2 = new javax.swing.JLabel();
        list3 = new java.awt.List();
        jLabel3 = new javax.swing.JLabel();
        list4 = new java.awt.List();
        jLabel4 = new javax.swing.JLabel();
        jLabel5 = new javax.swing.JLabel();
        list5 = new java.awt.List();
        list6 = new java.awt.List();

        setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
        getContentPane().setLayout(null);
        getContentPane().add(list1);
        list1.setBounds(20, 130, 170, 360);

        jLabel1.setText("QUANTIDADE");
        getContentPane().add(jLabel1);
        jLabel1.setBounds(50, 100, 90, 14);
        getContentPane().add(list2);
        list2.setBounds(220, 130, 160, 360);

        jLabel2.setText("NOME");
        getContentPane().add(jLabel2);
        jLabel2.setBounds(280, 100, 40, 14);
        getContentPane().add(list3);
        list3.setBounds(400, 130, 70, 360);

        jLabel3.setText("PREÇO (U.N.)");
        getContentPane().add(jLabel3);
        jLabel3.setBounds(400, 100, 70, 14);
        getContentPane().add(list4);
        list4.setBounds(510, 130, 110, 360);

        jLabel4.setText("PREÇO (Total)");
        getContentPane().add(jLabel4);
        jLabel4.setBounds(520, 100, 70, 14);

        jLabel5.setFont(new java.awt.Font("Tahoma", 0, 18)); // NOI18N
        jLabel5.setForeground(new java.awt.Color(0, 51, 204));
        jLabel5.setText("asdddddddddddddddddddddddddddddddddddddddddddddddd");
        getContentPane().add(jLabel5);
        jLabel5.setBounds(60, 20, 670, 40);
        getContentPane().add(list5);
        list5.setBounds(790, 340, 170, 110);
        getContentPane().add(list6);
        list6.setBounds(800, 10, 130, 300);

        java.awt.Dimension screenSize = java.awt.Toolkit.getDefaultToolkit().getScreenSize();
        setBounds((screenSize.width-1039)/2, (screenSize.height-641)/2, 1039, 641);
    }// </editor-fold>                        

    /**
    * @param args the command line arguments
    */
    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new FrameConfirmaPedidos().setVisible(true);
            }
        });
    }

    // Variables declaration - do not modify                     
    private javax.swing.JLabel jLabel1;
    private javax.swing.JLabel jLabel2;
    private javax.swing.JLabel jLabel3;
    private javax.swing.JLabel jLabel4;
    private javax.swing.JLabel jLabel5;
    private java.awt.List list1;
    private java.awt.List list2;
    private java.awt.List list3;
    private java.awt.List list4;
    private java.awt.List list5;
    private java.awt.List list6;
    // End of variables declaration                   

}

Eu continuo deixando a classe FrameConfirmaPedidos, e crio a otra dentro?
o código do construtor é o que ta dentro do " @SuppressWarnings("unchecked") " ?

ViniGodoy
Fica assim:
package views;  
   
 import java.sql.SQLException;  
 import javax.swing.UIManager;  
   
 /** 
 * 
 * @author pepi 
 */  
 public class FrameConfirmaPedidos extends javax.swing.JFrame {  
     private FrameConfirmaPedidos instance = new FrameConfirmaPedidos();

     /** Creates new form FrameConfirmaPedidos */  
     private FrameConfirmaPedidos() {  
   
      this.setExtendedState(FramePrincipal.MAXIMIZED_BOTH);  
            try {  
         UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());  
     } catch (Exception ex) {  
         ex.printStackTrace();  
     }  
     
     public FrameConfirmaPedidos getInstance() {
         return instance;
      }
   
 setTitle("Faça Seu Pedido!");  
   
         initComponents();  
     }  
   
   
     public void escrevenome(String frase, String memo, String quanted, String oq, String precouni,String numero,String numeroo) throws ClassNotFoundException, SQLException {  
     jLabel5.setText(frase);  
   
     list1.add(quanted);  
     list2.add(oq);  
     list3.add(precouni);  
     list4.add(numeroo);  
     list5.add(memo);  
     list6.add(numero);         
   
   
    }  
   
     /** 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() {  
   
         list1 = new java.awt.List();  
         jLabel1 = new javax.swing.JLabel();  
         list2 = new java.awt.List();  
         jLabel2 = new javax.swing.JLabel();  
         list3 = new java.awt.List();  
         jLabel3 = new javax.swing.JLabel();  
         list4 = new java.awt.List();  
         jLabel4 = new javax.swing.JLabel();  
         jLabel5 = new javax.swing.JLabel();  
         list5 = new java.awt.List();  
         list6 = new java.awt.List();  
   
         setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);  
         getContentPane().setLayout(null);  
         getContentPane().add(list1);  
         list1.setBounds(20, 130, 170, 360);  
   
         jLabel1.setText("QUANTIDADE");  
         getContentPane().add(jLabel1);  
         jLabel1.setBounds(50, 100, 90, 14);  
         getContentPane().add(list2);  
         list2.setBounds(220, 130, 160, 360);  
   
         jLabel2.setText("NOME");  
         getContentPane().add(jLabel2);  
         jLabel2.setBounds(280, 100, 40, 14);  
         getContentPane().add(list3);  
         list3.setBounds(400, 130, 70, 360);  
   
         jLabel3.setText("PREÇO (U.N.)");  
         getContentPane().add(jLabel3);  
         jLabel3.setBounds(400, 100, 70, 14);  
         getContentPane().add(list4);  
         list4.setBounds(510, 130, 110, 360);  
   
         jLabel4.setText("PREÇO (Total)");  
         getContentPane().add(jLabel4);  
         jLabel4.setBounds(520, 100, 70, 14);  
   
         jLabel5.setFont(new java.awt.Font("Tahoma", 0, 18)); // NOI18N  
         jLabel5.setForeground(new java.awt.Color(0, 51, 204));  
         jLabel5.setText("asdddddddddddddddddddddddddddddddddddddddddddddddd");  
         getContentPane().add(jLabel5);  
         jLabel5.setBounds(60, 20, 670, 40);  
         getContentPane().add(list5);  
         list5.setBounds(790, 340, 170, 110);  
         getContentPane().add(list6);  
         list6.setBounds(800, 10, 130, 300);  
   
         java.awt.Dimension screenSize = java.awt.Toolkit.getDefaultToolkit().getScreenSize();  
         setBounds((screenSize.width-1039)/2, (screenSize.height-641)/2, 1039, 641);  
     }// </editor-fold>                          
   
     /** 
     * @param args the command line arguments 
     */  
     public static void main(String args[]) {  
         java.awt.EventQueue.invokeLater(new Runnable() {  
             public void run() {  
                 new FrameConfirmaPedidos().setVisible(true);  
             }  
         });  
     }  
   
     // Variables declaration - do not modify                       
     private javax.swing.JLabel jLabel1;  
     private javax.swing.JLabel jLabel2;  
     private javax.swing.JLabel jLabel3;  
     private javax.swing.JLabel jLabel4;  
     private javax.swing.JLabel jLabel5;  
     private java.awt.List list1;  
     private java.awt.List list2;  
     private java.awt.List list3;  
     private java.awt.List list4;  
     private java.awt.List list5;  
     private java.awt.List list6;  
     // End of variables declaration                     
 }

Vale a pena também dar uma lida nesse tópico: http://www.guj.com.br/posts/list/0/137406.java#739528

pedroroxd
1- Tipo, a parte do início ficou assim:
public class FrameConfirmaPedidos extends javax.swing.JFrame {
private FrameConfirmaPedidos instance = new FrameConfirmaPedidos();  
    /** Creates new form FrameConfirmaPedidos */
    //public FrameConfirmaPedidos() {
 private FrameConfirmaPedidos() {   
     
     
     this.setExtendedState(FramePrincipal.MAXIMIZED_BOTH);
           try {
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
    } catch (Exception ex) {
        ex.printStackTrace();
    }

       
setTitle("Faça Seu Pedido!");

        initComponents();
    }

public FrameConfirmaPedidos getInstance() {  
         return instance;  
      }

(Não dá pra colocar o FrameConfirmaPedidos getInstance antes do initComponents)

2- Quando eu fui chamar ele pelo:
FrameConfirmaPedidos.getInstance().setVisible(true);
deu um erro: [color=red]non-static method getInstance() cannot be referenced from a static context.[/color]
pedroroxd

Opa… Deu certo agora… só uns ajustes:

private static FrameConfirmaPedidos instance = new FrameConfirmaPedidos();

public static FrameConfirmaPedidos getInstance() { return instance; }

Brigadão ae ViniGodoy… Já ajudou eu umas 8 vezes ;]

ViniGodoy

hehehehe… terceira ou quarta vez que esqueço desse static hoje… o cérebro deve ter tirado o feriado pra descansar…

Criado 7 de setembro de 2009
Ultima resposta 8 de set. de 2009
Respostas 9
Participantes 2