Problema com o JOptionPane

21 respostas
D

Olá a todos, sou novo aqui e gostaria de uma ajuda.
Coloquei o Look and Feel do Substance no meu projeto, mas as janelas de JOptionPane não aparecem.
Digo, elas aparecem mas não tem conteúdo nenhum.
Meu código está assim.

public void LookAndFeel(){ try { UIManager.setLookAndFeel(new SubstanceTwilightLookAndFeel()); } catch (Exception e) { JOptionPane.showMessageDialog(null, "A definição do LookAndFeel 'Substance' falhou." + e.getMessage() , "Erro", JOptionPane.ERROR_MESSAGE); } SwingUtilities.updateComponentTreeUI(this);

E ele é ativado no ActionPerformed

private void formWindowActivated(java.awt.event.WindowEvent evt) {                                     
 LookAndFeel();

Só que as mensagens fica assim:

Alguma sujestão?

21 Respostas

D

Ninguém? :cry: :cry: :cry:

A

Oi dudill,

Não entendi seu problema,mas da uma olhadinha aqui >> http://download.oracle.com/javase/6/docs/api/javax/swing/JOptionPane.html

[url]http://www.javabeginner.com/java-swing/java-joptionpane-class-example [/url]
                                                                                
                                                                                [url]http://www.tiexpert.net/programacao/java/joptionpane.php [/url]

Boa sorte! :wink:

D

Obrigado pelos links. Mas acho que o problema não é no JOptionPane, mas sim no LookAndFeel que não tá executando direito o JOptionPane…

Durante a execução dá essas exceptions, mas não para a execução:

run: org.pushingpixels.substance.api.UiThreadingViolationException: Component creation must be done on Event Dispatch Thread at org.pushingpixels.substance.internal.utils.SubstanceCoreUtilities.testComponentCreationThreadingViolation(SubstanceCoreUtilities.java:1921) at org.pushingpixels.substance.internal.ui.SubstanceOptionPaneUI.createUI(SubstanceOptionPaneUI.java:82) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:623) at sun.reflect.misc.Trampoline.invoke(MethodUtil.java:54) at sun.reflect.GeneratedMethodAccessor5.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:623) at sun.reflect.misc.MethodUtil.invoke(MethodUtil.java:262) at javax.swing.UIDefaults.getUI(UIDefaults.java:767) at javax.swing.UIManager.getUI(UIManager.java:1014) at javax.swing.JOptionPane.updateUI(JOptionPane.java:1875) at javax.swing.JOptionPane.<init>(JOptionPane.java:1838) at javax.swing.JOptionPane.showOptionDialog(JOptionPane.java:859) at javax.swing.JOptionPane.showMessageDialog(JOptionPane.java:668) at javax.swing.JOptionPane.showMessageDialog(JOptionPane.java:639) at javax.swing.JOptionPane.showMessageDialog(JOptionPane.java:610) at ClienteJogo.Cliente.cmd(Cliente.java:137) at ClienteJogo.Cliente.run(Cliente.java:98) UIDefaults.getUI() failed: createUI() failed for javax.swing.JOptionPane[,0,0,0x0,invalid,alignmentX=0.0,alignmentY=0.0,border=,flags=0,maximumSize=,minimumSize=,preferredSize=,icon=,initialValue=,message=Você é o(a) Salva-Vidas,messageType=INFORMATION_MESSAGE,optionType=DEFAULT_OPTION,wantsInput=false] java.lang.reflect.InvocationTargetException java.lang.Error at javax.swing.UIDefaults.getUIError(UIDefaults.java:728) at javax.swing.MultiUIDefaults.getUIError(MultiUIDefaults.java:131) at javax.swing.UIDefaults.getUI(UIDefaults.java:773) at javax.swing.UIManager.getUI(UIManager.java:1014) at javax.swing.JOptionPane.updateUI(JOptionPane.java:1875) at javax.swing.JOptionPane.<init>(JOptionPane.java:1838) at javax.swing.JOptionPane.showOptionDialog(JOptionPane.java:859) at javax.swing.JOptionPane.showMessageDialog(JOptionPane.java:668) at javax.swing.JOptionPane.showMessageDialog(JOptionPane.java:639) at javax.swing.JOptionPane.showMessageDialog(JOptionPane.java:610) at ClienteJogo.Cliente.cmd(Cliente.java:137) at ClienteJogo.Cliente.run(Cliente.java:98)

