Problemas com JTabbedPane

6 respostas
B

Estou com dificuldades pra montar a minha tela de cadastros, dentro de uma aba JTabbedPane. Criei uma nova classe que quero montar as telas separadas.

Segue o código da Classe Principal:

import javax.swing.*;

public class Main extends JFrame {

    //OBJETO MENU PARA MENU PRINCIPAL
    JMenuBar barraMenuPrincipal = new JMenuBar();
    JMenu cadastroPropriedades = new JMenu("Propriedades");
    JMenu cadastroBasico = new JMenu("Cadastros");
    JMenu cadastroNegocios = new JMenu("Negócios");
    JMenu cadastroFinanceiro = new JMenu("Financeiro");
    JTabbedPane abas = new JTabbedPane();
    JPanel painelCadastros = new JPanel();
    JPanel painelNegocios = new JPanel();
    JPanel painelFinanceiro = new JPanel();
    JPanel painelPropriedades = new JPanel();

    //CONSTRUTOR
    public Main() {
        super("Aplicativo para Comércio");
        setSize(800, 600);
        setDefaultCloseOperation(EXIT_ON_CLOSE);

        //MONTA MENU PRINCIPAL
        this.montaMenu();
    }

    //CLASSE PRINCIPAL
    public static void main(String[] args) {
        Main framePrincipal = new Main();
        framePrincipal.setVisible(true);
        TelaCadastros cadastros = new TelaCadastros();
        painelCadastros.add(cadastros);
    }

    //MÉTODO QUE MONTA UMA JANELA PRINCIPAL
    private void montaMenu() {

        //*****COMPONENTES DO MENU PRINCIPAL*****

        //COMPONENTES DE PROPRIEDADES
        JMenuItem ajuda = new JMenuItem("Ajuda");
        JMenuItem sair = new JMenuItem("Sair");

        //COMPONENTES DE CADASTROS
        JMenuItem cidades = new JMenuItem("Cidades");
        JMenuItem pessoas = new JMenuItem("Pessoas");
        JMenuItem produtos = new JMenuItem("Produtos");

        //COMPONENTES DE NEGÓCIOS
        JMenuItem aluguel = new JMenuItem("Aluguel");
        JMenuItem compras = new JMenuItem("Compras");
        JMenuItem pedidos = new JMenuItem("Pedidos");
        JMenuItem vendaRapida = new JMenuItem("Venda Rapida");
        JMenuItem comandas = new JMenuItem("Comandas");
        JMenuItem estoque = new JMenuItem("Estoque");

        //COMPONENTES DE FINANCEIRO
        JMenuItem financeiro = new JMenuItem("Financeiro");
        JMenuItem notaSaida = new JMenuItem("Notas de Saída");
        JMenuItem notaEntrada = new JMenuItem("Notas de Entrada");

        //MONTA MENU PRINCIPAL

        //MENU CADASTROS
        this.cadastroBasico.add(cidades);
        this.cadastroBasico.add(pessoas);
        this.cadastroBasico.add(produtos);

        //MENU NEGÓCIOS
        this.cadastroNegocios.add(aluguel);
        this.cadastroNegocios.add(compras);
        this.cadastroNegocios.add(pedidos);
        this.cadastroNegocios.add(vendaRapida);
        this.cadastroNegocios.add(comandas);
        this.cadastroNegocios.add(estoque);

        //MENU FINANCEIRO
        this.cadastroFinanceiro.add(financeiro);
        this.cadastroFinanceiro.add(notaSaida);
        this.cadastroFinanceiro.add(notaEntrada);

        //MENU PROPRIEDADES
        this.cadastroPropriedades.add(ajuda);
        this.cadastroPropriedades.add(sair);

        //BARRA DE MENU PRINCIPAL
        this.barraMenuPrincipal.add(cadastroBasico);
        this.barraMenuPrincipal.add(cadastroNegocios);
        this.barraMenuPrincipal.add(cadastroFinanceiro);
        this.barraMenuPrincipal.add(cadastroPropriedades);
        this.setJMenuBar(barraMenuPrincipal);
        abas.add(painelCadastros,"Cadastros");
        abas.add(painelNegocios,"Negócios");
        abas.add(painelFinanceiro,"Financeiro");
        abas.add(painelPropriedades,"Propriedades");
        getContentPane().add(abas);

    }
}

E a classe Tela Cadastros:

import javax.swing.*;

public class TelaCadastros extends JFrame{

    public TelaCadastros(){
    //BARRA DE MENU DE CADASTROS
    JMenuBar barraMenuCadastros = new JMenuBar();
    Icon iconeEstados = new ImageIcon(getClass().getResource("estados.png"));
    JMenu estados = new JMenu("Estados");
    barraMenuCadastros.add(estados);
    this.add(barraMenuCadastros);
    }
}
O erro segue na linha:
painelCadastros.add(cadastros);
e diz que "non-static variable painelCadastros cannot be referenced from a static context

O que posso fazer pra corrigir isso? Esse é um jeito correto de se criar as telas? Cada uma em uma classe diferente?
Como fazê-lo? Desde já agradeço!

6 Respostas

ViniGodoy
public static void main(String[] args) {  
         Main framePrincipal = new Main();  
         framePrincipal.setVisible(true);  
         TelaCadastros cadastros = new TelaCadastros();  
         framePrincipal.painelCadastros.add(cadastros);  
     }

Lembre-se, um método estático não pertence a um objeto específico. Portanto, você não pode simplesmente usar uma variável de instância, sem dizer à qual instância ela se refere.

B

Esqueci esse detalhe. Vlw Vini!
So uma coisa. Esse é o método certo de se fazer isso? Cada tela em uma classe diferente?

ViniGodoy

É sim. Mas geralmente a tela se constroi totalmente. É muito estranho chamar um add depois, no main, como vc fez ali.

B

Eu imagine que teria q chamar as telas num certo momento pelo metodo principal. Então posso construir todas as abas de uma vez no construtor Main?

ViniGodoy

O main não é um construtor. É um método estático especial, que o Java roda por primeiro. O ideal é você construir as abas no construtor (ou no método initialize) da janela que as contém. Assim, você poderá abrir essa janela de outros locais, que não o main.

B

Eu me referi a construtor main porque minha classe se chama Main assim como o construtor. acho que nao fui feliz ao criar a classe. T_T
Depois vou refatorá-la!

Criado 27 de março de 2011
Ultima resposta 29 de mar. de 2011
Respostas 6
Participantes 2