Dúvida: peço ajuda aos amigos para manipular o comportamento de um menu em um jdesktop

Bom pessoal,

Sou novo no fórum e estou desenvolvendo uma aplicação para efeito de aprendizado e também para auxiliar minha mãe em sua escolinha.
Estou bem no incio e hoje passei praticamente todo o dia apenas tentando fazer o seguinte. Obs: Creio que seja simples podia até continuar de outra forma mas sou teimoso e sei que tem jeito de fazer como eu quero. Vamos ao meu problema

Possuo um frame principal,que dentro dele tenho um jdesktop com um jmenubar.

Tenho também a.minha tela de login que está em um jinternalframe mas que não está dentro do frame principal. Ou seja e uma outra classe. Chamo ela normalmente apenas instanciando-a. Fiz desta forma pq para editar apenas ela e muito mais fácil em termos de design. Quero que cada jinternalframe da minha aplicação seja um arquivo/classe separada. Se e que deu pra entender.

A situação e simples quero que no momento que a aplicação se iniciar. O jmenubar estará com visible false.
E após logar este jmenubar receba o visible true e consequentemente apareça na jdesktop para o usuário .

Acontece que nem por reza braba eu consigo fazer isso RSS. Tentei inúmeras formas, procurei e estudei bastante mas no final as que entendi não funcionaram e outras nem sequer soube implementar.

Se eu criar esta minha tela de login com jinternalframe adicionado dentro do jdesktop consigo fazer perfeitamente, mas como disse sou teimoso e quero que minha aplicação rode do meu jeito ou seja cada tela será uma classe.

E detalhe fiz um teste com um jlabel dentro do desktop e nele eu consigo fazer mudar o texto normalmente colocando ele como static na principal. Mas mesmo fazendo igualzinho o infeliz do comportamento do menu não vai.

Entenderam ? Alguém consegue dar uma luz aí.

Desde já agradeço e serei presente aqui pois agora.vou pegar pra valer o Java. Tô curtindo bastante.

Desde já agradeço.

Acabou que quebrei mais um pouco a cabeça e consegui.

Fiz da seguinte forma:

Public static JMenuBar menubar;

Porém lá em baixo na classe principal estava assim:

JDesktopPane menubar = New JDesktopPane();

Aí mudei para isso:

menubar = New JDesktopPane()

Agora se está certo ou não, não sei, só sei que funcionou. Caso exista alguma forma fiquem a vontade para informar. Valeu

Não usa o mesmo nome de variáveis pra coisas diferentes, até pra vc não se perder depois

Tipo:
JMenuBar menuBar = new…
JDesktopPane desktopPane = new…

Faz sempre uma referência que te auxilie a lembrar o que você está chamando, creio que vc criou uma variável global e uma local, por isso acabou funcionando.

Não faz tudo em uma classe só, um amigo nosso postou algo semelhante ao seus aqui no fórum esses dias, se o seu código passar de um X tamanho, não vai rodar, é interessante você criar as coisas separadas, até por pacote, pra vc se organizar bem. Mas parabéns por conseguir quebrar a cabeça e ter conseguido fazer funcionar, é por aí mesmo

JInternalFrame precisa estar dentro de outro container, geralmente um JDesktopPane

Perfeito, é só cada telinha sua estender a classe JInternalFrame.

Eu faria a tela de login ser um simples JDialog e após o login ocorrer com sucesso, adicionaria o JMenuBar, exemplo:

Classe da aplicação:

import java.awt.Dimension;

import javax.swing.JDesktopPane;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;

public class Aplicacao extends JFrame {

    public static void main(String[] args) {
        Aplicacao programa = new Aplicacao();
        programa.setDefaultCloseOperation(EXIT_ON_CLOSE);
        programa.setLocationRelativeTo(null);
        programa.setVisible(true);
    }

    private JDesktopPane desktopPane;
    private TelaLogin telaLogin;

    private Aplicacao() {
        super("Minha Aplicação");
        Dimension size = new Dimension(800, 600);
        setSize(size);
        setMinimumSize(size);

        desktopPane = new JDesktopPane();
        setContentPane(desktopPane);
    }

    @Override
    public void setVisible(boolean visible) {
        super.setVisible(visible);
        if (telaLogin == null && visible) {
            telaLogin = new TelaLogin(this);
            telaLogin.setVisible(visible);
        }
    }

    // invocado pela tela de login quando o usuário logou
    void onLogin() {
        // se conseguiu logar então já pode adicionar o MenuBar

        JMenuItem fazUmaCoisa = new JMenuItem("Faz uma coisa");
        fazUmaCoisa.addActionListener(e -> fazUmaCoisa());

        JMenuItem fazOutraCoisa = new JMenuItem("Faz outra coisa");
        fazOutraCoisa.addActionListener(e -> fazOutraCoisa());

        JMenu menu = new JMenu("Meu menu");
        menu.add(fazUmaCoisa);
        menu.add(fazOutraCoisa);

        JMenuBar menuBar = new JMenuBar();
        menuBar.add(menu);

        setJMenuBar(menuBar);
        revalidate();
    }

    private void fazUmaCoisa() {
        JOptionPane.showMessageDialog(this, "Fez uma coisa!", "Mensagem", JOptionPane.INFORMATION_MESSAGE);
    }

    private void fazOutraCoisa() {
        JOptionPane.showMessageDialog(this, "Fez outra coisa!", "Mensagem", JOptionPane.INFORMATION_MESSAGE);
    }

}

Classe da tela de login:

import java.awt.BorderLayout;
import java.awt.FlowLayout;

import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JPanel;

class TelaLogin extends JDialog {

    private final Aplicacao aplicacao;

    TelaLogin(Aplicacao aplicacao) {
        super(aplicacao, "Login", true);
        this.aplicacao = aplicacao;

        setSize(320, 240);
        setResizable(false);
        setLocationRelativeTo(aplicacao);

        JButton buttonLogin = new JButton("Login");
        buttonLogin.addActionListener(e -> login());

        JPanel panelBotoes = new JPanel(new FlowLayout(FlowLayout.RIGHT));
        panelBotoes.add(buttonLogin);

        JPanel panel = new JPanel(new BorderLayout());
        panel.add(panelBotoes, BorderLayout.SOUTH);
        setContentPane(panel);
    }

    private void login() {
        // faz as validações de login e se tudo estiver OK, informa a aplicação de que conseguiu logar
        aplicacao.onLogin();
        setVisible(false);
    }
}
1 curtida

Legal. Como já conseguir vou dando continuidade . Mas obrigado por responder