Как отключить изменение размера textField в Java Swing?

У меня есть графический интерфейс, основанный на Swing JPanel, который использует BorderLayout. На северной панели я добавил новую JPanel, которая использует FlowLayout и содержит два текстовых поля и другие компоненты. Когда я изменяю текст textField и делаю невидимыми некоторые компоненты внутри этой панели, это textField продолжает изменять размер. Как я могу этого избежать? Я хотел бы, чтобы textField сохранял тот же размер, что бы ни происходило. Я пробовал setSize, setPreferredSize, setMinimumSize безуспешно.

txtSource = new WebTextField(source);
    txtSource.setMaximumSize(new Dimension(30,20));
    txtSource.setMinimumSize(new Dimension(20, 20));
    txtSource.setEditable(false);
    txtDestination = new WebTextField(destination);
    txtDestination.setMaximumSize(new Dimension(30,20));
    txtDestination.setMinimumSize(new Dimension(20, 20));

до: введите здесь описание изображения

после: введите здесь описание изображения


person itro    schedule 30.01.2012    source источник
comment
использование FlowLayout приводит к изменению размера компонента. Попробуйте другую раскладку.   -  person xyz    schedule 30.01.2012
comment
Возможный дубликат - stackoverflow.com/questions/6492794 /   -  person mre    schedule 30.01.2012
comment
общее правило состоит в том, чтобы никогда не использовать setXXSize (с XX = min/pref/max). Вместо этого используйте соответствующий LayoutManager. Предполагая, что WebTextField является подклассом JTextField, вы можете настроить его prefSize с точки зрения столбцов (примерно количество символов)   -  person kleopatra    schedule 30.01.2012
comment
Эмм.. Скриншоты? Какая от них польза? Чтобы быстрее получить помощь, опубликуйте SSCCE.   -  person Andrew Thompson    schedule 30.01.2012
comment
@AndrewThompson, они показали изменение размера текстовых полей, не так ли? Это ценно или не ценно?   -  person Ungeheuer    schedule 10.06.2015
comment
@JohnnyCoder Это ценно или не ценно? Учитывая, что это можно было передать словами «текстовые поля растягиваются в стороны», не ценно (и огромная трата байтов).   -  person Andrew Thompson    schedule 10.06.2015
comment
Вы, вероятно, уже поняли это, но вы могли бы создать boxLayout с BoxLayout.Y-AXIS для своей большой панели, а в верхней части поместить другую панель с нулевым макетом и использовать setBounds(int x, int y, int width, int height), и размер текстовых полей не должен изменяться. Затем добавьте еще одну панель с нужным макетом.   -  person Ungeheuer    schedule 11.06.2015


Ответы (2)


вы не можете сделать это так, как хотите, некоторые LayoutManagers игнорируют для setXxxSize, но вы можете использовать f.e. BoxLayout, который принимает за setXxxSize

person gprathour    schedule 30.01.2012
comment
-1 LayoutManagers не принимают setXXSize - вместо этого они используют подсказки по размеру (независимо от того, неправильно ли они установлены кодом приложения или правильно рассчитаны внутренне) для определения размера/позиции компонентов, как задокументировано (плохо ;-) в их API-документе. - person kleopatra; 30.01.2012

Когда я изменяю текст textField и делаю невидимыми некоторые компоненты внутри этой панели, это textField продолжает изменять размер.

В этом примере показаны текстовые поля постоянного размера. Можете ли вы добавить SSCCE кода, который этого не делает?

Размер текстового поля

import java.awt.*;
import javax.swing.*;

class TextFieldSize {

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                JTextField smallField = new JTextField(5);
                JTextField largeField = new JTextField(20);
                JPanel gui = new JPanel(new FlowLayout());
                gui.add( smallField );
                gui.add( largeField );
                JFrame f = new JFrame("Text Field Size");
                f.add(gui);
                f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
                f.pack();
                f.setLocationByPlatform(true);
                f.setVisible(true);
            }
        });
    }
}
person Andrew Thompson    schedule 30.01.2012