1

JFrame4 から 24 までのすべての偶数フォント サイズで文字列を表示するを作成しようとしています。これを行うには、毎回 +2 フォント サイズが増加drawStringする を使用するを作成する for ループを実行しようとしています。前のものを取得して変数に追加することにより、前のもののすぐ下に配置されFontた次のものを取得しようとしています。ただし、プログラムの実行時には空です。どこで間違ったのですか?drawStringgetHeight()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最上位のコンテナである に直接ペイントしないでください。JComponentまたはを使用しJPanelます。paintComponent()ではなくペイント用にオーバーライドしpaint()ます。

詳細と例については、カスタム ペイントの実行チュートリアルをご覧ください。

コードを少し変更した例を次に示します。

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();
            }
        });
    }
}

for paintingの導入以外に、再描画後にテキストが同じ場所に留まるように、座標JPanelの簡単な小さな修正があります。yもありSwingUtilities.invokeLaterます。また、通常、延長する必要はまったくありませんJFrame

于 2013-03-30T17:44:59.170 に答える