Criar form dinamicamente

15 respostas
J

Tenho um sistema para desenvolver em JSF, para tanto, uso a forma basica, crio as telas em um .xhtml e as classes atravez de um ManagedBean…e faço campo a campo conectado a cada metodo da minha classe.

Gostaria de saber se alguem tem algum exemplo, por mais basico que seja, que trabalhar com criaçao de tela dinamica, pode ser tanto pegando as informaçoes do banco de dados, ou de uma classe, sem ter que ficar passando campo a campo

Codigo
Nome…

uso Eclipse Helios, TomCat 7 e postgres.

se alguem tiver algum exemplo ou dica…
Grato

15 Respostas

L
public class LancamentoTipoCobranca extends javax.swing.JFrame {

    ArrayList<JCheckBox> listaCheckBox = new ArrayList<JCheckBox>();
    ArrayList<JTextField> listaValores = new ArrayList<JTextField>();
    ArrayList<Cobranca> listaTipoCobranca = new ArrayList<Cobranca>();
    public static ArrayList<CobrancaConta> lancamento = new ArrayList<CobrancaConta>();
    public static boolean lancado = false;

    /** Creates new form LancamentoTipoCobranca */
    public LancamentoTipoCobranca() {
        ImageIcon icone = new ImageIcon("icone.GIF");
        setIconImage(icone.getImage());
        initComponents();
        carregaComboBox();
        setLocationRelativeTo(null);
        setVisible(true);
        criaCampos();
    }

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

        jSeparator5 = new javax.swing.JSeparator();
        painelPrincipal = new javax.swing.JPanel();
        lbValor = new javax.swing.JLabel();
        cbCobranca = new javax.swing.JComboBox();
        tfValor = new javax.swing.JTextField();
        btLancar = new javax.swing.JButton();
        lbTipoCobranca1 = new javax.swing.JLabel();
        lbValor1 = new javax.swing.JLabel();
        lbValor2 = new javax.swing.JLabel();
        lbTipoCobranca2 = new javax.swing.JLabel();
        rolagem1 = new javax.swing.JScrollPane();
        cobranca1 = new javax.swing.JPanel();
        rolagem2 = new javax.swing.JScrollPane();
        valores1 = new javax.swing.JPanel();
        rolagem3 = new javax.swing.JScrollPane();
        cobranca2 = new javax.swing.JPanel();
        rolagem4 = new javax.swing.JScrollPane();
        valores2 = new javax.swing.JPanel();
        chCobranca = new javax.swing.JCheckBox();
        lbTitulo = new javax.swing.JLabel();

        setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
        setTitle("Lançamento de Tipos de Cobrança");
        setMinimumSize(new java.awt.Dimension(471, 198));
        setResizable(false);

        painelPrincipal.setBackground(new java.awt.Color(0, 153, 153));
        painelPrincipal.setBorder(javax.swing.BorderFactory.createTitledBorder(null, "Lançamento de Cobranças", javax.swing.border.TitledBorder.CENTER, javax.swing.border.TitledBorder.DEFAULT_POSITION, new java.awt.Font("Tahoma", 0, 11), new java.awt.Color(255, 255, 255))); // NOI18N
        painelPrincipal.setLayout(null);

        lbValor.setFont(new java.awt.Font("Tahoma", 1, 11));
        lbValor.setText("Valor:");
        painelPrincipal.add(lbValor);
        lbValor.setBounds(470, 275, 32, 14);

        AutoCompletion.enable(cbCobranca);
        cbCobranca.setFont(new java.awt.Font("Tahoma", 0, 9));
        painelPrincipal.add(cbCobranca);
        cbCobranca.setBounds(130, 275, 330, 17);

        tfValor.setText("0.00");
        painelPrincipal.add(tfValor);
        tfValor.setBounds(510, 270, 60, 20);

