原文: http://zetcode.com/gui/javagnome/pango/

在 Java Gnome 编程教程的这一部分中,我们将探索 Pango 库。

Pango 是一个免费的开源计算库,可高质量呈现国际化文本。 可以使用不同的字体后端,从而允许跨平台支持。 (维基百科)

Pango 提供了用于GdkGtk的高级字体和文本处理。

引用

在我们的第一个示例中,我们展示了如何更改Label小部件的字体。

quotes.java

  1. package com.zetcode;
  2. import org.gnome.gdk.Event;
  3. import org.gnome.gtk.Fixed;
  4. import org.gnome.gtk.Gtk;
  5. import org.gnome.gtk.Label;
  6. import org.gnome.gtk.Widget;
  7. import org.gnome.gtk.Window;
  8. import org.gnome.gtk.WindowPosition;
  9. import org.gnome.pango.FontDescription;
  10. /**
  11. * ZetCode Java Gnome tutorial
  12. *
  13. * This program uses the pango library to
  14. * display text.
  15. *
  16. * @author jan bodnar
  17. * website zetcode.com
  18. * last modified March 2009
  19. */
  20. public class GQuotes extends Window {
  21. public GQuotes() {
  22. setTitle("Quotes");
  23. initUI();
  24. connect(new Window.DeleteEvent() {
  25. public boolean onDeleteEvent(Widget source, Event event) {
  26. Gtk.mainQuit();
  27. return false;
  28. }
  29. });
  30. setPosition(WindowPosition.CENTER);
  31. showAll();
  32. }
  33. public void initUI() {
  34. String text = "Excess of joy is harder to bear than any amount\n" +
  35. "of sorrow. The more one judges, the less one loves.\n" +
  36. "There is no such thing as a great talent without great will power.";
  37. Label label = new Label(text);
  38. FontDescription fontdesc = new FontDescription("Purisa 9");
  39. label.modifyFont(fontdesc);
  40. Fixed fix = new Fixed();
  41. fix.put(label, 5, 5);
  42. add(fix);
  43. }
  44. public static void main(String[] args) {
  45. Gtk.init(args);
  46. new GQuotes();
  47. Gtk.main();
  48. }
  49. }

在上面的代码示例中,我们有一个带有三个引号的标签小部件。 我们将其字体更改为 Purisa 9。

  1. String text = "Excess of joy is harder to bear than any amount\n" +
  2. "of sorrow. The more one judges, the less one loves.\n" +
  3. "There is no such thing as a great talent without great will power.";

这是要在标签中显示的文本。

  1. FontDescription fontdesc = new FontDescription("Purisa 9");

FontDescription用于指定要加载的字体的特征。

  1. label.modifyFont(fontdesc);

我们将标签小部件的字体更改为 Purisa 9。

Java Gnome 中的 Pango - 图1

图:Quotations

Pango 标记

在下面的示例中,我们将使用 Pango 标记语言来修改ExposeEvent事件中的字体。

markup.java

  1. package com.zetcode;
  2. import org.freedesktop.cairo.Context;
  3. import org.gnome.gdk.Event;
  4. import org.gnome.gdk.EventExpose;
  5. import org.gnome.gtk.DrawingArea;
  6. import org.gnome.gtk.Gtk;
  7. import org.gnome.gtk.Widget;
  8. import org.gnome.gtk.Window;
  9. import org.gnome.pango.FontDescription;
  10. import org.gnome.pango.Layout;
  11. /**
  12. * ZetCode Java Gnome tutorial
  13. *
  14. * This program uses Pango markup language
  15. * to modify the text.
  16. *
  17. * @author jan bodnar
  18. * website zetcode.com
  19. * last modified March 2009
  20. */
  21. public class GPangoMarkup extends Window implements Widget.ExposeEvent {
  22. String quote = "<span foreground='blue' size='19000'>The only " +
  23. "victory over love is flight</span>";
  24. public GPangoMarkup() {
  25. setTitle("Pango Markup");
  26. initUI();
  27. connect(new Window.DeleteEvent() {
  28. public boolean onDeleteEvent(Widget source, Event event) {
  29. Gtk.mainQuit();
  30. return false;
  31. }
  32. });
  33. move(150, 150);
  34. showAll();
  35. }
  36. public void initUI() {
  37. DrawingArea darea = new DrawingArea();
  38. darea.connect(this);
  39. darea.queueDraw();
  40. add(darea);
  41. setBorderWidth(5);
  42. }
  43. public boolean onExposeEvent(Widget widget, EventExpose eventExpose) {
  44. final Context cr;
  45. final Layout layout;
  46. final FontDescription desc;
  47. cr = new Context(widget.getWindow());
  48. layout = new Layout(cr);
  49. desc = new FontDescription("Sans 12");
  50. layout.setFontDescription(desc);
  51. layout.setMarkup(quote);
  52. widget.setSizeRequest(layout.getPixelWidth(), layout.getPixelHeight());
  53. cr.showLayout(layout);
  54. return false;
  55. }
  56. public static void main(String[] args) {
  57. Gtk.init(args);
  58. new GPangoMarkup();
  59. Gtk.main();
  60. }
  61. }

