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);
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)
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…
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.
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. [/quote]
Olá, obrigado pela atenção
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;
}
}
}
}
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.
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!
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…