java中的字体类引用

时间:2011-03-04 03:31:20

标签: java reference

我想问一些非常基本的东西:

当我写这段代码时:

font = new Font("Calibri", Font.ITALIC, 10);
gr.setFont(font);
gr.drawString("mpla mpla",x,y);
font = new Font("Sherif", Font.BOLD, 16);
gr.drawString("mpla mpla part 2",x,y);

我意识到我的字体在第二个抽绳中并没有按顺序改变 工作我不得不在它前面加上另一个gr.setFont(font);

为什么会这样?我的意思是,我有一个Font对象的引用,并且设置为在我的Graphics上下文中使用。当我将新对象重新分配给我的字体引用时,它通常应该在Graphics第二次尝试使用它时起作用!但事实并非如此..

提前致谢

2 个答案:

答案 0 :(得分:4)

你似乎对你正在做的事情有误解。

在这一行:

font = new Font("Calibri", Font.ITALIC, 10);

您将对新创建的Font对象的引用分配给变量font

然后,使用gr.setFont(font);将该引用传递给gr.setFont()方法。您传递引用,即该Font对象的“位置”。您没有告诉gr.setFont()有关变量font的任何内容,您只能告诉它存储在那里的值。

在倒数第二行font = ...中,您将另一个新Font对象的引用分配给变量font。由于Graphics对象本身并不了解font变量,因此它(当然)根本不受该变化的影响!

你可以这样想:

  • 我在一张纸上写了一个数字(假设这个数字是3)
  • 我告诉你那张纸,并要求你记住这个号码
  • 我删除了纸上的数字并在上面写了5
  • 我问你记得哪个号码

答案 1 :(得分:1)

是的,如果gr将使用在第一次调用中传递的字体,那么你是对的,至少它应该是(理想情况下,gr类应该防御性地复制字体对象而不使用你用来设置的相同对象),其他情况如果实现没有那样,那么每当你改变你在setFont中传递的'font'引用时,将改变字体将会改变。

所以如果它的工作原理没有使用第二个'setFont()'调用,那么Graphic类的实现还没有做好防御性的复制。就“正在发生的事情”而言,这完全取决于Graphic类是否直接使用这个'font'引用来存储它,或者它创建一个副本然后存储。