[RESOLVIDO] Dúvida de orientação a objetos

3 respostas
Onimatsu
Boa tarde colegas. Minha dúvida é simples mais minha explicação é detalhada então considerem como um tutorial de dúvidas. :thumbup: Estou com uma dúvida de como eu vou juntar um código que achei na internet ao meu código. O código que estou querendo instalar por assim dizer cria um filtro de tabela a seguir vou mostrar ele como eu achei percebam que está com metódo main assim é possível testar para saber exatamente do que se trata vejam:
package filtrartabela;

import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.RowFilter;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableModel;
import javax.swing.table.TableRowSorter;

public class JTableFilterDemo_Exemplo1 {

    public static void main(String[] args) {
        Object[][] data = {{"A", 5}, {"B", 2}, {"C", 4}, {"D", 8}};
        String columnNames[] = {"Item", "Value"};
        TableModel model = new DefaultTableModel(data, columnNames) {

            public Class<?> getColumnClass(int column) {
                return getValueAt(0, column).getClass();
            }
        };
        JTable table = new JTable(model);

        RowFilter<Object, Object> filter = new RowFilter<Object, Object>() {

            public boolean include(Entry entry) {
                Integer population = (Integer) entry.getValue(1);
                return population.intValue() > 3;
            }
        };

        TableRowSorter<TableModel> sorter = new TableRowSorter<TableModel>(model);
        sorter.setRowFilter(filter);
        table.setRowSorter(sorter);
        JScrollPane scrollPane = new JScrollPane(table);
        JFrame frame = new JFrame("Filtering Table");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(scrollPane);
        frame.setSize(300, 200);
        frame.setVisible(true);
    }
}
Como visto ele passa os valores e os nomes das colunas dessa forma:
Object[][] data = {{"A", 5}, {"B", 2}, {"C", 4}, {"D", 8}};
        String columnNames[] = {"Item", "Value"};
        TableModel model = new DefaultTableModel(data, columnNames)
No entanto no meu código eu uso um arrayList que está em uma classe a parte chamada RegistroDAO desse jeito:
private static List<Registro> banco = new ArrayList<Registro>();
Para fazer essa adaptação ao meu código para que ele pegue os valores do arraylist e deixe de ser um metódo principal eu criei uma classe chamada componentesEspeciais:
public class ComponentesEspeciais {

    public void FiltraTabela() {

        TableModel model = new DefaultTableModel(new Object[][]{}, new String[]{"Domínio", "Usuário", "Senha"}) {

            @Override
            public Class<?> getColumnClass(int column) {
                return getValueAt(0, column).getClass();
            }
        };
        JTable table = new JTable(model);

        // igual ao exemplo -->
        RowFilter<Object, Object> filter = new RowFilter<Object, Object>() {

            public boolean include(Entry entry) {
                Integer population = (Integer) entry.getValue(1);
                return population.intValue() > 3;
            }
        };

        TableRowSorter<TableModel> sorter = new TableRowSorter<TableModel>(model);
        sorter.setRowFilter(filter);
        table.setRowSorter(sorter);
    }
}
Como visto a principal mudança que eu fiz foi tirar o JFrame e mudar o código nesse trecho, porém não faz nenhuma referência ao arraylist:
TableModel model = new DefaultTableModel(new Object[][]{}, new String[]{"Domínio", "Usuário", "Senha"})
A terceira e última classe que apresento se chama Principal é nela onde está a tabela do meu código. Essa tabela foi gerada automaticamente pelo netBeans no swing com o nome tabelaPrincipal, portanto o código não pode ser alterado. Com solução a isso pensei em criar pelo construtor:
public Principal() {
        ComponentesEspeciais tabelaFiltro = new ComponentesEspeciais(); // isso aqui não deu certo mesmo
        initComponents(); // inicia os componentes da tabela criada automaticamente pelo netBeans
        this.setLocationRelativeTo(null);
        this.setVisible(true);
    }
