5

CustomFontテキストのさまざまな属性を使用できる別のクラスを作成しようとしています。そこで、拡張された新しいクラスを作成しFont、内部で拡張するプライベート クラス Drawing を作成しましたJComponentpaintComponentメソッド内のフォントとテキストの色やその他の特性を変更します。

問題は、paintComponentメソッドが呼び出されないことです。私は間違いを犯していると確信しています。

コードは次のとおりです。

import javax.swing.JComponent;

public class CustomFont extends Font {
    private String string;
    private int FontStyle;

    public CustomFont(String text, int style) {
        super("Serif", style, 15);
        FontStyle = style;
        string = text;  

        Drawing draw = new Drawing();
        draw.repaint();
    }

    private class Drawing extends JComponent {
        public void paintComponent(Graphics g) {
            Font font = new Font("Serif", Font.BOLD, 15);
            g.setFont(font);
            g.setColor(Color.YELLOW);
            g.drawString(string, getX(), getY());
        }
    }
}
4

2 に答える 2

3

私のコメントに追加:

super.XXX1)必要なメソッドの実装を呼び出すことによってペイントチェーンを尊重しpaintComponent(..)ないでください。オーバーライドされたメソッドの最初の呼び出しである必要があります。そうしないと、異常が発生する可能性があります。

@Override 
protected void paintComponent(Graphics g) {
      super.paintComponent(g);

      Font font = new Font("Serif", Font.BOLD, 15);
      g.setFont(font);
      g.setColor(Color.YELLOW);
      g.drawString(string, 0, 0);
}

上記のコードでは@Overrideアノテーションに注意してください。正しいメソッドをオーバーライドしていると確信しています。またgetX()getY()0,0に置き換えられました。AsgetXおよびgetYコンポーネントの位置を参照しますが、呼び出すときにdrawString、コンテナ内で描画する場所のパラメータを提供します(もちろん、境界/サイズfコンテナ内にある必要があります。

getPreferredSize2)グラフィックスオブジェクトに描画するときにオーバーライドしDimensionて、コンポーネントの描画/コンテンツに適合するsを返す必要があります。そうしないと、コンポーネントのサイズが0,0になるため、視覚的には何も表示されません。

private class Drawing extends JComponent {

    @Override
    public Dimension getPreferredSize() {
        return new Dimension(200, 200);//you would infact caluclate text size using FontMetrics#getStringWidth(String s)
    }
}

そして、提案として、いくつかの見栄えの良いテキストを使用してRenderHintsくださいGraphics2D:)詳細についてはここを参照してください:

于 2013-01-06T20:24:42.753 に答える
1

このCustomFontクラスには、本当に意味をなさないことがたくさんあります。1 つには、実際に Font に関係するものが何もないこと、もう 1 つには、コード化されたものを実際に使用していないという事実があります。以下は、あなたが探しているものの線に沿っているようです。

public class Drawing extends JComponent {
    String text;
    Font myFont;
    Color myTextColor;

    public Drawing(String textArg, Font f, Color textColor) {
        myFont = f;
        myTextColor = textColor;
        text = textArg;
    }

    public void paintComponent(Graphics g) {
        g.setFont(myFont);
        g.setColor(myTextColor);
        g.drawString(text, 0, getHeight() / 2);
    }
}

以下のように使用するには...

public class Test {
    public static void main(String[] args) {
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        Font font = new Font("Serif", Font.BOLD, 15);
        String text = "blah blah blah";
        Color textColor = Color.YELLOW;
        Drawing d = new Drawing(text, font, textColor);

        frame.add(d);
        frame.setSize(100,100);
        frame.setVisible(true);
    }
}

Drawing は を使用しますがFont、Font は を使用しませんDrawingDrawingの中で定義したのは本当に意味がありませんFont

于 2013-01-05T17:50:59.687 に答える