Изменение размера кнопок и других компонентов в соответствии с текстом - PullRequest
5 голосов
/ 15 августа 2010

Как вы изменяете размер JButton во время выполнения, чтобы он адаптировался к тексту, заданному setSize?Я провел некоторый поиск, и это код, который я придумал до сих пор.Может ли это быть превращено в служебный метод?

FontMetrics metrics = getFontMetrics( font );
int width = metrics.stringWidth( string );

PS: менеджер компоновки не используется.

Ответы [ 2 ]

6 голосов
/ 15 августа 2010

Вам нужно использовать setPreferredSize() на компоненте.Затем, чтобы изменить его размер, вызовите setBounds().

. Я бы, вероятно, создал подкласс для кнопки и переопределил бы метод setText(String text), включив код изменения размера.

@Override
public void setText(String arg0) {
    super.setText(arg0);
    FontMetrics metrics = getFontMetrics(getFont()); 
    int width = metrics.stringWidth( getText() );
    int height = metrics.getHeight();
    Dimension newDimension =  new Dimension(width+40,height+10);
    setPreferredSize(newDimension);
    setBounds(new Rectangle(
                   getLocation(), getPreferredSize()));
}

Длятестируя, я сделал это в конструкторе моего нового JButton подкласса:

public ResizeToTextButton(String txt){
    super(txt);
    addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent arg0) {
            setText(JOptionPane.showInputDialog("Text"));
        }
    });
}

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

2 голосов
/ 25 ноября 2011

У меня была такая же проблема, даже при использовании менеджера раскладки (BorderLayout). Но в моем случае простого вызова layoutContainer() связанного менеджера компоновки и затем repaint() в JFrame было достаточно для изменения ширины кнопки.

button1.setText("New Label that differs in width");
// button1 is inside the container horizontalBox
horizontalBox.getLayout().layoutContainer(horizontalBox);
repaint(); // on the containing JFrame
...