Formulários JInternalFrame de pesquisa com JTable

Bom dia galera,

Estou com uma dificuldade em fazer um esquema aqui em casa.

Tenho 2 JInternalFrames, um é de cadastro de grupos, nesse cadastro tenho um botão de busca que abre outro JInternalFrame com uma JTable, até aí tudo bem, vou ao banco e faço as pesquisas e coloco os valores retornados na JTable. O meu problema é que quando eu clico na JTable os campos do formulário de cadastro deveriam assumir os valores de acordo com o que eu seleciono na JTable.

Ou seja, abro o formulário “A” (de cadastros) e chamo o formulário “B” (de pesquisas), quando eu clicar na JTable que está em “B”, os campos de “A” devem assumir os valores contidos na JTable(está no JInternalFrame “B”).

Quando faço essa busca no mesmo JInternalFrame de cadastro, colocando uma JTable em “A” dá tudo certo, mas como faço quando essa JTable estiver em outro JInternalFrame?

Dexa eu te perguntar uma coisa
vc esta usando DAO (Data Acess Object)?

Bem eu faço aki oq vc esta querendo fazer
eu tenho um tela de cadastro e um botao de consulta. quando eu clico no botao de consulta, ele me mostra uma JInternalFrame com Um jtable.
e qdo dou dois clique na jtable ele me retorna os dados da jtable na tela de cadastro.

Bem o que eu faço é o seguinte
tenho a seguinte classe e interface

public class ResultSetEvent extends EventObject{ public ResultSetEvent(Object source) { super(source); } }

public interface ResultSetListener extends EventListener{ public void addResultSetAtFrame(ResultSetEvent e); }

essa classe e interface eu utilizo elas para preencher as minhas tela de cadastro qdo dou dois clique na jtable
agora vou te mostra um classe que eu utilizo para preencher as telas

[code]public class ResultSetAtFrame implements ResultSetListener {

private InternalFrame i;

public ResultSetAtFrame(InternalFrame f) {
    i = f;
}

public void addResultSetAtFrame(ResultSetEvent e) {

    if (i instanceof FormCidade) {
        Cidade cid = (Cidade) e.getSource();

        FormCidade form = (FormCidade) i;

        form.getJtfCodCid().setText(cid.getCodCid().toString());
        form.getJtfNomeCid().setText(cid.getNomeCid());
        form.getJcbUf().setSelectedItem(cid.getEstado());

        form.setEnableButton(true, false, true, true);

    } 

}
}[/code]
Bem agora vou te mostra a minha tela de consulta PADRAO a de cidade

[code]public abstract class FormConsulta extends javax.swing.JInternalFrame{

protected GenericDao dao;
private final Container painel = getContentPane();
private SimpleTable tabelaPesquisa;
private List<ResultSetListener> result;
private SimpleTextField tfPesquisa;
private JScrollPane scrollpane;
private JButton jbConfirmar;
private SimplePanel panel;

public FormConsulta(){
    createComponents();
    result = new ArrayList<ResultSetListener>();        
}

private void createComponents(){

    painel.setLayout(null);

    panel = new SimplePanel(new GridBagLayout());

    tfPesquisa = new SimpleTextField();
    jbConfirmar = new JButton(CreateIcon.getConfirmar());

    panel.addComponents(tfPesquisa, 0, 0, 200);
    panel.setBorder(BorderFactory.createTitledBorder("Pesquisar"));
    panel.setBounds(20,20,250,90);
    painel.add(panel);

    painel.add(jbConfirmar);
    jbConfirmar.setBounds(280,67,70,40);

    tfPesquisa.addKeyListener(new java.awt.event.KeyAdapter() {
        public void keyReleased(java.awt.event.KeyEvent evt) {
            tfPesquisaKeyReleased();
        }
    });

    jbConfirmar.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            jbConfirmarActionListener();
        }
    });
    
    
}

/**
 * Metodo para criar a InternalFrame para a tela de consulta
 *
 * @param titulo Define o titulo da tela de consulta
 * @param Sizex Define o comprimento da tela
 * @param Sizey Define a altura da tela
 * @param boundsx Define o comprimento da tabela (JScrollPane) na tela
 * @param boundsy Define a altura da tabela (JScrollPane) na tela
 */
