Ссылка на класс шрифта в Java - PullRequest
0 голосов
/ 04 марта 2011

Я хотел бы спросить кое-что очень фундаментальное:

Пока я писал этот код:

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 пытается использовать его во второй раз!но это не тот случай ..

Заранее спасибо

Ответы [ 2 ]

4 голосов
/ 04 марта 2011

Кажется, у вас неправильное представление о том, что вы делаете.

В этой строке:

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 голос
/ 04 марта 2011

Да, вы правы, если gr будет использовать шрифт, который был передан при первом вызове, по крайней мере, так должно быть (в идеале класс gr должен защищенно скопировать объект шрифта и не использовать тот же объект, который вы использовали для установки), в В другом случае, если реализация этого не сделала, тогда всякий раз, когда вы меняете ссылку на шрифт, переданную в setFont, шрифт будет меняться.

Так что, если он работает без использования второго вызова setFont (), реализация класса Graphic не сделала защитного копирования. Что касается «того, что происходит», все зависит от того, использует ли класс Graphic эту ссылку «шрифт» для хранения напрямую или создает копию, а затем сохраняет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...