Não consigo visualizar ShowMessageDialog no Netbeans

10 respostas
rafaelantonio1986

Ao clicar no Menu item [color=red]Sobre[/color] quero que o programa apareca uma caixa de mensagem dizendo " Sistema de Venda, Rafael Rodrigues"
Só que ao executar [b]o main ao clicar não ta aparecendo nada.
Da um erro de I no Public Void rum ()
Ta pedindo para implementa o metodo de Java.Lang.Runnable

Segue o codigo da minha classe Principal.java

package SistemaJava.view;

import javax.swing.JOptionPane;

/**
 *
 * @author Marcelo
 */
public class Principal extends javax.swing.JFrame {

    /** Creates new form Principal */
    public Principal() {
        initComponents();
    }

    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">                          
    private void initComponents() {

        jMenuBar1 = new javax.swing.JMenuBar();
        jMenu1 = new javax.swing.JMenu();
        jMenuItem1 = new javax.swing.JMenuItem();
        jMenuItem2 = new javax.swing.JMenuItem();
        jMenu2 = new javax.swing.JMenu();
        jMenuItem3 = new javax.swing.JMenuItem();
        jMenuItem4 = new javax.swing.JMenuItem();
        jMenuItem5 = new javax.swing.JMenuItem();
        jMenu3 = new javax.swing.JMenu();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

        jMenu1.setMnemonic('O');
        jMenu1.setText("Opções");
        jMenu1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jMenu1ActionPerformed(evt);
            }
        });

        jMenuItem1.setMnemonic('S');
        jMenuItem1.setText("Sobre");
        jMenu1.add(jMenuItem1);

        jMenuItem2.setMnemonic('E');
        jMenuItem2.setText("Sair");
        jMenuItem2.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jMenuItem2ActionPerformed(evt);
            }
        });
        jMenu1.add(jMenuItem2);

        jMenuBar1.add(jMenu1);

        jMenu2.setText("Cadastrar");

        jMenuItem3.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_C, java.awt.event.InputEvent.ALT_MASK | java.awt.event.InputEvent.CTRL_MASK));
        jMenuItem3.setText("Clientes");
        jMenu2.add(jMenuItem3);

        jMenuItem4.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_F, java.awt.event.InputEvent.ALT_MASK | java.awt.event.InputEvent.CTRL_MASK));
        jMenuItem4.setText("Fornecedores");
        jMenu2.add(jMenuItem4);

        jMenuItem5.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_P, java.awt.event.InputEvent.ALT_MASK | java.awt.event.InputEvent.CTRL_MASK));
        jMenuItem5.setText("Produtos");
        jMenu2.add(jMenuItem5);

        jMenuBar1.add(jMenu2);

        jMenu3.setText("Vendas");
        jMenuBar1.add(jMenu3);

        setJMenuBar(jMenuBar1);

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 765, Short.MAX_VALUE)
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 319, Short.MAX_VALUE)
        );

        pack();
    }// </editor-fold>                        

    private void jMenu1ActionPerformed(java.awt.event.ActionEvent evt) {                                       
 JOptionPane.showMessageDialog(null, "Sistema de Vendas - Rafael Rodrigues Antonio");           
    }                                      

    private void jMenuItem2ActionPerformed(java.awt.event.ActionEvent evt) {                                           
            System.exit(0);    
    }                                          

    /**
     * @param args the command line arguments
     */
   public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new Principal().setVisible(true);
            }
        });
    }
    // Variables declaration - do not modify                     
    private javax.swing.JMenu jMenu1;
    private javax.swing.JMenu jMenu2;
    private javax.swing.JMenu jMenu3;
    private javax.swing.JMenuBar jMenuBar1;
    private javax.swing.JMenuItem jMenuItem1;
    private javax.swing.JMenuItem jMenuItem2;
    private javax.swing.JMenuItem jMenuItem3;
    private javax.swing.JMenuItem jMenuItem4;
    private javax.swing.JMenuItem jMenuItem5;
    // End of variables declaration                   
}

