Pessoal, abaixo o trecho de código que eu uso pra mostrar um dialog com um combo pro meu usuário escolher uma opção: (o trecho está resumido, pra ficar fácil de entenderem o problema)
[code]// crio as opcoes
String[] opcoes = new String[10]; // AQUI!!!
for (int i = 0; i < opcoes.length; i++)
opcoes[i] = String.valueOf(i);
//
//
JTextArea mensagem = new JTextArea("Número desejado");
mensagem.setEditable(false);
mensagem.setOpaque(false);
mensagem.setWrapStyleWord(true);
int messageType = JOptionPane.PLAIN_MESSAGE;
JOptionPane pane = new JOptionPane(mensagem, messageType,JOptionPane.WARNING_MESSAGE, null, new Object[] {"OK", "Cancelar"}, 0);
pane.setWantsInput(true);
pane.setSelectionValues(opcoes);
JDialog dialog = pane.createDialog(null, "Selecione a opção");
pane.selectInitialValue();
dialog.setVisible(true);
dialog.dispose();
//[/code]
Este trecho de código me mostra a seguinte tela:
Agora observem onde no fonte eu coloquei um comentário assim: // AQUI!!!
Neste ponto, mudem o tamanho do array que está como 10 pra 20, e rode o código novamente, o resultado será essa tela:
Resumindo a novela: A partir do tamanho 20 (ou seja >= a 20) ele muda o componente combo pra um list! Eu já testei numa tela separada e isso não é algo do combo, é algo do JOptionPane msm! Alguém já passou por isso? É um bug? Não tem como eu falar pra ele que não quero que ele mude pra uma lista?!
Não tem aquela famosa regrinha do chefe "se quer que as coisas sejam feitas exatamente como você quer, você tem duas alternativas:
Você tem de fazer você sozinho;
ou
Aceitar que não se pode ter as coisas exatamente do jeito que você quer."
Acredito que até dê para fazer as coisas exatamente do jeito que você quer (passe um JComboBox em vez de um String[]); só que você vai ter um pouco mais de trabalho.
Ah… se formos usar a tal “regrinha do chefe”, não usaremos nada nunca, nem do java, nem de nada… rs…
Enfim, não tem como eu passar um JComboBox invés de uma String[] (bom, pelo menos eu não achei como).
Eu tentei fazer uma super POGmática aqui, primeiro eu consegui chegar até o panel que contém o JComboBox ou o JScrollPane (que tem o JList dentro). Então eu removi o JScrollPane e adicionei um novo combo. Visualmente ficou bom, mas ele não conseguia retornar a posição selecionada do combo.
Então invés de remover o JScrollPane (e consequentemente o JList), eu deixo eles como invisível, então eu adiciono o meu novo combo, e tb adiciono um listener nele, de forma que sempre que modificar a posição do combo, eu modifico a seleção do JList invisível. Desta forma funcionou, me retorna certinho.
Meu problema agora está sendo visual… Bem, vcs já viram como ficava a janelinha antes, agora, vejam como ficou:
Resumindo, o maldito do combo pegou um tal de “auto-ajuste de tamanho” centralizado no JDialog que não consigo tirar. Por favor, como faço pra acertar essa zica?!?!
O método “faça você mesmo” que eu estava sugerindo era bem menos cabeludo. Era só criar uma classe derivada de JDialog que fizesse as coisas do jeito que você precisasse
(OK, ok, eu sei que mexer com layouts é um horror, mas nada que um MigLayout não resolvesse por você…)
Bom, nem achei esse tão cabeludo… tem outros lugares que faço coisas parecidas.
Agora, o tal MigLayout resolveria meu caso? Nunca ouvi falar dele… como fazer pro combo ficar do tamanho do anterior? (na verdade se reajustando como o anterior?)
O MigLayout não é para resolver o seu caso.
É para facilitar o desenho de telas, quando você não quer usar “null layout” e ficar presa a um editor gráfico.
Você pode ser especialista em GridBagLayout, mas sabe que o código fica com graves problemas de manutenção.
Dê uma olhada em http://www.miglayout.com
[quote=thingol]O MigLayout não é para resolver o seu caso.
É para facilitar o desenho de telas, quando você não quer usar “null layout” e ficar presa a um editor gráfico.
Você pode ser especialista em GridBagLayout, mas sabe que o código fica com graves problemas de manutenção.
Dê uma olhada em http://www.miglayout.com[/quote]
Ah thingol… assim não vale! Eu achando que ia resolver minha “ziquinha”…rs…
Então, o que eu preciso no momento é apenas fazer esse tal combo ficar maior, igual era antes. Alguma sugestão?
Ué, tenta criar um componente em uma classe separada e chamar ele como isso. Isso sim é POG. Eu enfrentei um problema semelhante a esse seu, mas ai nao quis perder tempo e fiz logo desse jeito mesmo.
Mas uma coisa, você não consegue acessar o setBounds do JComboBox não?
Sergio Figueras e Ricna:
Olha, já tentei usar um JDialog, mas não tem como ficar igual (gráficamente) ao que o do java traz. E ai eu acabo caindo na mesma situação q eu já estou, ou seja, fica um detalhezinho desgraçado e não fica igual. O fato é que esse não é o único modelo de JOptionPane q eu uso, mudar um seria me obrigar a mudar todos, os layouts não ficam bons, eu até tentei, mas não gostei do resultado não, sinceramente não é satisfatório.
fenrir:
Sim, já tentei alterar essa e muitas outras propriedades do combo… não adianta, ele não muda!
Sobre esse comportamento, o de até 19 itens mostar num combo e após isso num list, é algo que está especificado na API, vejam só o trecho que eu peguei da API do java, especificamente do objeto JOptionPane, método setSelectionValues:
Sets the input selection values for a pane that provides the user with a list of items to choose from. (The UI provides a widget for choosing one of the values.) A null value implies the user can input whatever they wish, usually by means of a JTextField.
Sets wantsInput to true. Use setInitialSelectionValue to specify the initially-chosen value. After the pane as been enabled, inputValue is set to the value the user has selected.
Parameters:
newValues - an array of Objects the user to be displayed [color=red](usually in a list or combo-box)[/color] from which the user can make a selection
See Also:
setWantsInput(boolean), setInitialSelectionValue(java.lang.Object), getSelectionValues()
[/quote]
Eu ainda não estou conseguindo acreditar que eles simplesmente criaram algo que muda independente da vontade do programador. Não é possível isso! E se eu não quero uma lista, será msm que não tem como eu falar pra ele que não quero? Bem esquisito… vou tentar postar no forum da SUN, ver se por lá encontro algo…
Era exatamente isso! Eu sabia que tinha que existir algo mais simples do que aquele monte de coisas que me foram propostas. Muito bom fabiocsi, eu não fazia idéia que dava pra passar desta forma no construtor do JOptionPane. Bom que ficou bem simples a alteração do meu código fonte. Para quem estava acompanhando, o trecho que antes era assim:
JOptionPane pane = new JOptionPane(mensagem, JOptionPane.PLAIN_MESSAGE, JOptionPane.WARNING_MESSAGE, null, new Object[] {"OK", "Cancelar"}, 0);
pane.setWantsInput(true);
pane.setSelectionValues(opcoes);
Agora ficou assim:
JOptionPane pane = new JOptionPane(new Object[] {mensagem, new JComboBox(opcoes)}, JOptionPane.PLAIN_MESSAGE, JOptionPane.WARNING_MESSAGE, null, new Object[] {"OK", "Cancelar"}, 0);
Obrigada à todos que tentaram me ajudar de alguma forma. E mais uma vez obrigada fabiocsi, pela solução simples e eficaz que eu não conhecia!