Java, Swing: como faço para definir a largura máxima de um JTextField?
-
02-07-2019 - |
Pergunta
Eu estou escrevendo um componente de seleção de arquivo de costume. Na minha UI, primeiro o usuário clica em um botão, que aparece um JFileChooser
; quando ele é fechado, o caminho absoluto do arquivo selecionado é gravado em um JTextField
.
O problema é, caminhos absolutos são geralmente muito tempo, o que faz com que o campo de texto para ampliar, fazendo seu recipiente muito grande.
Eu tentei isso, mas ele não fez nada, o campo de texto ainda é muito ampla:
fileNameTextField.setMaximumSize(new java.awt.Dimension(450, 2147483647));
Atualmente, quando está vazio, já é 400px de comprimento, por causa da GridBagConstraints
ligado a ele.
Eu gostaria que fosse como campos de texto em páginas HTML, que têm um tamanho fixo e não ampliar quando a entrada é muito longo.
Então, como faço para definir o tamanho máximo para uma JTextField
?
Solução
Pode depender do gerenciador de layout seu campo de texto está em. Alguns gerenciadores de layout expandir e outros não. Alguns expandir apenas em alguns casos, outros sempre.
Eu estou supondo que você está fazendo
filedNameTextField = new JTextField(80); // 80 == columns
Se assim for, para a maioria dos layouts razoáveis, o campo não deve alterar o tamanho (pelo menos, não deve crescer). gerentes muitas vezes de layout se comportar mal quando colocado em JScrollPane
s.
Na minha experiência, tentando controlar os tamanhos através setMaximumSize
e setPreferredWidth
e assim por diante são precárias na melhor das hipóteses. Balanço decidiu por conta própria com o gerente de layout e há pouco que você pode fazer sobre ele.
Tudo o que está sendo dito, eu não tive o problema que está ocorrendo, o que me leva a crer que algum uso criterioso de um gerenciador de layout vai resolver o problema.
Outras dicas
Eu resolvi isso definindo a largura máxima no recipiente do campo de texto, usando setMaximumSize
.
De acordo com a resposta de davetron, esta é uma solução frágil, porque o gerenciador de layout pode desconsiderar essa propriedade. No meu caso, o recipiente é o mais alto e, em um primeiro teste funcionou.
não definir qualquer um dos tamanhos no campo de texto. Em vez disso definir o tamanho da coluna para um valor diferente de zero via SetColumns ou usando o construtor com o argumento de coluna.
O que está acontecendo é que o tamanho preferido relatado pelo JTextComponent quando colunas é zero é toda a quantidade de espaço necessário para tornar o texto. Quando as colunas é definido como um valor diferente de zero o tamanho preferido é o tamanho necessário para mostrar que muitas larguras das colunas padrão. (Para uma fonte de passo variável que é normalmente próximo do tamanho da caixa inferior 'm'). Com colunas definido para zero o campo de texto está solicitando tanto espaço quanto ele pode chegar e esticando todo o recipiente.
Uma vez que você já tem em um GridBagLayout com um preenchimento, você poderia provavelmente apenas definir as colunas a 1 e deixou o trecho preenchê-lo com base nos outros componentes, ou algum outro número adequadamente baixa.