2

のピクセル単位の幅を計算するために使用される次のコードを検討してくださいString

 public class ComponentUtils {
      static {
         Font font = new Font("Verdana", Font.BOLD, 10);
         FontMetrics metrics = new FontMetrics(font) {
        };
      }

    public static String calculateWidthInPixels(String value) {
       //Using the font metrics class calculate the width in pixels 
      }
}

fontandmetricsを 型であると宣言するとstatic、コンパイラはこれを実行させません。なんでそうなの ?fontand once を初期化し、メソッドmetrics内の幅を計算するにはどうすればよいですか?calculateWidthInPixels

PS: 次のメイン クラスは常に期待どおりに動作し、幅をピクセル単位で指定します。

public class Main  {

  public static void main(String[] args) {
        Font font = new Font("Verdana", Font.BOLD, 10);
        FontMetrics metrics = new FontMetrics(font){

        };
        Rectangle2D bounds = metrics.getStringBounds("some String", null);
        int widthInPixels = (int) bounds.getWidth();
    System.out.println("widthInPixels = " + widthInPixels);
  }
4

4 に答える 4

5

コンパイラは実際にそれを可能にします。ただし、可視性がその静的ブロックに制限されているため、メソッドからそこで宣言した変数にアクセスすることはできません。

次のように静的変数として宣言する必要があります。

private static final Font FONT = new Font(...);
于 2012-11-14T12:23:05.133 に答える
4

静的初期化ブロックではなく、クラス スコープでフィールドを宣言する必要があります。

public class ComponentUtils {
    private static Font FONT;
    private static FontMetrics METRICS;

    static {
        FONT= new Font("Verdana", Font.BOLD, 10);
        METRICS= new FontMetrics(font) {};
    }

    public static String calculateWidthInPixels(String value) {
       //Using the font metrics class calculate the width in pixels 
    }
}
于 2012-11-14T12:22:38.530 に答える
1

ブロック内の宣言は、そのブロックに対してのみ名前のスコープを持ちます。グローバルであっても、アクセスすることはできません。

于 2012-11-14T12:23:02.413 に答える
1

fontフィールドとmetricsフィールドを静的にする必要があります。

 public class ComponentUtils {
      static Font font;
      static FontMetrics metrics;

      static {
         font = new Font("Verdana", Font.BOLD, 10);
         metrics = new FontMetrics(font) {
        };
      }

    public static String calculateWidthInPixels(String value) {
       //Using the font metrics class calculate the width in pixels 
      }
}
于 2012-11-14T12:20:41.950 に答える