user4319018
user4319018

Reputation:

Changing font size according to screen size

So, I have some JButtons and I need to change the font size according to how big the screen is. The size of the JButtons 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

Answers (2)

Lukas Rotter
Lukas Rotter

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

JRowan
JRowan

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

Related Questions