Eu tentei criar uma instância dos ComponentesEspeciais no construtor da classe Principal porque quando eu seguro Crtl+clico no initComponents(); ele faz referência direta para o código da tabela que foi gerado pelo netBeans que também está na classe Principal, ou seja, criando uma instância de ComponentesEspeciais antes de initComponents(); seria o mesmo que chamar o filtro de tabela (código que estou querendo usar) antes da tabela (criada pelo netBeans) isso é igual a filtro+tabela = tabela com filtro que estou querendo usar. Assim dependendo da ordem em que um método aparece o primeiro método passa os parâmetros para o segundo método. Não sei se isso faz algum sentido para vocês mas acredito que essa seja a única forma de alterar um código protegido pelo netBeans.

Então depois de toda essa explicação onde eu não sei se o meu raciocínio está correto. Eu pergunto:
Como eu posso passar as informações do arrayList (RegistroDAO) para o filtro de (ComponentesEspeciais) e como eu posso chamar essa classe com o metódo filtraTabela() no construtor da classe Principal para que a minha tabelaPrincipal receba os registros filtrados?

(RegistroDAO)<-recebe os dados<-(ComponentesEspeciais)->cria o filtro associado aos registros->(Principal)->mostra tabela + filtro para->[usuário manipular]

3 Respostas

Onimatsu
Fiz uma outra modificação criei uma instância de componentesEspeciais na classe Principal e tentei passar a tabelaPrincipal como argumento para o método FiltraTabela de componentesEspeciais. obs: atenção aos comentários.
public Principal() {
        ComponentesEspeciais tabelaFiltro = new ComponentesEspeciais();
        tabelaFiltro.FiltraTabela(tabelaPrincipal); // PROBLEMA: se eu manter essa linha o programa não inicia
        initComponents();
        this.setLocationRelativeTo(null);
        this.setVisible(true);
    }
public class ComponentesEspeciais {

    public void FiltraTabela(JTable tabela) { // agora pode receber a tabelaPrincipal

        TableModel model = new DefaultTableModel(new Object[][]{}, new String[]{&quot;Domínio&quot;, &quot;Usuário&quot;, &quot;Senha&quot;}) {

            @Override
            public Class&lt;?&gt; getColumnClass(int column) {
                return getValueAt(0, column).getClass();
            }
        };
        JTable table = new JTable(model);
        table = tabela; // associa a tabelaPrincipal a table

        RowFilter&lt;Object, Object&gt; filter = new RowFilter&lt;Object, Object&gt;() {

            public boolean include(Entry entry) {
                Integer population = (Integer) entry.getValue(1);
                return population.intValue() &gt; 3;
            }
        };

        TableRowSorter&lt;TableModel&gt; sorter = new TableRowSorter&lt;TableModel&gt;(model);
        sorter.setRowFilter(filter);
        table.setRowSorter(sorter); // table usa o metódo setRowSorter
    }
    
}
Sei que é uma gambiarra mais a ideia é passar todas as informações da tabelaPrincipal para componentesEspeciais instalar o filtro assim eu não preciso me preocupar com a arrayList já que todas as informações estão definidas na tabelaPrincipal da classe Principal. Mas acho que para funcionar eu também tenho que conseguir passar o model da tabelaPrincipal já que ela também foi definida como DefaultTableModel o que eu quero dizer é que o código gerado pelo netBeans também têm esse trecho:
TableModel model = new DefaultTableModel(new Object[][]{}, new String[]{"Domínio", "Usuário", "Senha"}) {
Não sei se isso é possível então se alguém souber por favor ajude nem que seja para deixar uma opinião.
Gleidson_Henrique

É possível alterar o código das coisas geradas pelo NetBeans. Clique com o botao direito em cima da tabela e clique em ‘Personalizar Codigo’… acredito que seja algo assim…

Veja se lhe é util para seu caso.

Abraços

Onimatsu

Hum… nunca reparei que o netBeans tinha essa opção já modifiquei uma vez pelo eclipse só que quando fui rodar no netBeans ficou com erro vou tentar modificar ela diretamente pelo netBeans e mais tarde posto o resultado.
Vlw pela dica.


Consegui mas não modifiquei o código do netBens fiz o encapsulamento de FiltraTabela e modifiquei o método para que ele recebesse como parâmetros a tabela e o modelo.
Na classe Principal reaproveitei o modelo da tabelaPrincipal através do getModel();
Pra quem quiser fica aí a dica. Flw! :wink:

Criado 16 de setembro de 2012
Ultima resposta 17 de set. de 2012
Respostas 3
Participantes 2