Estou fazendo um curso de Video-Aulas de programação em Java e estou fazendo o passo a passo, mas chega nessa etapa essa caixa de mensagem não aparece

10 Respostas

ViniGodoy

A linha do seu messagebox está errada. Deveria ser:

InicianteJavaHenriqu

O verdadeiro erro está que você adicionou o evento no jMenu1:

jMenu1.addActionListener(new java.awt.event.ActionListener() {

            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jMenu1ActionPerformed(evt);
            }
        });

Sendo que o correto seria no jMenuItem1:

jMenuItem1.addActionListener(new java.awt.event.ActionListener() {

            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jMenu1ActionPerformed(evt);
            }
        });

Troque jMenu1 por jMenuItem1e funcionará.

P.S.: Se quiser mude de null para this, como o ViniGodoy disse, mas é só uma boa prática com null também funciona.

:thumbup:

rafaelantonio1986

Alterei de null para this e ainda não exibiu a caixa de mensagem.

O que pode ser isso ?

InicianteJavaHenriqu

Faça o que eu falei que dará certo.

:thumbup:

rafaelantonio1986

Obrigado Iniciante Java Henrique

Agora Funcionou !

InicianteJavaHenriqu

De nada :smiley:

Se estiver satisfeito, altere o título do primeiro poste e coloque [RESOLVIDO] após o título.

:thumbup:

ViniGodoy

Na verdade, o comportamento com null e com this é diferente.
Não se trata de só de boa prática, mas da forma correta de se usar o JOptionPane.

O primeiro parâmetro serve para informar quem é a janela pai do JDialog.
Se você não informar, o java irá criar uma janela invisível para atuar como pai.

No Windows, veja como fica o comportamento em cada caso:

  • Com null, com a JOptionPane aberta, quando vc der ALT+TAB para sair da aplicação (sem fecha-la), e der ALT+TAB novamente para voltar a ela, a janela principal voltará visível, travada, e a caixa de mensagem não será exibida. Seu usuário provavelmente ficará perdido, sem saber o que fazer, pois a janela principal não funcionará.
  • Com this, fazendo a mesma coisa, a janela volta travada, mas a caixa de mensagem é exibida, pois você informou que o pai da caixa de mensagem é a tela principal do seu programa.

Sempre forneça quem é o objeto pai de janelas modais, ou você pode acabar com um comportamento inconsistente na mão.
Em outros SOs, o comportamento pode ser até pior, como por exemplo, o modal sequer funcionar.

InicianteJavaHenriqu

Na verdade, o comportamento com null e com this é diferente.
Não se trata de só de boa prática, mas da forma correta de se usar o JOptionPane…

Eu já tinha visto sua breve explicação nas 15 dicas úteis no uso do Swing.

Mas quem te disse que é o modo correto de utilizar :?:

Note:

Nada a mais do que isto que está em negrito.

:thumbup:

ViniGodoy

O duro é que é mesmo um tanto subjetivo o Javadoc. Em JDialog (que é o que o JOptionPane é) diz:

Ou seja, o Javadoc aqui deixa claro que você só deve passar null se o dialog não tiver um dono, que não é o caso aqui.

O fato é que, se você passar null, o comportamento das dialogs modais fica totalmente inconsistente.

Já vi casos em que você não pode empilhar dialogs modais sem que os owners estejam corretamente definidos.
E aquele comportamento estranho que relatei no ALT+Tab, já é motivo suficiente para não dizer que isso é mera boa prática.

Eu considero boa prática apenas aquilo que não vai afetar o funcionamento do seu programa, mas é uma boa regra de estilo para que programadores leiam.
Tal como respeitar code conventions, ou não usar um DefaultTableModel no lugar o AbstractTableModel.

InicianteJavaHenriqu

Sim, no código que o autor do tópico postou o correto seria utilizar o this.

Eu também.

Só não acho que o trecho citado acima seja o fim do mundo.

:thumbup:

Criado 16 de junho de 2012
Ultima resposta 16 de jun. de 2012
Respostas 10
Participantes 3