Prezados,
Eu tenho uma passagem do meu código simples que mostra para o usuário na tela uma pergunta se ele confirma ou não o desejo de sair do programa, segue o código:
if (JOptionPane.showOptionDialog(this, "Deseja realmente sair?", StringConstants.GLOBAL_TITULO_SISTEMA, JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE, null, null, null) == JOptionPane.YES_OPTION) {
Runtime.getRuntime().exit(0);
}
O problema todo é que se eu estou utilizando uma interface sem um LookAndFeel a tabulação nos botões do meu JDialog não funcionam. Eu posso apertar a tecla TAB que ele vai pro botão “Não”, mas ao pressionar “Enter” o sistema pega o valor do botão “Sim.”
Agora quando no construtor da minha classe, classe esta que extende JFrame, eu utilizo o LookAndFeel do Windows o sistema funciona normalmente. A caixa de diálogo aberta recupera o valor do botão “Não” quando eu pressiono Enter neste botão. Segue o código do construtor:
private Construtor() {
super();
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (final ClassNotFoundException e) {
RenameImagensCompraFacil.log.error("Tentativa de iniciar sistema com layout de aplicações para Windows falhou.");
} catch (final InstantiationException e) {
RenameImagensCompraFacil.log.error("Tentativa de iniciar sistema com layout de aplicações para Windows falhou.");
} catch (final IllegalAccessException e) {
RenameImagensCompraFacil.log.error("Tentativa de iniciar sistema com layout de aplicações para Windows falhou.");
} catch (final UnsupportedLookAndFeelException e) {
RenameImagensCompraFacil.log.error("Tentativa de iniciar sistema com layout de aplicações para Windows falhou.");
}
}
Alguém saberia me dizer como fazer para que o sistema se comporte da mesma forma, independente de plataforma.
Obrigado de antemão a todos!
O que eu sei sobre JOptionPane é que ele trabalha um pouco com o sistema.
Descobri isso porque eu executei o JOptionPane sem definir nome pra janela, e dependendo do sistema ele dá nomes diferentes para esta janela.
Mas acho que essa questão de botão não varia de sistema pra sistema,acho que é do próprio java.
E o JOptionPane provavelmente não vai usar o tema definido para o JFrame.
Não entendi direito sua pergunta , mas espero ter ajudado! =D
Também não entendi sua resposta… rs!
Até porque eu não estou com problemas com o JOptionPane, o problema é o JOptionDialog.
Execute os códigos que eu coloquei que você verá o problema.
De qualquer forma, obrigado!
JDialog!?
Não seria JOptionPane.showMesageDialog!? kkkkk’
Acho que entendi agora!
Olha não tenho nenhuma idéia. = /
Unica idéia que tive era criar um JPanel ,add no JOptionPane e aplicar KeyEvents. =D
Mas é estranho esse negócio de mudar o look e mudar até os comando. ><’
Vivendo e aprendendo!
Tomara que eu tenho ajudado mais agora! kkkk’
O JOptionPane.showMesageDialog cria um JDialog internamente.
A sua idéia de criar um JPanel é até uma solução, mas seria um pé no saco implementar tudo, fazer com que o novo JPanel seja modal, interligado ao JPanel que o chama para não quebrar a funcionalidade do Windows do Alt + Tab e etc.
Melhor que isso seria extender o JDialog e reimplementá-lo que é o que estou tentando.
Depois disso é só jogar as alterações pro Source Code do seu JDK, recompilar, talvez mandar para a Oracle rever e ser feliz.
Boa alternativa!
Mas tambm é chato de faze. xD
Mas assim quem sabe a oracle ja té corrija mais um bugsinho pro java 1.7. =D
Boa sorte!
A coisa parece estar saindo aqui.
Só que me atentei que aqui usamos o JDK 1.5.0_11, então este bug pode ter sido já corrigido no Java 6. Vou jogar meu fonte sem minha implementação no JDK 1.6.0_24 que senão me engano é o último e testar.
Se continuar bugado, mantenho minha tentativa de implementação e se tudo der certo mando pra eles.
PS: Quais as chances de eles me levarem a sério e ao menos lerem meu código?
Esse comportamento não é um bug, e sim o comportamento padrão.
O enter aciona o Default Button de uma janela e não o botão que está com foco. Por isso o enter ativa sempre o “Yes Button”. Para acionar pelo teclado o botão com foco, deve usar a barra de espaço.
[quote=Bug Database]This isn’t really a bug, but confusion about the difference between
focus and default-action. The component with focus is activated with
<space>, while the “default” button is activated with <enter>. In
this example case, the first button is always the default, hence it
always responds to the <enter> key, regardless of whether or not it
has the focus. This is how default activation is spec’d to work.[/quote]
Fonte: http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4143620
Se funciona da forma desejada no Windows LAF, é porque ele faz com que o default button seja o botão que estiver com o foco. Você pode setar uma propriedade pelo UIManager que faz o default button seguir o foco:
Prezado Eric Yuzo,
Muito obrigado pela sua ajuda. Você conseguiu com uma linha resolver meu problema que eu acreditava ser de implementação do próprio Java.
Alguns dias depois lendo vi que o Java respeita a implementação do sistema operacional em questão, por isso meu problema não acontecia com o LookAndFeel do Windows. O Mac, por exemplo, permite ao usuário definir a funcionalidade da tecla “Enter”, ou seja, ao pressionar essa tecla, ela pode funcionar como se tivesse sido clicado o botão com o foco ou o botão de default da caixa de diálogo, resumindo, se eu quiser forçar o comportamento do meu programa, devo usar sua linha, caso contrário funcionaria no Windows, mas no Mac quem definiria o comportamento seria o próprio usuário do SO.
De qualquer forma, muito obrigado.