使用 Cario 库进行绘制。 我们通过传递 Cario 绘图上下文来获得布局。

  1. cr = new Context(widget.getWindow());

此代码行创建一个Context对象。

  1. layout = new Layout(cr);

Layout代表文本的一段及其属性。

  1. layout.setMarkup(quote);

这行设置布局的标记。

  1. widget.setSizeRequest(layout.getPixelWidth(), layout.getPixelHeight());

这是为了显示窗口中的所有文本。

  1. cr.showLayout(layout);

最后,绘制文本。

Java Gnome 中的 Pango - 图2

图:Pango 标记

Unicode

Pango 用于处理国际化文本。

unicode.java

  1. package com.zetcode;
  2. import org.gnome.gdk.Event;
  3. import org.gnome.gtk.Fixed;
  4. import org.gnome.gtk.Gtk;
  5. import org.gnome.gtk.Label;
  6. import org.gnome.gtk.Widget;
  7. import org.gnome.gtk.Window;
  8. import org.gnome.gtk.WindowPosition;
  9. import org.gnome.pango.FontDescription;
  10. /**
  11. * ZetCode Java Gnome tutorial
  12. *
  13. * This program shows text in
  14. * azbuka.
  15. *
  16. * @author jan bodnar
  17. * website zetcode.com
  18. * last modified March 2009
  19. */
  20. public class GUnicode extends Window {
  21. public GUnicode() {
  22. setTitle("Unicode");
  23. initUI();
  24. connect(new Window.DeleteEvent() {
  25. public boolean onDeleteEvent(Widget source, Event event) {
  26. Gtk.mainQuit();
  27. return false;
  28. }
  29. });
  30. setPosition(WindowPosition.CENTER);
  31. showAll();
  32. }
  33. public void initUI() {
  34. String text =
  35. "Фёдор Михайлович Достоевский родился 30 октября (11 ноября)\n" +
  36. "1821 года в Москве.Был вторым из 7 детей. Отец, Михаил Андреевич,\n" +
  37. "работал в госпитале для бедных. Мать, Мария Фёдоровна\n" +
  38. "(в девичестве Нечаева), происходила из купеческого рода.";
  39. Label label = new Label(text);
  40. FontDescription fontdesc = new FontDescription("Purisa 9");
  41. label.modifyFont(fontdesc);
  42. Fixed fix = new Fixed();
  43. fix.put(label, 5, 5);
  44. add(fix);
  45. setBorderWidth(5);
  46. }
  47. public static void main(String[] args) {
  48. Gtk.init(args);
  49. new GUnicode();
  50. Gtk.main();
  51. }
  52. }

我们在西里尔字母中显示一些文本。

  1. String text =
  2. "Фёдор Михайлович Достоевский родился 30 октября (11 ноября)\n" ...

我们可以直接使用 unicode 文本。 但是,文本永远不会放在源代码中。 在实际的文字应用中,我们将文本放在外部文件中。 在 Java 中,这些通常是属性文件。

  1. Label label = new Label(text);

我们通常在标签小部件中使用它。

Java Gnome 中的 Pango - 图3

图:Unicode

在 Java Gnome 编程教程的这一章中,我们使用了 Pango 库。