Action entre classes

2 respostas
diegogm

Bom dia pessoal!

Não sei se é fácil ou complicado o que quero fazer, porem não estou conseguindo resolver minha questão.

Estou fazendo uma interface de relatórios, onde uso um diretório para montar uma JTree para fazer a hierarquia
dos relatórios, porem pra cada relatório utilizo JComboBox para filtros desses relatórios que são muitos.
Queria colocar esses filtros numa classe e quando eu clicasse no relatório tal e desse ação ao botão viesse esses
filtros (Combos) na minha classe principal, eles tem uma painel respectivo e uma posição certa para que eles fiquem
dentro do painel principal, no caso a classe principal.

Irei ilustrar pra ficar melhor entendido:

http://img404.imageshack.us/img404/6783/reportm.jpg

Na parte de cima é minha JTree e em cada pasta dela consta os relatórios, na parte de baixo que são as combos e outros
componentes são os filtros, queria jogar os filtros em uma outra classe e colocar a ação quando clico no botão trazer os filtros
respectivos num painel com seus componentes na posição que eu definir para que fique igual a imagem.

Queria postar o código mais ele no momento enquanto eu não separo a classe está imenso. Não sei se é devido postar o código
tão grande da maneira que está.

Alguém poderia me dar uma dica, estou meio atrasado com isso para entrega na empresa, já pesquisei bastante e não achei
solução. Agradeço a ajuda de todos! :thumbup:

2 Respostas

Nicolas_Fernandes

Opa, diegogm, beleza?
Não sei se entendi direito, mas vamos lá: você quer que alguns filtros sejam padrão de todos os relatórios e outros mutáveis, dependendo do relatório selecionado?
Se for assim, você pode fazer:

  1. Crie uma classe que estenda de JPanel e contenha os filtros padrão;
  2. Ao chamar os filtros de um determinado relatório, você cria uma instância dessa classe acima criada e adiciona os filtros específicos.

Seria isso o que você precisa?

diegogm
Nicolas Fernandes:
Opa, diegogm, beleza? Não sei se entendi direito, mas vamos lá: você quer que alguns filtros sejam padrão de todos os relatórios e outros mutáveis, dependendo do relatório selecionado? Se for assim, você pode fazer:

1. Crie uma classe que estenda de JPanel e contenha os filtros padrão;
2. Ao chamar os filtros de um determinado relatório, você cria uma instância dessa classe acima criada e adiciona os filtros específicos.

Seria isso o que você precisa?

Fala Nicolas Fernandes, beleza sim e vc?

Então é assim eu tenho uma classe que nela tem a estrutura de uma JTree e uma barra de botões já feitas em um JPanel, porém nessa mesma interface eu deixei um
espaço para que na hora que eu selecionasse um relatório da Tree e clicasse no botão de filtros aparecesse os filtros abaixo.

Segue o código dessa classe:

package view;

import java.awt.BorderLayout;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import java.io.File;

import javax.swing.BorderFactory;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JSeparator;
import javax.swing.JToolBar;
import javax.swing.JTree;
import javax.swing.SwingConstants;
import javax.swing.tree.DefaultMutableTreeNode;

public class Relatorios extends JFrame {

    private JPanel painelTreeAux = new JPanel(new BorderLayout());
    private JPanel painelTree = new JPanel(new BorderLayout());
    private JToolBar barBotoes = new JToolBar();
    private JButton btnInformaParametros = new JButton();
    private JButton btnListaRelatorios = new JButton();
    private JButton btnMontaRelatorio = new JButton();
    private JButton btnVoltar = new JButton();
    private JScrollPane scroll1;
    private DefaultMutableTreeNode rootNode;
    private JTree tree;
    private JSeparator separator;

    public Relatorios() {
        init();
    }

    public void init() {

        this.setTitle("Relatórios");
        this.setIconImage(new ImageIcon(getClass().getResource("/image/ICONE_TITULO.png")).getImage());
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setSize(600, 650);

        this.setLocationRelativeTo(null);
        this.setResizable(false);
        painelTree.setLayout(null);
        painelTree.setSize(600, 650);
        this.add(painelTree);

        barBotoes.setBounds(0, 0, 195, 45);
        barBotoes.setFloatable(false);

        btnInformaParametros.setIcon(new javax.swing.ImageIcon(getClass().getResource("/image/BTS_Relatorios/BT_Informa_Parametros_Selecao.png")));
        btnListaRelatorios.setIcon(new javax.swing.ImageIcon(getClass().getResource("/image/BTS_Relatorios/BT_Lista_Relatorios.png")));
        btnMontaRelatorio.setIcon(new javax.swing.ImageIcon(getClass().getResource("/image/BTS_Relatorios/BT_Monta_Relatorio.png")));
        btnVoltar.setIcon(new javax.swing.ImageIcon(getClass().getResource("/image/BTS_Relatorios/BT_Voltar.png")));

        barBotoes.add(btnInformaParametros);
        barBotoes.add(btnListaRelatorios);
        barBotoes.add(btnMontaRelatorio);
        barBotoes.add(btnVoltar);

        painelTree.add(barBotoes, BorderLayout.NORTH);

        rootNode = new DefaultMutableTreeNode("Relatórios");
        tree = new JTree(rootNode);

        scroll1 = new JScrollPane(tree);
        scroll1.setBounds(0, 45, 595, 400);
        painelTree.add(scroll1);

        separator = new JSeparator(SwingConstants.HORIZONTAL);
        painelTree.add(separator);
        separator.setBounds(0, 440, 600, 20);
        
        //Chama o método para popular o JTree
        listAllFiles("C:\\Users\\diego\\Desktop\\Relatorios", rootNode, true);

        this.setVisible(true);
    }

