请考虑以下代码,用于计算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
}
}
如果我声明font
和metrics
是static
类型,编译器将不允许我这样做。为什么这样 ?如何初始化font
和metrics
一次并计算calculateWidthInPixels
方法中的宽度?
P.S:以下主类始终按预期工作,并以像素为单位给出宽度。
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);
}
答案 0 :(得分:5)
编译器确实允许你这样做。但是,它不允许您从方法访问您在那里声明的变量,因为它们的可见性仅限于该静态块。
您应该将它们声明为静态变量,如下所示:
private static final Font FONT = new Font(...);
答案 1 :(得分: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
}
}
答案 2 :(得分: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
}
}
答案 3 :(得分:1)
块中的声明仅具有该块的名称范围。即使它是全球性的,你也无法访问它。