        btLancar.setFont(new java.awt.Font("Tahoma", 1, 11)); // NOI18N
        btLancar.setMnemonic('l');
        btLancar.setText("Lançar");
        btLancar.setSelected(true);
        btLancar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btLancarActionPerformed(evt);
            }
        });
        painelPrincipal.add(btLancar);
        btLancar.setBounds(620, 290, 80, 23);

        lbTipoCobranca1.setFont(new java.awt.Font("Tahoma", 1, 11));
        lbTipoCobranca1.setText("Selecione o tipo de cobrança");
        painelPrincipal.add(lbTipoCobranca1);
        lbTipoCobranca1.setBounds(420, 20, 170, 20);

        lbValor1.setFont(new java.awt.Font("Tahoma", 1, 11));
        lbValor1.setText("Valor");
        painelPrincipal.add(lbValor1);
        lbValor1.setBounds(730, 20, 30, 20);

        lbValor2.setFont(new java.awt.Font("Tahoma", 1, 11));
        lbValor2.setText("Valor");
        painelPrincipal.add(lbValor2);
        lbValor2.setBounds(340, 20, 30, 20);

        lbTipoCobranca2.setFont(new java.awt.Font("Tahoma", 1, 11));
        lbTipoCobranca2.setText("Selecione a cobrança");
        painelPrincipal.add(lbTipoCobranca2);
        lbTipoCobranca2.setBounds(20, 20, 130, 20);

        rolagem1.setVerticalScrollBarPolicy(javax.swing.ScrollPaneConstants.VERTICAL_SCROLLBAR_NEVER);

        javax.swing.GroupLayout cobranca1Layout = new javax.swing.GroupLayout(cobranca1);
        cobranca1.setLayout(cobranca1Layout);
        cobranca1Layout.setHorizontalGroup(
            cobranca1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 298, Short.MAX_VALUE)
        );
        cobranca1Layout.setVerticalGroup(
            cobranca1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 218, Short.MAX_VALUE)
        );

        rolagem1.setViewportView(cobranca1);

        painelPrincipal.add(rolagem1);
        rolagem1.setBounds(20, 40, 300, 220);

        rolagem2.setHorizontalScrollBarPolicy(javax.swing.ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
        rolagem2.setVerticalScrollBarPolicy(javax.swing.ScrollPaneConstants.VERTICAL_SCROLLBAR_NEVER);

        javax.swing.GroupLayout valores1Layout = new javax.swing.GroupLayout(valores1);
        valores1.setLayout(valores1Layout);
        valores1Layout.setHorizontalGroup(
            valores1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 111, Short.MAX_VALUE)
        );
        valores1Layout.setVerticalGroup(
            valores1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 218, Short.MAX_VALUE)
        );

        rolagem2.setViewportView(valores1);

        painelPrincipal.add(rolagem2);
        rolagem2.setBounds(330, 40, 70, 210);

        rolagem3.setVerticalScrollBarPolicy(javax.swing.ScrollPaneConstants.VERTICAL_SCROLLBAR_NEVER);
        rolagem3.setMinimumSize(new java.awt.Dimension(300, 220));
        rolagem3.setPreferredSize(new java.awt.Dimension(300, 220));

        cobranca2.setMinimumSize(new java.awt.Dimension(300, 220));

        javax.swing.GroupLayout cobranca2Layout = new javax.swing.GroupLayout(cobranca2);
        cobranca2.setLayout(cobranca2Layout);
        cobranca2Layout.setHorizontalGroup(
            cobranca2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 298, Short.MAX_VALUE)
        );
        cobranca2Layout.setVerticalGroup(
            cobranca2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 218, Short.MAX_VALUE)
        );

        rolagem3.setViewportView(cobranca2);

        painelPrincipal.add(rolagem3);
        rolagem3.setBounds(410, 40, 300, 220);

        rolagem4.setHorizontalScrollBarPolicy(javax.swing.ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
        rolagem4.setVerticalScrollBarPolicy(javax.swing.ScrollPaneConstants.VERTICAL_SCROLLBAR_NEVER);

        javax.swing.GroupLayout valores2Layout = new javax.swing.GroupLayout(valores2);
        valores2.setLayout(valores2Layout);
        valores2Layout.setHorizontalGroup(
            valores2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 111, Short.MAX_VALUE)
        );
        valores2Layout.setVerticalGroup(
            valores2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 218, Short.MAX_VALUE)
        );

        rolagem4.setViewportView(valores2);

        painelPrincipal.add(rolagem4);
        rolagem4.setBounds(720, 40, 70, 210);

        chCobranca.setBackground(new java.awt.Color(0, 153, 153));
        chCobranca.setFont(new java.awt.Font("Tahoma", 1, 11));
        chCobranca.setText("Cobranca");
        painelPrincipal.add(chCobranca);
        chCobranca.setBounds(20, 270, 110, 23);

        lbTitulo.setFont(new java.awt.Font("Tahoma", 1, 18));
        lbTitulo.setForeground(new java.awt.Color(102, 204, 255));
        lbTitulo.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
        lbTitulo.setText("LANÇAMENTO DE TIPO DE COBRANÇA");

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(painelPrincipal, javax.swing.GroupLayout.PREFERRED_SIZE, 810, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(lbTitulo, javax.swing.GroupLayout.DEFAULT_SIZE, 810, Short.MAX_VALUE))
                .addContainerGap())
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(lbTitulo, javax.swing.GroupLayout.PREFERRED_SIZE, 30, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(painelPrincipal, javax.swing.GroupLayout.DEFAULT_SIZE, 322, Short.MAX_VALUE)
                .addContainerGap())
        );

        pack();
    }// </editor-fold>                        

        private void criaCampos() {
        CobrancaDAO cobDao = new CobrancaDAO();
        try {
            ArrayList<Cobranca> listaCobranca = cobDao.listarTipoCobranca();

                cobranca1.setLayout(new java.awt.GridLayout(8,1));
                valores1.setLayout(new java.awt.GridLayout(8,1));
                cobranca2.setLayout(new java.awt.GridLayout(8,1));
                valores2.setLayout(new java.awt.GridLayout(8,1));
            for (int i = 0; i < listaCobranca.size()&& i < 8; i++) {
                JCheckBox a = new JCheckBox();
                JTextField b = new JTextField();
                a.setFont(new java.awt.Font("Tahoma", 0, 9));
                a.setText(listaCobranca.get(i).getTipoCobranca());
                listaCheckBox.add(a);
                listaValores.add(b);
                cobranca1.add(a);
                valores1.add(b);
            }
                for (int i = 8; i < listaCobranca.size()&& i < 16; i++) {
                JCheckBox a = new JCheckBox();
                JTextField b = new JTextField();
                a.setFont(new java.awt.Font("Tahoma", 0, 9));
                a.setText(listaCobranca.get(i).getTipoCobranca());
                listaCheckBox.add(a);
                listaValores.add(b);
                cobranca2.add(a);
                valores2.add(b);
            }

        } catch (SQLException ex) {
            Logger.getLogger(ConsultaCampos.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    private ArrayList<String> getCampos(){
        CobrancaDAO cobDao = new CobrancaDAO();
        ArrayList<String> campos = new ArrayList<String>();
        ArrayList<Cobranca> listaCobranca;
        
                    
                    for (int i = 0; i < listaCheckBox.size(); i++) {
                    JCheckBox jc = (JCheckBox) listaCheckBox.get(i);
                            if(jc.isSelected()){
                                    campos.add(jc.getText());
                            }
                    }
            
        return campos;
    }

Aí tem mais ou menos o que vc precisa.
Eu fiz em swing.
O código por meio do "for" vai pegando os dados do banco de dados e criando um campo para cada dado, dinâmicamente.

J

lordtiago, muito obrigado cara, eu vou testar e ver o que acontece, ver se me entendo no fonte, qualquer coisa se nao tiver stress, te mando algumas duvida
abraço!

M

josivanl:
lordtiago, muito obrigado cara, eu vou testar e ver o que acontece, ver se me entendo no fonte, qualquer coisa se nao tiver stress, te mando algumas duvida
abraço!

Posta está idéia quando você resolver isso,
mas tome muito cuidado com o grande compremetimento da performaces usando a class JFrame

J

Pelo que percebi lordtiago, vc usou o netbeans para fazer essa tela, entao a primeira parte é so o posicionamento dos componentes e tudo mais, muito codigo do proprio netbeans, isso?

o que realmente tu fez pra fazer funcionar foi isso:

private void criaCampos() {  
         CobrancaDAO cobDao = new CobrancaDAO();  
         try {  
             ArrayList<Cobranca> listaCobranca = cobDao.listarTipoCobranca();  
   
                 cobranca1.setLayout(new java.awt.GridLayout(8,1));  
                 valores1.setLayout(new java.awt.GridLayout(8,1));  
                 cobranca2.setLayout(new java.awt.GridLayout(8,1));  
                 valores2.setLayout(new java.awt.GridLayout(8,1));  
             for (int i = 0; i < listaCobranca.size()&& i < 8; i++) {  
                 JCheckBox a = new JCheckBox();  
                 JTextField b = new JTextField();  
                 a.setFont(new java.awt.Font("Tahoma", 0, 9));  
                 a.setText(listaCobranca.get(i).getTipoCobranca());  
                 listaCheckBox.add(a);  
                 listaValores.add(b);  
                 cobranca1.add(a);  
                 valores1.add(b);  
             }  
                 for (int i = 8; i < listaCobranca.size()&& i < 16; i++) {  
                 JCheckBox a = new JCheckBox();  
                 JTextField b = new JTextField();  
                 a.setFont(new java.awt.Font("Tahoma", 0, 9));  
                 a.setText(listaCobranca.get(i).getTipoCobranca());  
                 listaCheckBox.add(a);  
                 listaValores.add(b);  
                 cobranca2.add(a);  
                 valores2.add(b);  
             }  
   
         } catch (SQLException ex) {  
             Logger.getLogger(ConsultaCampos.class.getName()).log(Level.SEVERE, null, ex);  
         }  
     }  
   
     private ArrayList<String> getCampos(){  
         CobrancaDAO cobDao = new CobrancaDAO();  
         ArrayList<String> campos = new ArrayList<String>();  
         ArrayList<Cobranca> listaCobranca;  
           
                       
                     for (int i = 0; i < listaCheckBox.size(); i++) {  
                     JCheckBox jc = (JCheckBox) listaCheckBox.get(i);  
                             if(jc.isSelected()){  
                                     campos.add(jc.getText());  
                             }  
                     }  
               
         return campos;  
     }

o que eu nao consegui entender é como que tu faz para pegar da base de dados e montar a tela? pois o meu caso é usando pra uma pagina web, onde eu vou montar os inputext de acordo com os campos da tabela do banco de dados.

L
Olha é bem simples. Eu instancio uma classe DAO que criei para fazer acesso ao banco de dados:
CobrancaDAO cobDao = new CobrancaDAO();
E depois chamo um método dela que pesquisa e me devolve um array.
ArrayList<Cobranca> listaCobranca = cobDao.listarTipoCobranca();
No caso o Array é listaCobrança. E por fim eu só trabalho neste array dentro de um for
# for (int i = 0; i < listaCobranca.size()&& i < 8; i++) {    
#                 JCheckBox a = new JCheckBox();    
#                 JTextField b = new JTextField();    
#                 a.setFont(new java.awt.Font("Tahoma", 0, 9));    
#                 a.setText(listaCobranca.get(i).getTipoCobranca());    
#                 listaCheckBox.add(a);    
#                 listaValores.add(b);    
#                 cobranca1.add(a);    
#                 valores1.add(b);    
#             }

Neste post eu mostro como fazer a classe de banco de dados:
[url]http://www.guj.com.br/posts/list/214173.java#1096490[/url]

Ainda está fortemente acoplado, mas pelo menos, a classe DAO está separada, da classe de apresentação, e da classe de conexão ao banco.
Acho que com isso você consegue resolver cara!!!
Espero ter ajudado!

J

Cara, foi e está sendo de muita ajuda sim, mas tenho uma duvida, nao sei se já trabalhou, se sabes como que se faz…
por exemplo, eu criei toda a minha conexao com o banco, classe que recebe os gets e sets, os arrays e tudo mais, mas esse for que seria o for que finaliza todo o exemplo, ele está trabalhando com jtextfield e outro objetos.
Como eu trabalho com JSF pra web, nao vou ter um objeto desses no meu .xhtml, e sim vou ter um inputext entre outros objetos relacionados a uma pagina. Ai vem a pergunta: Como faço para que esse codigo que está em uma classe, crie os meus campos no xhtml?

Desde já agradeço pela força!
Abraços!

L

Cara você usa qual IDE para criar suas páginas? E qual versão do java?

Vou ver se consigo explicar. Suponhamos que vc tenha na sua página um campo que fornece texto estático. No seu JSP vai ficar assim:
<webuijsf:staticText binding="#{Preview.lengthText}" id="lengthText" text="#{SessionBean1.movieListDp.value['length']} minutes"/>
Onde o texto recebido é isso:
text="#{SessionBean1.movieListDp.value['length']} minutes"
E lá na sua classe java, que no casso é o SessionBean1 você vai ter o objeto que o JSP faz referência:
private MovieListDataProvider movieListDp = new MovieListDataProvider();

    /**
     * Getter for property movieListDp.
     * @return Value of property movieListDp.
     */
    public MovieListDataProvider getMovieListDp() {
        return this.movieListDp;
    }
Neste caso, como está bem O.O o projeto listo para você as classes do objeto pra vc ver da onde saiu o value length
public class MovieListDataProvider extends ObjectListDataProvider {
    public MovieListDataProvider() {
        List movies = new ArrayList();
        Movie dukeMovie = getDukeMovie();
        movies.add(dukeMovie);
        this.setList(movies);
    }

    public static Movie getDukeMovie() {
        Movie movie = new Movie();
        movie.setTitle("The Adventures of Duke");
        movie.setYear(new Integer(2005));
        movie.setLength(new Integer(0));
        movie.setRating("G");
        movie.setDescription("A nonexistent movie about Duke's adventures.");
        movie.setGenre("Action/Adventure");
        movie.setImage("resources/duke_adventures.jpg");
        return movie;
    }
}
E a pojo
public class Movie implements Serializable {
    
    private static int nextId = 1;
    
    /** Creates a new instance of Movie */
    public Movie() {
        synchronized(Movie.class) {
            this.id = new Integer(nextId);
            nextId++;
        }
    }

    /**
     * Holds value of property title.
     */
    private String title;

    /**
     * Getter for property title.
     * @return Value of property title.
     */
    public String getTitle() {

        return this.title;
    }

    /**
     * Setter for property title.
     * @param title New value of property title.
     */
    public void setTitle(String title) {

        this.title = title;
    }

    /**
     * Holds value of property year.
     */
    private Integer year;

    /**
     * Getter for property year.
     * @return Value of property year.
     */
    public Integer getYear() {

        return this.year;
    }

    /**
     * Setter for property year.
     * @param year New value of property year.
     */
    public void setYear(Integer year) {

        this.year = year;
    }

    /**
     * Holds value of property length.
     */
    private Integer length;

    /**
     * Getter for property length.
     * @return Value of property length.
     */
    public Integer getLength() {

        return this.length;
    }

    /**
     * Setter for property length.
     * @param length New value of property length.
     */
    public void setLength(Integer length) {

        this.length = length;
    }
E por fim na classe java do JSP a gente tem:
private StaticText lengthText = new StaticText();

    public StaticText getLengthText() {
        return lengthText;
    }

    public void setLengthText(StaticText st) {
        this.lengthText = st;
    }

Acho que é isso aí que você precisa cara.

L

No caso o Eclipse eu não conheço, utilizo o Netbeans, e JSPs.

J

lordtiago, cara sei que to te alugando mas ate que tu nao se cansa de me ajudar, vo te pedindo as coisas…
vo te manda as classes que eu tenho, que no caso fiz encima do exemplo que vc me mandou.

E respondendo a tua pergunta, uso Eclipse, com JSF 2.0 com o servidor TomCat

segue a classe de conexao com banco. Nessa classe faço um metodo de pesquisa simples e conecto com a base:

package Base;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class Conexao {
	private String driver = "org.postgresql.Driver";
	private String user = "postgres";
	private String pwd = "teste55";
	private String url = "jdbc:postgresql://127.0.0.1:5432/leite";

	Connection con = null;

	public Connection Conecta() throws SQLException {
		try {
			Class.forName(driver);
			con = DriverManager.getConnection(url, user, pwd);
		} catch (ClassNotFoundException e) {
			System.out.println("Erro ao conectar " + e);
		} catch (SQLException e) {
			System.out.println("Erro ao conectar " + e);
		}
		System.out.println("conectou");
		return con;
	}

	public ResultSet Consulta(String sql) throws SQLException  {
		try {
			Conecta();
			ResultSet resultado;
			Statement stmt = con.createStatement(); // Obrigatório para inclusão e consulta
			resultado = stmt.executeQuery(sql);// efetiva a consulta no BD
			return resultado;
		}
		catch (SQLException ex) {
			System.out.println("Falha ao pesquisar registro.\n" + ex);
		}
		return null;
	}
}

segue agora a classe com os sets e gets dos campos da tabela do banco de dados que estou trabalhando, uma tabela pquena com 2 campos:

package Fontes;

public class CadLinha {
	private Integer codigo;
	private String descricao;

	public Integer getCodigo() {
		return codigo;
	}

	public void setCodigo(Integer codigo) {
		this.codigo = codigo;
	}

	public String getDescricao() {
		return descricao;
	}

	public void setDescricao(String descricao) {
		this.descricao = descricao;
	}
}

agora vai a classe onde faz a consulta e retorna em um array os campos

package Base;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;

import Fontes.CadLinha;

public class CxCadLinha {
	public ArrayList<CadLinha> listarLinhas() throws SQLException {
		Conexao con = new Conexao();
		String sql = "select codigo, descricao from leite_linha";
		ResultSet rsCampos = con.Consulta(sql);
		ArrayList<CadLinha> listaLinha = new ArrayList<CadLinha>();
		try {

			while (rsCampos.next()) {
				CadLinha menu = new CadLinha();
				menu.setCodigo(rsCampos.getInt("codigo"));
				menu.setDescricao(rsCampos.getString("descricao"));
				listaLinha.add(menu);
			}
		} catch (SQLException ex) {
			Logger.getLogger(CadLinha.class.getName()).log(Level.SEVERE,
					null, ex);
		}
		return listarLinhas();
	}
}

e por fim vem a classe onde DEVERIA…hahah :S estar gerando os campos da tabela no meu xhtml:

package Teste;

import java.sql.SQLException;
import java.util.ArrayList;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.component.html.HtmlInputText;

import Base.CxCadLinha;
import Fontes.CadLinha;

@ManagedBean
@SessionScoped
public class Testes {
	@SuppressWarnings("unused")
	private void CriaCampos() throws SQLException {
		CxCadLinha cxLinha = new CxCadLinha();
		ArrayList<CadLinha> listaCobranca = null;
		try {
			listaCobranca = cxLinha.listarLinhas();
		} catch (Exception e) {
			e.printStackTrace();
		}

		for (int i = 0; i < listaCobranca.size() && i < 8; i++) {
			HtmlInputText texto = new HtmlInputText();
			texto.setValue(listaCobranca.get(i).getDescricao());
		}
	}
}

e agora vem o xhtml com o codigo que deveria trazer os campos:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml"
	xmlns:ui="http://java.sun.com/jsf/facelets"
	xmlns:h="http://java.sun.com/jsf/html"
	xmlns:f="http://java.sun.com/jsf/core">

<h:head>
	<title>Exemplo de base</title>
</h:head>
<body>
	<!--uma linha de teste para trazer de forma fixa os campos !-->
       <h:inputText value="#{testes.criaCampos}"/> 

	<!-- a linha onde TERIA que trazer dinamicamente os campos !-->
        <h:panelGroup beding="#{testes.criaCampos}"/>

</body>
</html>

É desse jeito que eu fiz o meu exemplo pra teste, criando a conexao, depois os campos da tabela, fazendo uma consulta e gravando os campos em um array e por fim das classes gerando os campos dinamicamente, e apresentando na minha xhtml.

Espero que nao tenha confundido mais!

Obrigado pela paciencia!
Abraço!

L
private void CriaCampos() throws SQLException {  
        CxCadLinha cxLinha = new CxCadLinha();  
        ArrayList<CadLinha> listaCobranca = null;  
        try {  
            listaCobranca = cxLinha.listarLinhas();  
        } catch (Exception e) {  
            e.printStackTrace();  
        }  
  
        for (int i = 0; i < listaCobranca.size() && i < 8; i++) {  
            HtmlInputText texto = new HtmlInputText();  
            texto.setValue(listaCobranca.get(i).getDescricao());  
        }  
    }
O problema nosso está aki. Vc criou o texto e setou o valor dele
HtmlInputText texto = new HtmlInputText();  
            texto.setValue(listaCobranca.get(i).getDescricao());
Agora você tem que adicioná-lo na página. Você vai ter que criar abaixo desta linha:
texto.setValue(listaCobranca.get(i).getDescricao());
Um objeto que guarde estes campos e passá-lo como retorno de um método para o método criaCampos que está em void.
<body>  
    <!--uma linha de teste para trazer de forma fixa os campos !-->  
       <h:inputText value="#{testes.criaCampos}"/>   
  
    <!-- a linha onde TERIA que trazer dinamicamente os campos !-->  
        <h:panelGroup beding="#{testes.criaCampos}"/>  
  
</body>
o valor que este panelGroup recebe é o que? Este valor será o tipo de retorno do seu metodo CriaCampos, e também o que irá receber os
HtmlInputText texto

Entendeu agora?
Este objeto deverá ser criado fora do for. E dentro do for ele deve adicionar o HTmlInputText, sacou?

J

Entao cara, olha so, eu fiz mais ou menos como tu me disse, pelo que entendi, nunca trabalhei com isso, entao to meio perdido

package Teste;

import java.sql.SQLException;
import java.util.ArrayList;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.component.html.HtmlInputText;
import javax.faces.component.html.HtmlPanelGroup;

import Base.CxCadLinha;
import Fontes.CadLinha;

@ManagedBean
@SessionScoped
public class Testes {
	private HtmlPanelGroup Grupo;
		
	public HtmlPanelGroup getGrupo() {
		return Grupo;
	}
	public void setGrupo(HtmlPanelGroup grupo) {
		Grupo = grupo;
	}
	
	@SuppressWarnings("unused")
	private HtmlPanelGroup CriaCampos() throws SQLException {
		
		CxCadLinha cxLinha = new CxCadLinha();
		ArrayList<CadLinha> listaCobranca = null;
		try {
			listaCobranca = cxLinha.listarLinhas();
		} catch (Exception e) {
			e.printStackTrace();
		}
		HtmlInputText texto = new HtmlInputText();
		for (int i = 0; i < listaCobranca.size() && i < 8; i++) {
			texto.setValue(listaCobranca.get(i).getDescricao());
			Grupo.getChildren().add(texto);
		}
		return Grupo;
	}
}

Se vc perceber, eu criei um Grupo, um panelgrupo pra adicionar os campos que vao ser gerados pelo for…
Criei o HtmlInputText fora do for, como vc havia me dito e estou passando assim no meu xhtml:

<h:panelGroup beding="#{testes.criaCampos}"/>

So essa linha para que ele pega o retorno que é um grupo que contem os campos.
Mas infelizmente nao fuciona, nao sei mais onde eu posso estar errado.

Se mais uma vez puder dah uma olhada.

Grato
Abraço!

L

Não aparece nenhum código de erro?

J

17/08/2010 16:21:22 com.sun.faces.application.view.FaceletViewHandlingStrategy handleRenderException
SEVERE: Error Rendering View[/Teste.xhtml]
javax.el.PropertyNotFoundException: Property ‘criaCampos’ not found on type Teste.Testes

17/08/2010 16:21:22 org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet Faces Servlet threw exception
javax.el.PropertyNotFoundException: Property ‘criaCampos’ not found on type Teste.Testes

description: The server encountered an internal error () that prevented it from fulfilling this request.

exception: javax.servlet.ServletException: Property ‘criaCampos’ not found on type Teste.Testes
javax.faces.webapp.FacesServlet.service(FacesServlet.java:325)


aparece esses dois codigos de erro, ambos falando do “criaCampos”, presumo eu que algo na classe esteja errado, pois nao consegue carregar o conteudo.
tens ideia?

Se quiseres e tiveres tempo, te mando as classes, por email ou algo assim

J

Olha so cara, se tu reparar os erros, ele nao tah achando o criaCampos, porem ele está se perdendo na hora de chamar o metodo
se eu colocar so o pacote, nao funciona, se eu colocar a classe nao funciona, se eu colocar os dois nao funciona, ai mudei o nome da classe de Testes para Novo
e compilou legal.

Somente nao apareceu nenhum campo, mas compilou legal…sem nenhum erro dessa vez, so aparece a tela embanco.

tens ideia do que possa ser?

L

Cara no meu netbeans eu tenho a opção de clicar com botão direito no painel e tem a opção: Editar Origem de java.
Ele vai para a classe Java do Componentes.
Bom mas, de qualquer forma, na propriedades do componente você tem a opção: Valor Inicial, aqui pra mim tem

new HtmlPanelGrid()

No lugar deste trecho, é só por a chamada de método.

Este é o certo cara. Na instanciação do Painel, vc entrega o método que retorna o tipo do Painel.
Acho que agora vai.
No JSP vc deixa como estava antes. não seta nenhuma opção pra ele.

Criado 13 de agosto de 2010
Ultima resposta 17 de ago. de 2010
Respostas 15
Participantes 3