    /**
     * @params: String directory - o diretório a trabalhar
     * @params: DefaultMutableTreeNode parent - o node pai
     * @params: Boolean recursive - determina se vai trabalhar com as subpastas, ou só o pai
     */

    public static void listAllFiles(String directory, DefaultMutableTreeNode parent, Boolean recursive) {
        // Lista todos os arquivos no diretório "String directory" no array "children"
        File[] children = new File(directory).listFiles();

        for (int i = 0; i < children.length; i++) {

            // Pega o nome de cada Pasta ou Arquivo
            DefaultMutableTreeNode node = new DefaultMutableTreeNode(children[i].getName());
            // Só mostra o Node se ele é uma pasta e se esta é uma chamada recursiva
            if (children[i].isDirectory() && recursive) {
                parent.add(node); // adiciona como filho
                listAllFiles(children[i].getPath(), node, recursive); // chamada recursiva para trabalhar com o filho
            } else if (!children[i].isDirectory()) { // senão caso não seja um diretório
                parent.add(node); // adiciona como um arquivo
            }
        }
    }

    public static void main(String[] args) {

        new Relatorios();
    }

}

Quero que esses filtros fiquem todos em paineis, no caso os filtros são combos, são 53 relatórios com sua quantidade de filtros cada um. Sendo assim criei uma estrutura
em JPanel para cada filtro de relatório, segue o código:

/**
     * Estrutura para Filtros, Classe Filtros
     */


     //Filtros do Relatório 1
    private JPanel painelClassifLotesEst = new JPanel();
    private JLabel lblClassifLotesEst = new JLabel();
    private JLabel lblClassifLotesEstLoc = new JLabel();
    private JLabel lblClassifLotesEstEstTel = new JLabel();
    private JComboBox cbxClassifLotesEstLoc = new JComboBox();
    private JComboBox cbxClassifLotesEst = new JComboBox();
    private JCheckBox ckClassifLotesEst = new JCheckBox();

    //Filtros do Relatório 2
    private JPanel painelClassifLotesLoc = new JPanel();
    private JLabel lblClassifLotesLoc = new JLabel();
    private JLabel lblClassifLotesLocNomLoc = new JLabel();
    private JComboBox cbxClassiLotesLoc = new JComboBox();

    painelTree.add(painelClassifLotesEst);
    painelClassifLotesEst.setBounds(0, 445, 600, 300);
    painelClassifLotesEst.setLayout(null);

    painelClassifLotesEst.add(lblClassifLotesEst);
    lblClassifLotesEst.setBorder(BorderFactory.createTitledBorder("Classificação de Lotes por Estação"));
    lblClassifLotesEst.setBounds(3, 0, 590, 80);

    painelClassifLotesEst.add(cbxClassifLotesEstLoc);
    cbxClassifLotesEstLoc.setBounds(265, 25, 300, 20);

    painelClassifLotesEst.add(cbxClassifLotesEst);
    cbxClassifLotesEst.setBounds(265, 50, 300, 20);

    painelClassifLotesEst.add(ckClassifLotesEst);
    ckClassifLotesEst.setBounds(565, 50, 150, 20);
    painelClassifLotesEst.add(lblClassifLotesEstLoc);
    lblClassifLotesEstLoc.setText("Localidade");
    lblClassifLotesEstLoc.setBounds(195, 25, 70, 20);

    painelClassifLotesEst.add(lblClassifLotesEstEstTel);
    lblClassifLotesEstEstTel.setText("Estação Telefônica");
    lblClassifLotesEstEstTel.setBounds(150, 50, 120, 20);
    painelClassifLotesEst.setVisible(false);

    painelTree.add(painelClassifLotesLoc);
    painelClassifLotesLoc.setBounds(0, 445, 600, 300);
    painelClassifLotesLoc.setLayout(null);

    painelClassifLotesLoc.add(lblClassifLotesLoc);
    lblClassifLotesLoc.setBorder(BorderFactory.createTitledBorder("Classificação de Lotes por Localidade"));
    lblClassifLotesLoc.setBounds(3, 0, 590, 60);
    painelClassifLotesLoc.add(cbxClassiLotesLoc);
    cbxClassiLotesLoc.setBounds(265, 30, 300, 20);

    painelClassifLotesLoc.add(lblClassifLotesLocNomLoc);
    lblClassifLotesLocNomLoc.setText("Localidade");
    lblClassifLotesLocNomLoc.setBounds(195, 30, 70, 20);
    painelClassifLotesLoc.setVisible(false);

Como no exemplo acima criei um painel para cada relatório, eu só queria criar essa classe de filtros e quando eu selecionar um relatório na Tree ter a referencia correta
e chamar o devido filtro na primeira classe, porém não estou sabendo como fazer isso infelizmente.

Não sei se deu para entender melhor mais é assim...

Criado 5 de novembro de 2012
Ultima resposta 6 de nov. de 2012
Respostas 2
Participantes 2