1

我正在尝试创建一个以JFrame从 4 到 24 的每个偶数字体大小显示一个字符串。为此,我正在尝试执行一个 for 循环,该循环创建一个drawString使用Font每次都会增加 +2 字体大小的 a 的 for 循环。试图通过获取上一个并将其添加到变量来将下一个drawString放置在上一个下方。但是,当程序运行时,它是空的。我哪里出错了?getHeight()yJFrame

import javax.swing.*;
import java.awt.*;

public class JFontSizeDemo extends JFrame {
    int x = 10;
    int y = 40;
    int heightOfFont;
    public void paint(Graphics g) {
        super.paint(g);
        for(int size = 4; size <= 24; size += 2) {
            g.setFont(new Font("Arial", Font.BOLD, size));
            g.drawString("Name", x, y);
            heightOfFont = g.getFontMetrics().getHeight();
            y += heightOfFont;
        }
    }
    public static void main(String[] args) {
            JFontSizeDemo frame = new JFontSizeDemo();
            frame.setSize(300, 300);
            frame.setVisible(true);
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
}
4

1 回答 1

2

不要直接在JFrame顶级容器上绘画。使用JComponentJPanel。覆盖paintComponent()绘画而不是paint().

查看Performing Custom Painting教程以获取更多详细信息和示例。

这是您的代码稍作修改的示例:

import javax.swing.*;
import java.awt.*;

public class FontSizeDemo {
    private static void createAndShowUI() {
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JPanel panel = new JPanel() {
            @Override
            protected void paintComponent(Graphics g) {
                super.paintComponent(g);
                int y = 0;
                for(int size = 4; size <= 24; size += 2) {
                    g.setFont(new Font("Arial", Font.BOLD, size));
                    g.drawString("Name", 0, y);
                    int heightOfFont = g.getFontMetrics().getHeight();
                    y += heightOfFont;
                }
            }

            @Override
            public Dimension getPreferredSize() {
                return new Dimension(300, 300); 
            }
        };

        frame.add(panel);
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
        frame.pack();
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                createAndShowUI();
            }
        });
    }
}

除了引入JPanel用于绘画之外,还有一个快速的小y坐标修复,以确保重绘后文本保持在同一位置。还有SwingUtilities.invokeLater. 此外,通常根本不需要扩展JFrame

于 2013-03-30T17:44:59.170 回答