A

Nunca usei LookAndFeel… :roll:

Talvez isso ajude…

http://m4msakec.com/blog/?p=24

http://www.java2s.com/Tutorial/Java/0240__Swing/CustomizingaJOptionPaneLookandFeel.htm

Boa sorte!

D

Obrigado pelos links denovo, eles estão me ajudando.
:smiley: :smiley:

D

Tentei fazer um JDialog e chamar ele ao invés do JOptionPane mas também não deu certo.
Acho que vou desistir do JOptionPane e JDialog e tentar fazer uma janela e chamar ela ao invés dos dois…
Ou então desabilitar o Look And Feel e usar normal mesmo, porque ai funciona…
:cry:

A

Oi dudill,

Espero que ajude… :wink:

http://javanoroeste.com.br/javanoroeste/novo/artigos/swing_basico.html

http://www.apl.jhu.edu/~hall/java/Swing-Tutorial/Swing-Tutorial-JOptionPane.html

V

Poste:

O método cmd da classe cliente, incluindo a linha 137.
E o método run da classe Cliente, incluindo a linha 98.

Provavelmente faltou incluir o comando EventQueue.invokeLater, pois o erro indica claramente que você está tentando manipular janelas do Swing fora da thread do Swing.

T

Olá ViniGodoy, estou no mesmo projeto.

Onde coloca o comando EventQueue.invokeLater ?

Estou perdido nessa parte de thread

V

Poste os métodos que pedi no tópico acima que eu mostro.

D

ViniGodoy:
Poste:

O método cmd da classe cliente, incluindo a linha 137.
E o método run da classe Cliente, incluindo a linha 98.

Provavelmente faltou incluir o comando EventQueue.invokeLater, pois o erro indica claramente que você está tentando manipular janelas do Swing fora da thread do Swing.

Olá, obrigado pela atenção :smiley:
Esse projeto é o TCC do meu grupo, estamos fazendo tipo uma versão do jogo “Polícia e Ladrão” adaptado para o computador :-o
O código é um pouco grande, mas vou postar.

O método run:

public void run()
    {
        boolean continua = true;
        try
        {
            BufferedReader entrada = new BufferedReader(new InputStreamReader(conexao.getInputStream()));

            while (continua)
            {
                // pega o que o servidor enviou
                linha = entrada.readLine();

                // Verifica se é uma linha é válida. Pode ser que a conexão
                // foi interrompida. Neste caso, a linha é null. fazendo assim sair do loop
                if (linha == null)
                {
                    JanelaCliente.nLinha("Conexão encerrada!");
                    continua = false;
                }

                //Se a linha inicia com '[' imprime no chat
                if (linha.charAt(0) == '[')
                {
                    // caso a linha não seja nula, deve-se imprimi-la
                    JanelaCliente.nLinha(linha);
                }

                //Se a linha começa com '/' chama o metodo para ver qual comando se trata
                if (linha.charAt(0) == '/')
                {
                    cmd(linha);
                }
            }
        } catch (IOException e)
        {
            // caso ocorra alguma exceção de E/S, mostre qual foi.
            JanelaCliente.nLinha("IOException: " + e.getMessage());

        }
    }

E o método cmd:

