Reputation:
So, I have some JButton
s and I need to change the font size according to how big the screen is. The size of the JButton
s changes automatically since I'm using a GridLayout
layout. I've tried some of the following code, running in a thread:
@Override
public void run() {
int i = 0;
int l = 0;
while(true) {
for(int x=0; x<buttons.length; x++) {
while(true) {
int size = 300;
size--;
Font font = buttons[x].getFont().deriveFont((float) size);
if(font.canDisplayUpTo(buttons[x].getText()) == 1) {
buttons[x].setFont(font);
o(font.getSize());
break;
}
}
buttons[x].setText(String.valueOf( l ));
}
l++;
try {
Thread.sleep(100);
} catch (InterruptedException ex) {}
}
}
Upvotes: 3
Views: 7960
Reputation: 4188
JRowan's answer is correct if you mean the monitor size. Since I'm still not sure if that is what you mean, here is an example using a ComponentListener
and changing the size relative to the frame size, not the monitor size:
import java.awt.EventQueue;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.event.ComponentEvent;
import java.awt.event.ComponentListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.WindowConstants;
public class Example {
public Example() {
JFrame frame = new JFrame();
JButton button = new JButton("Button");
frame.addComponentListener(new ComponentListener() {
@Override
public void componentHidden(ComponentEvent arg0) {
}
@Override
public void componentMoved(ComponentEvent arg0) {
}
@Override
public void componentResized(ComponentEvent arg0) {
int width = frame.getWidth();
int height = frame.getHeight();
button.setFont(new Font(Font.SANS_SERIF, Font.PLAIN, (width + height) / 25));
frame.getContentPane().revalidate();
}
@Override
public void componentShown(ComponentEvent e) {
}
});
frame.getContentPane().setLayout(new GridLayout(1, 1));
frame.getContentPane().add(button);
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
frame.setSize(300, 300);
frame.setVisible(true);
}
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
new Example();
}
});
}
}
Upvotes: 4
Reputation: 7104
to get the screen size use this
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
double width = screenSize.getWidth();
double height = screenSize.getHeight();
and to set the fint size use this according to the width or height
button.setFont(new Font("Arial", Font.PLAIN, (int)width/50));
edit
or if you are trying to change the font size depending on when your component changes size
implement ComponentListener
then
frame.addComponentListener(this);
and methods for the ComponentListener
public void componentHidden(ComponentEvent e) {
}
public void componentMoved(ComponentEvent e) {
}
public void componentResized(ComponentEvent e) {
int width = frame.getWidth();
button.setFont(new Font("Arial", Font.PLAIN, width / 25));
frame.getContentPane().revalidate();
}
public void componentShown(ComponentEvent e) {
}
Upvotes: 4