我想问一些非常基本的东西:
当我写这段代码时:
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
第二次尝试使用它时起作用!但事实并非如此..
提前致谢
答案 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
变量,因此它(当然)根本不受该变化的影响!
你可以这样想:
答案 1 :(得分:1)
是的,如果gr将使用在第一次调用中传递的字体,那么你是对的,至少它应该是(理想情况下,gr类应该防御性地复制字体对象而不使用你用来设置的相同对象),其他情况如果实现没有那样,那么每当你改变你在setFont中传递的'font'引用时,将改变字体将会改变。
所以如果它的工作原理没有使用第二个'setFont()'调用,那么Graphic类的实现还没有做好防御性的复制。就“正在发生的事情”而言,这完全取决于Graphic类是否直接使用这个'font'引用来存储它,或者它创建一个副本然后存储。