Resizing JButtons and other components according to text
How开发者_如何学编程 do you resize a JButton at runtime so it adapts to the text given by setSize
? I've done some searching and this is the code I've come up with so far. Could this be turned into a utility method?
FontMetrics metrics = getFontMetrics( font );
int width = metrics.stringWidth( string );
P.S: No layout manager is being used.
You need to use setPreferredSize()
on the component. Then, to resize it, call setBounds()
.
I would probably subclass the button, and override the setText(String text)
method to include the resizing code.
@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()));
}
For testing, I did this in the constructor of my new JButton
subclass:
public ResizeToTextButton(String txt){
super(txt);
addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
setText(JOptionPane.showInputDialog("Text"));
}
});
}
So, whenever I clicked on the button I could change the text and see if it resized properly.
I had the same problem, even when using a layout manager (BorderLayout). But in my case a simple call to layoutContainer()
of the associated layout manager and then a repaint()
on the JFrame was sufficient for changing the width of the button.
button1.setText("New Label that differs in width");
// button1 is inside the container horizontalBox
horizontalBox.getLayout().layoutContainer(horizontalBox);
repaint(); // on the containing JFrame
精彩评论