文本根据按钮/标签大小调整大小

时间:2013-12-28 19:30:27

标签: java swing text netbeans resize

如果我没有使用正确的单词/名称/术语,请提前道歉。

我在NetBeans上使用Swing来创建我的gui。由于布局,我能够根据窗口大小调整所有按钮和标签的拉伸/缩小。但是,按钮/标签的文本大小根本不会改变。 如何根据按钮/标签大小调整文本大小?

PS:到目前为止我还没有编写任何代码。这一切都是使用JFrame的{​​{1}}设计thingy制作的。

2 个答案:

答案 0 :(得分:2)

没有简单的方法可以做到这一点,我会质疑为什么你认为这是必需的,但是......

虽然我确信可能有一种简单的方法可以实现这一点,但我研究的大多数解决方案都需要某种Graphics上下文,当我考虑可变宽度字体时,它很快变成了一个真正的混乱...

您可以使用类似......

的内容
import java.awt.Component;
import java.awt.EventQueue;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.event.ComponentAdapter;
import java.awt.event.ComponentEvent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class TextResize {

    public static void main(String[] args) {
        new TextResize();
    }

    public TextResize() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    ex.printStackTrace();
                }

                final JLabel label = new JLabel("Hello");
                label.addComponentListener(new ComponentAdapter() {

                    protected void decreaseFontSize(JLabel comp) {

                        Font font = comp.getFont();
                        FontMetrics fm = comp.getFontMetrics(font);
                        int width = comp.getWidth();
                        int height = comp.getHeight();
                        int textWidth = fm.stringWidth(comp.getText());
                        int textHeight = fm.getHeight();

                        int size = font.getSize();
                        while (size > 0 && (textHeight > height || textWidth > width)) {
                            size -= 2;
                            font = font.deriveFont(font.getStyle(), size);
                            fm = comp.getFontMetrics(font);
                            textWidth = fm.stringWidth(comp.getText());
                            textHeight = fm.getHeight();
                        }

                        comp.setFont(font);

                    }

                    protected void increaseFontSize(JLabel comp) {

                        Font font = comp.getFont();
                        FontMetrics fm = comp.getFontMetrics(font);
                        int width = comp.getWidth();
                        int height = comp.getHeight();
                        int textWidth = fm.stringWidth(comp.getText());
                        int textHeight = fm.getHeight();

                        int size = font.getSize();
                        while (textHeight < height && textWidth < width) {
                            size += 2;
                            font = font.deriveFont(font.getStyle(), size);
                            fm = comp.getFontMetrics(font);
                            textWidth = fm.stringWidth(comp.getText());
                            textHeight = fm.getHeight();
                        }

                        comp.setFont(font);
                        decreaseFontSize(comp);

                    }

                    @Override
                    public void componentResized(ComponentEvent e) {
                        JLabel comp = (JLabel) e.getComponent();
                        Font font = comp.getFont();
                        FontMetrics fm = comp.getFontMetrics(font);
                        int width = comp.getWidth();
                        int height = comp.getHeight();
                        int textWidth = fm.stringWidth(comp.getText());
                        int textHeight = fm.getHeight();

                        if (textHeight > height || textWidth > width) {

                            decreaseFontSize(comp);

                        } else {

                            increaseFontSize(comp);

                        }
                    }

                });

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.add(label);
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

}

我确实考虑过使用Font#deriveFont(AffineTransform),但这需要我对组件/文本的原始大小有一些背景

答案 1 :(得分:0)

由于这是一个简单的程序,因此不需要尽可能高效,因此我最终使用此处发布的答案,由于某种原因,该答案已被删除。

像这样:

button.setFont(button.getFont().deriveFont((float)(button.getWidth()/2)));

in formComponentResized。