1. package org.jr.swing;
  2. /**
  3. * Copyright: Copyright (c) 2002-2004
  4. * Company: JavaResearch(http://www.javaresearch.org)
  5. * 最后更新日期:2003年2月13日
  6. * @author Cherami
  7. */
  8. import java.awt.*;
  9. import javax.swing.*;
  10. /**
  11. * 垂直显示文本的Swing组件。
  12. * @since 0.1
  13. */
  14. public class VerticalLabel
  15. extends JLabel {
  16. String text = "";
  17. int width = 0;
  18. int height = 0;
  19. int charHeight = 0;
  20. /**
  21. * 构造一个缺省的VerticalLabel。
  22. * @since 0.1
  23. */
  24. public VerticalLabel() {
  25. }
  26. /**
  27. * 根据文本构造一个VerticalLabel。
  28. * @since 0.1
  29. */
  30. public VerticalLabel(String text) {
  31. this.text = text;
  32. }
  33. /**
  34. * 绘制组件。
  35. * @param g 图形设备对象
  36. * @since 0.1
  37. */
  38. protected void paintComponent(Graphics g) {
  39. int count = text.length();
  40. int corp_x = 5;
  41. int corp_y = 15;
  42. char chars[] = text.toCharArray();
  43. for (int i = 0; i < count; i++) {
  44. g.drawString(text.substring(i, i + 1), corp_x, corp_y);
  45. corp_y += (charHeight);
  46. }
  47. width += 5;
  48. }
  49. /**
  50. * 得到组件的最佳大小。
  51. * 最佳大小的宽度是指在所使用的字体下要显示的文本中最宽的字符的宽度加上10个象素宽度。
  52. * 最佳大小的高度是指在所使用的字体下要显示的每个字符的高度加上5个象素高度的和再加上10个象素高度。
  53. * @return 组件的最佳大小。
  54. * @since 0.1
  55. */
  56. public Dimension getPreferredSize() {
  57. getBound();
  58. return new Dimension(width, height);
  59. }
  60. /**
  61. * 得到组件的最小大小。
  62. * @return 和getPreferredSize方法相同
  63. * @since 0.1
  64. */
  65. public Dimension getMinimumSize() {
  66. getBound();
  67. return new Dimension(width, height);
  68. }
  69. /**
  70. * 根据文本内容得到最佳的高度和宽度。
  71. */
  72. private void getBound() {
  73. if (width > 0) {
  74. return;
  75. }
  76. Graphics g = this.getGraphics();
  77. FontMetrics fm = g.getFontMetrics();
  78. charHeight = fm.getHeight();
  79. int count = text.length();
  80. height = (charHeight + 5) * count + 10;
  81. char chars[] = text.toCharArray();
  82. for (int i = 0; i < count; i++) {
  83. int charWidth = fm.charWidth(chars[i]);
  84. if (width < charWidth) {
  85. width = charWidth;
  86. }
  87. }
  88. width += 10;
  89. }
  90. }