循环drawString不出现在JFrame中

时间:2013-03-30 17:37:09

标签: java swing jframe drawstring

我正在尝试创建一个JFrame,显示每个偶数字体大小从4到24的字符串。为此,我尝试执行for循环,创建drawString使用每次增加+2字体大小的Font。通过获取前一个drawString并将其添加到变量getHeight(),尝试将下一个y置于上一个JFrame之下。但是,程序运行时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); } } 为空。 我哪里出错?

{{1}}

1 个答案:

答案 0 :(得分: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