protected void setInternalFrame(String titulo, int Sizex, int Sizey, int boundsx , int boundsy){

    painel.setLayout(null);

    scrollpane = new JScrollPane(ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED,
            ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED);
    
    painel.add(scrollpane);
    scrollpane.setBounds(20,130, boundsx, boundsy);        

    setTitle(titulo);
    setSize(Sizex, Sizey);
    setClosable(true);

    createTable();

}    

public SimpleTable getTabelaConsulta(){
    return tabelaPesquisa;
}

public void setCreateTable(SimpleTable tabelaPesquisa) {
    if (null != tabelaPesquisa) {
        this.tabelaPesquisa = tabelaPesquisa;          
        
        this.tabelaPesquisa.addMouseListener(new MouseAdapter() {
            @Override()
            public void mouseClicked(MouseEvent evt) {
                if (evt.getClickCount() >= 2) {
                    SelectedRow(getTabelaConsulta().getSelectedRow());
                }
            }
        });

        scrollpane.setViewportView(this.tabelaPesquisa);

    }
}

public void addResultSetListener(ResultSetListener listener) {
    result.add(listener);
}

public void removeResultSetListener(ResultSetListener listener) {
    result.remove(listener);
}

protected void fireResultSetListener(ResultSetEvent event) {
    for (ResultSetListener listener : result) {
        listener.addResultSetAtFrame(event);
    }
}

public void Consultar(){
    String filtro = (String) tfPesquisa.getText();
    DefaultTableModel model = (DefaultTableModel) tabelaPesquisa.getModel();
    model.setRowCount( 0 );
    Consultar(filtro);
}

public void jbConfirmarActionListener(){
    SelectedRow(tabelaPesquisa.getSelectedRow());        
}

public void tfPesquisaKeyReleased(){
    Consultar();
}

protected abstract void createTable();
protected abstract void SelectedRow(int linha);
protected abstract void Consultar(String filtro);

}[/code]

[code]public class FormConsultaCidade extends FormConsulta {

public FormConsultaCidade(){

    setInternalFrame("Consulta Cidade", 500, 435, 450, 257);
    
    try {
        dao = DaoFactory.getDao("DaoCidade");
    } catch (SQLException ex) {
        ex.printStackTrace();
    }

}

@Override
protected void createTable() {
    SimpleTable table = new SimpleTable();
    table.addColumns("Código", 8, SimpleRenderer.TYPE_INTEGER);
    table.addColumns("Cidade", 30);
    table.addColumns("Estado", 5);

    super.setCreateTable(table);
}

@Override
protected void SelectedRow(int linha) {
    SimpleTable table = getTabelaConsulta();

    if (linha == -1) {
        JOptionPane.showMessageDialog(null, "Selecione uma Cidade", "Selecionar Registro",
                JOptionPane.INFORMATION_MESSAGE);
    }

    Object rowvalue = table.getValueAt(linha, 0);

    if (null != rowvalue) {
        try {
            Cidade cid = (Cidade) dao.selecionarConsulta(Integer.valueOf(rowvalue.toString()));
            ResultSetEvent evento = new ResultSetEvent(cid);
            fireResultSetListener(evento);

            setVisible(false);
        } catch (SQLException ex) {
            ex.printStackTrace();
        }
    }
}

@Override
protected void Consultar(String filtro) {
    try {

        SimpleTable tabelaPesquisa = getTabelaConsulta();

        List<Cidade> cidade = dao.listarConsulta(filtro);
        DefaultTableModel model = (DefaultTableModel) tabelaPesquisa.getModel();
        model.setRowCount(0);
        for (Cidade cid : cidade) {

            Object[] linha = {cid.getCodCid(), cid.getNomeCid(), cid.getEstado()};
            tabelaPesquisa.addRow(linha);

        }
    } catch (SQLException ex) {
        ex.printStackTrace();
    }
}

}[/code]
Agora vou te mostra como faço a chama da tela de consulta

