根据屏幕尺寸改变字体大小

3

因此,我有一些JButton,我需要根据屏幕的大小来更改字体大小。由于我正在使用GridLayout布局,所以JButton的大小会自动更改。我尝试了以下代码(在线程中运行):

@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) {}
        }
    }

1
你可能想将ComponentListener添加到框架而不是线程,并覆盖它的componentResized方法。 - Lukas Rotter
2个回答

4

获取屏幕尺寸,请使用以下代码:

Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
double width = screenSize.getWidth();
double height = screenSize.getHeight();

为了根据宽度或高度设置字体大小,请使用以下内容

button.setFont(new Font("Arial", Font.PLAIN, (int)width/50));

编辑

如果您正在尝试根据组件的大小更改字体大小:

implement ComponentListener

那么

frame.addComponentListener(this);

为 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) {

    }

没错,它可以工作。但我仍然不确定他是真的指的显示器尺寸还是框架尺寸,因为根据屏幕尺寸调整字体不需要线程。 - Lukas Rotter
他的意思是如果窗口大小改变,字体大小也会改变。 - Okx
我觉得我应该把这个移除掉,他确实说了屏幕尺寸哈哈。 - JRowan
2
如果存在多个监视器,则应从frame.getGraphicsConfiguration().getDevice().getDisplayMode()获取屏幕大小,如此处所述:https://dev59.com/0VjUa4cB1Zd3GeqPOykY - Cinnam

4
如果您指的是监视器大小,JRowan的回答是正确的。由于我仍然不确定您是否是这个意思,因此这里有一个例子,使用ComponentListener相对于框架大小而不是监视器大小来更改大小:
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();
            }
        });
    }

}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接