private void cmd(String linha)
    {
        switch (linha.charAt(1))
        {
            // 'a' entrada de um novo jogador
            case 'a':
            {
                JanelaCliente.atualizaJogador(linha);
                break;
            }

            case 'P':
            {
                switch (linha.charAt(2))
                {
                    //Muda a lbl para Mafioso
                    case 'M':
                    {
                        JanelaCliente.lbl_per.setText("Mafioso");
                        JanelaCliente.img_mafioso.setVisible(true);
                        JanelaCliente.per = 1;
                        envia("/n" + JanelaCliente.txt_Nick.getText());
                        JOptionPane.showMessageDialog(null, "Você é o(a) Mafioso(a)");
                        break;

                    }

                    //Muda a lbl para Salva Vidas
                    case 'S':
                    {
                        JanelaCliente.lbl_per.setText("Salva-Vidas");
                        JanelaCliente.img_salvaVidas.setVisible(true);
                        JanelaCliente.per = 2;
                        JOptionPane.showMessageDialog(null, "Você é o(a) Salva-Vidas");
                        break;
                    }

                    //Muda a lbl para Detetive
                    case 'D':
                    {
                        JanelaCliente.lbl_per.setText("Detetive");
                        JanelaCliente.img_detetive.setVisible(true);
                        JanelaCliente.per = 3;
                        JOptionPane.showMessageDialog(null, "Você é o Detetive");
                        break;
                    }
                    //Muda a lbl para Cidadão
                    case 'C':
                    {
                        JanelaCliente.lbl_per.setText("Cidadão");
                        JanelaCliente.img_cidadao.setVisible(true);
                        JanelaCliente.per = 0;
                        JOptionPane.showMessageDialog(null, "Você é um Cidadão");
                        break;
                    }
                }
                break;
            }

            //Pede para o Mafioso para o Detetive e para o Salva-vidas fazer sua escolha
            case 'e':
            {
                JanelaCliente.escolha();
                break;
            }

            //Elimina o jogador
            case 'f':
            {
                JanelaCliente.elimina(linha.substring(2));
                break;
            }

            case 'y':
            {
                if (JanelaCliente.per == 3)
                {
                    JOptionPane.showMessageDialog(null, "\"" + linha.substring(2) + "\" é o Mafioso");
                }
                break;
            }

            case 'o':
            {
                if (JanelaCliente.per == 3)
                {
                    JOptionPane.showMessageDialog(null, "\"" + linha.substring(2) + "\" não é o Mafioso");
                }
                break;
            }
            case '0':
            {
                JOptionPane.showMessageDialog(null, linha.substring(2), "Servidor", JOptionPane.INFORMATION_MESSAGE);
                break;
            }
            case 'j':
            {
                JanelaCliente.juri = true;
                JanelaCliente.btn_ok.setEnabled(JanelaCliente.vivo);
                break;
            }
            case 'u':
            {
                JanelaCliente.recebeVoto(linha);
                break;
            }
            case 'l':
            {
                JanelaCliente.enviavotos();
                break;
            }
            case 'c':
            {
                JanelaCliente.decisaoJurado(linha.substring(2));
                break;
            }
        }
    }
}
T

ok

V

Acho que dá para colocar aqui (método run da classe Cliente):

//Se a linha começa com '/' chama o metodo para ver qual comando se trata if (linha.charAt(0) == '/') { EventQueue.invokeLater(new Runnable() { public void run() { cmd(linha); } }); }

É importante entender o seguinte. O Swing tem uma thread própria e você não pode alterar seus componentes a partir de outras threads. Como vocês estão no método run(), creio que exista uma thread de vocês rodando aí.

O comando EventQueue.invokeLater faz um pedido par o Swing, para executar o Runnable na Thread dele.

D

Vini, Muito obrigado! Deu certo!
Agora só deu um problema que ele tá repetindo os jogadores que entram, está adicionando o mesmo jogador várias vezes.
Vamos tentar arrumar aqui, muito obrigado mesmo!

D

Então, as JOptionPane estão funcionando perfeitamente :-o
Mas agora com essa alteração, ele está criando uma thread toda vez que chega uma mensagem…
E assim não dá pra jogar…

V

Isso aí não cria Thread nenhuma.

Se existe thread sendo criada, não é aí.

D

Hmm, achei que fosse isso, desculpe.
Então o problema deve estar em outro lugar. Alguma sujestão?

Como pode ver ele está dublicando/sobreescrevendo os jogadores.

V

Bom, só rodando com o depurador e vendo pq ele está chamando seu método que cria jogadores várias vezes.

D

Bom. estou disponibilizando o download do projeto, quem puder me ajudar eu agradeço
:-o
http://www.mediafire.com/?r4b72gnbsjlapgn

T

Valew

crie um metado para mostrar mensagem e coloquei o EventQueue.invokeLater nele.

Obrigado pela ajuda :smiley:

D

Aee, deu certo então.
Obrigado a todos pela ajuda
:-o :-o :-o

Criado 11 de novembro de 2010
Ultima resposta 14 de nov. de 2010
Respostas 21
Participantes 4