[code]//Verifica se a instancia é um FormCidade
else if (internal instanceof FormCidade) {

        FormCidade form = (FormCidade) internal;

        form.getPanelCid().setEnableField(false);

        if (telaConsulta == null || !telaConsulta.isVisible()) {
            telaConsulta = SwingFactory.getFormConsulta("FormConsultaCidade");
            telaConsulta.addResultSetListener(new ResultSetAtFrame(form));//essa parte é que faz o preenchimento da tela de cadastro
            FormMenu.getDesktopPane(telaConsulta);
            telaConsulta.setVisible(true);
            telaConsulta.Consultar();//metodo para fazer a consulta no banco
        }
    }

}[/code]
No meu sistema eu tenho uma classe de eventos onde eu tenho um metodo “public void consultar()”. esse classe implementa um ActionListener
quando eu clique em “Consultar” na minha tela de cadastro. ela abre a tela de consulta numa outra internalframe. e quando dou dois clique a tela de consulta
ele executa a linha “telaConsulta.addResultSetListener(new ResultSetAtFrame(form));” e coloca na tela o resultado da consulta.
Bem é isso acho que fico meio complicado ainda
mas qualquer coisa me da um toque ai
falow

Não. Tenho apenas uma classe de conexão com os métodos de acesso ao banco, que chamo em cada formulário que preciso utilizar o banco.

Valeu pela ajuda, vou tentar implementar hoje em casa e posto o resultado aqui.

Bom Andr?Heidi Moriya,

Não consegui fazer da forma que vc me passou. Será que têm outras maneiras de se fazer isso?

Valeu…

A tela do sistema é essa aí, se alguem puder me ajudar… da tela de Categorias eu chamo a de busca e na busca, quando eu clicar no grid os valores devem ir para a tela de categorias.


[quote=joyle]A tela do sistema é essa aí, se alguem puder me ajudar… da tela de Categorias eu chamo a de busca e na busca, quando eu clicar no grid os valores devem ir para a tela de categorias.

[/quote]

Estas telas são óptimas! Ajudam-nos a ter uma noção sobre o GUI (que eu sinto que me falta)!
Alguem sabe onde existe alguma coisa no forum sobre isso?

Obrigado!!

[quote=tmagostinho]Estas telas são óptimas! Ajudam-nos a ter uma noção sobre o GUI (que eu sinto que me falta)!
Alguem sabe onde existe alguma coisa no forum sobre isso?

Obrigado!![/quote]
Você pode começar procurando sobre Swing e também sobre o SwingX. Para mudar a aparência padrão do java para uma aparência mais confortável você pode dar uma pesquisada sobre Look And Feel (laf) no java.
De qualquer forma não se baseie nessas GUIs como exemplo. De lá pra cá mudei muita coisa e inclusive esse Look And Feel que estava usando nesse sistema.

O look and feel usado para as telas acima foi o Substance.

[quote=joyle][quote=tmagostinho]Estas telas são óptimas! Ajudam-nos a ter uma noção sobre o GUI (que eu sinto que me falta)!
Alguem sabe onde existe alguma coisa no forum sobre isso?

Obrigado!![/quote]
Você pode começar procurando sobre Swing e também sobre o SwingX. Para mudar a aparência padrão do java para uma aparência mais confortável você pode dar uma pesquisada sobre Look And Feel (laf) no java.
De qualquer forma não se baseie nessas GUIs como exemplo. De lá pra cá mudei muita coisa e inclusive esse Look And Feel que estava usando nesse sistema.

O look and feel usado para as telas acima foi o Substance.[/quote]

De momento nao tenho aqui o meu programa, mas logo a noite irei coloca-lo!
O meu principal problema é em fazer janelas de consulta/pesquisa, não sei porque sempre tive algumas dificuldades nisso!
Nunca sei se é mais fácil para o utilizador ter logo parte da pesquisa incorporada onde insere os dados, ou se numa outra janela.

Relativamente a icones e aparencia geral não acho que esteva muito mau, talvez precise de um look and feel que lhe tire a aparência de JInternalFrame.

Cumps, Tiago