【问题标题】:Changing font size according to screen size根据屏幕大小更改字体大小
【发布时间】:2015-09-13 22:50:14
【问题描述】:

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

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

【问题讨论】:

  • 您可能希望将ComponentListener 添加到框架而不是线程并覆盖它的componentResized 方法。

标签: java swing jframe


【解决方案1】:

获取屏幕尺寸使用这个

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

根据宽度或高度来设置fint大小

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

    }

【讨论】:

  • (1+) 是的,它有效。但我仍然不确定他是指显示器尺寸还是框架尺寸,因为根据屏幕尺寸调整字体不需要线程。
  • 他的意思是如果窗口改变大小,字体大小就会改变。
  • 认为我应该删除这个,他确实说屏幕尺寸哈哈
  • 如果有多个显示器,屏幕尺寸应该从frame.getGraphicsConfiguration().getDevice().getDisplayMode()获取,如下所述:stackoverflow.com/questions/6322627/…
【解决方案2】:

如果您指的是显示器尺寸,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();
            }
        });
    }

}

【讨论】:

    猜你喜欢
    • 2023-03-11
    • 2012-01-01
    • 1970-01-01
    • 2021-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多