Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> как получить шрифт заголовка JFrame 
:(
    Опции темы
carper
Дата 19.2.2008, 11:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 227
Регистрация: 2.3.2005

Репутация: 4
Всего: 8



Возникла маленькая проблема, мне бы хотелось узнать шрифт, которым выводится заголовок окна в Windows.

Я НЕ хочу использовать  JFrame.setDefaultLookAndFeelDecorated(true);
Мне НЕ нужен список всех системных шрифтов и путь к ним.

Мне надо оставить стандартный заголовок, выводимый средствами OS.

Мне НЕ надо ничего там менять, я просто хочу знать каким шрифтом он выводится!

Нужно это только для переопределения pack(), чтобы, когда размер заголовка больше (по длине) чем размер компонентов, размещенных внутри JFrame, pack() учитывал эту возможность и не усекал заголовок.

Никто не сталкивался с такой проблемой?
PM MAIL   Вверх
LSD
Дата 19.2.2008, 13:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 38
Всего: 538



Код

UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
UIDefaults defaults = UIManager.getDefaults();
Font font = defaults.getFont("InternalFrame.titleFont");
System.out.println("font = " + font);

единственное но, не совпадают размеры с теми что указанны в свойствах системы. Так в системных свойствах у меня стоит размер шрифта 10, а Font имеет размер шрифта 13. Но если сделать:
Код

public class Test
{
  public static void main(String[] args) throws Exception
  {
    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
    UIDefaults defaults = UIManager.getDefaults();
    Font font = defaults.getFont("InternalFrame.titleFont");
    System.out.println("font = " + font);

    JFrame frame = new JFrame("Frame title ABCDEF 12345 АБВГД");
    JLabel label = new JLabel("Frame title ABCDEF 12345 АБВГД");
    label.setFont(font);
    frame.getContentPane().add(label);
    frame.pack();
    frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
    frame.setLocationRelativeTo(null);
    frame.setVisible(true);
  }
}

то видно что шрифты одинаковые, а вот если уменьшить размер до 10 - то явно видно что шрифт меньше.

P.S. Я это все тестировал под Windows XP.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
carper
Дата 19.2.2008, 19:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 227
Регистрация: 2.3.2005

Репутация: 4
Всего: 8



Цитата(LSD @ 19.2.2008,  13:22)
Код

UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
UIDefaults defaults = UIManager.getDefaults();
Font font = defaults.getFont("InternalFrame.titleFont");
System.out.println("font = " + font);

единственное но, не совпадают размеры с теми что указанны в свойствах системы. Так в системных свойствах у меня стоит размер шрифта 10, а Font имеет размер шрифта 13. Но если сделать:
Код

public class Test
{
  public static void main(String[] args) throws Exception
  {
    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
    UIDefaults defaults = UIManager.getDefaults();
    Font font = defaults.getFont("InternalFrame.titleFont");
    System.out.println("font = " + font);

    JFrame frame = new JFrame("Frame title ABCDEF 12345 АБВГД");
    JLabel label = new JLabel("Frame title ABCDEF 12345 АБВГД");
    label.setFont(font);
    frame.getContentPane().add(label);
    frame.pack();
    frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
    frame.setLocationRelativeTo(null);
    frame.setVisible(true);
  }
}

то видно что шрифты одинаковые, а вот если уменьшить размер до 10 - то явно видно что шрифт меньше.

P.S. Я это все тестировал под Windows XP.

Во-первых, большое спасибо, я хоть узнал, как это свойство называется!


Во-вторых, размер шрифта, выдаваемого JAVA меняется в зависимости от DPI шрифта, установленного в системе, так для истинного размера заголовка в 9 пунктов в VISTA, 
из-под JAVA получаю 15 пунктов для large fonts (120DPI) и 12 пунктов для стандартных 96 DPI.

Остается узнать, что JAVA считает "правильным" DPI :(

Про инсеты и размер иконок в заголовке спрашивать боюсь, ну их, думаю тут в передах 15-24" мониторов, можно просто взять некую эмпирическую константу. smile 
PM MAIL   Вверх
LSD
Дата 19.2.2008, 19:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 38
Всего: 538



Какое DPI сейчас выставленно, можно узнать:
Код

Toolkit.getDefaultToolkit().getScreenResolution()

Вот только зачем? Все равно для определения размера надо использовать тот размер шрифта, что возвращает getFont().

Кстати кнопи там тоже вроде есть.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
carper
Дата 20.2.2008, 12:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 227
Регистрация: 2.3.2005

Репутация: 4
Всего: 8



"Кстати кнопи там тоже вроде есть. "

Да, есть иконки (InternalFrame.minimizeIcon ...), беда в том, что суммарная длина строки заголовка, рассчитываемая по формуле:
Код

 UIDefaults defaults = UIManager.getDefaults();
 Font font = defaults.getFont("InternalFrame.titleFont");
  ArrayList<Icon> icons =  new ArrayList<Icon> (3);
  icons.add(defaults.getIcon("InternalFrame.minimizeIcon"));
  icons.add(defaults.getIcon("InternalFrame.maximizeIcon"));
  icons.add(defaults.getIcon("InternalFrame.closeIcon"));
  icons.add(defaults.getIcon("InternalFrame.iconifyIcon"));
    
  int iconsWidth = icons.get(0).getIconWidth() + icons.get(1).getIconWidth() + icons.get(2).getIconWidth() + icons.get(3).getIconWidth();

    final FontRenderContext DEFAULT_FRC =  new FontRenderContext(null, true, false);
    Hashtable map = new Hashtable();
    map.put(TextAttribute.SIZE, font.getSize());
    AttributedString helloWorld =    new AttributedString("Frame title ABCDEF 12345 АБВГД", map);
    AttributedCharacterIterator text =  helloWorld.getIterator();
    TextLayout txt =  new TextLayout(text, DEFAULT_FRC);
    int txtWidth =  txt.getBounds().getWidth());

int commonWidth = iconsWidth + txtWidth + frame.getInsets().left + frame.getInsets().right;


Несколько меньше, чем надо. Скорее всего неверно считаю insets, т.к. совершенно непонятно почему это я пытаюсь
использовать их для JFrame, хотя логичнее было бы искать их в тех же свойствах, что и сами иконки, но я такого свойства что-то не нашел.   smile 

PM MAIL   Вверх
LSD
Дата 20.2.2008, 14:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 38
Всего: 538



Получить размеры бордюра не проблема:
Код

Border border = defaults.getBorder("InternalFrame.border");
Insets borderInsets = border.getBorderInsets(frame);
commonWidth += borderInsets.left + borderInsets.right;


Основная проблема в иконке, если сделать так:
Код

  public static void main(String[] args) throws Exception
  {
    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());

    JFrame frame = new JFrame("Frame title ABCDEF 12345 АБВГД");
    frame.pack();
    frame.setLocationRelativeTo(null);
    frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
    frame.setVisible(true);

    UIDefaults defaults = UIManager.getDefaults();

    Font font = defaults.getFont("InternalFrame.titleFont");
    ArrayList<Icon> icons = new ArrayList<Icon>(3);
    icons.add(defaults.getIcon("InternalFrame.minimizeIcon"));
    icons.add(defaults.getIcon("InternalFrame.maximizeIcon"));
    icons.add(defaults.getIcon("InternalFrame.closeIcon"));
    icons.add(defaults.getIcon("InternalFrame.iconifyIcon"));

    int iconsWidth = icons.get(0).getIconWidth() + icons.get(1).getIconWidth() + icons.get(2).getIconWidth() + icons.get(3).getIconWidth();

    final FontRenderContext DEFAULT_FRC = new FontRenderContext(null, true, false);
    Hashtable<AttributedCharacterIterator.Attribute, Object> map = new Hashtable<AttributedCharacterIterator.Attribute, Object>();
    map.put(TextAttribute.SIZE, font.getSize());
    AttributedString helloWorld = new AttributedString("Frame title ABCDEF 12345 АБВГД", map);
    AttributedCharacterIterator text = helloWorld.getIterator();
    TextLayout txt = new TextLayout(text, DEFAULT_FRC);
    int txtWidth = (int) txt.getBounds().getWidth();

    int commonWidth = iconsWidth + txtWidth + frame.getInsets().left + frame.getInsets().right;

    Border border = defaults.getBorder("InternalFrame.border");
    Insets borderInsets = border.getBorderInsets(frame);
    commonWidth += borderInsets.left + borderInsets.right;
    
    commonWidth += 16;

    frame.setSize(commonWidth, frame.getHeight());
  }

то все отлично, но вопрос в том как получить иконку, вернее ее размер (тут я взял стандартный размер для XP). Т.к. frame.getIconImage() возвращает оригинальную иконку, а не масштабированную под конкретную платформу.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
carper
Дата 20.2.2008, 18:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 227
Регистрация: 2.3.2005

Репутация: 4
Всего: 8



Спасибо еще раз!

У меня, с учетом Ваших замечаний,  вроде как все неплохо начало масштабироваться при добавлении  icons.add(defaults.getIcon("InternalFrame.icon"));

По крайней мере, при разумных размерах экрана и шрифтов (попробовал пока только на 17" и 21" мониторах под XP и Vista).

Завтра попробую под виртуалкой под Linux.

P.S. Правда все это только для "кофейной чашки", пользовательскую иконку добавлять пока не пробовал (=>  frame.getIconImage() == null)

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   jk1
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, jk1.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: GUI и Java FX приложения | Следующая тема »


 




[ Время генерации скрипта: 0.1142 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.