jmultilinelabel.java
来自「开源项目openfire的完整源程序」· Java 代码 · 共 113 行
JAVA
113 行
/** * $Revision$ * $Date$ * * Copyright (C) 1999-2005 Jive Software. All rights reserved. * This software is the proprietary information of Jive Software. Use is subject to license terms. */package org.jivesoftware.spark.component;import javax.swing.JComponent;import java.awt.Dimension;import java.awt.Graphics;import java.awt.Graphics2D;import java.awt.Insets;import java.awt.font.FontRenderContext;import java.awt.font.LineBreakMeasurer;import java.awt.font.TextAttribute;import java.awt.font.TextLayout;import java.text.AttributedCharacterIterator;import java.text.AttributedString;public class JMultilineLabel extends JComponent { private String text; private Insets margin = new Insets(1, 1, 1, 1); private int maxWidth = Integer.MAX_VALUE; private boolean justify; private final FontRenderContext frc = new FontRenderContext(null, false, false); private void morph() { revalidate(); repaint(); } public String getText() { return text; } public void setText(String text) { String old = this.text; this.text = text; firePropertyChange("text", old, this.text); if ((old == null) ? text != null : !old.equals(text)) morph(); } public int getMaxWidth() { return maxWidth; } public void setMaxWidth(int maxWidth) { if (maxWidth <= 0) throw new IllegalArgumentException(); int old = this.maxWidth; this.maxWidth = maxWidth; firePropertyChange("maxWidth", old, this.maxWidth); if (old != this.maxWidth) morph(); } public boolean isJustified() { return justify; } public void setJustified(boolean justify) { boolean old = this.justify; this.justify = justify; firePropertyChange("justified", old, this.justify); if (old != this.justify) repaint(); } public Dimension getPreferredSize() { return paintOrGetSize(null, getMaxWidth()); } public Dimension getMinimumSize() { return getPreferredSize(); } protected void paintComponent(Graphics g) { super.paintComponent(g); paintOrGetSize((Graphics2D)g, getWidth()); } private Dimension paintOrGetSize(Graphics2D g, int width) { Insets insets = getInsets(); width -= insets.left + insets.right + margin.left + margin.right; float w = insets.left + insets.right + margin.left + margin.right; float x = insets.left + margin.left, y = insets.top + margin.top; if (width > 0 && text != null && text.length() > 0) { AttributedString as = new AttributedString(getText()); as.addAttribute(TextAttribute.FONT, getFont()); AttributedCharacterIterator aci = as.getIterator(); LineBreakMeasurer lbm = new LineBreakMeasurer(aci, frc); float max = 0; while (lbm.getPosition() < aci.getEndIndex()) { TextLayout textLayout = lbm.nextLayout(width); if (g != null && isJustified() && textLayout.getVisibleAdvance() > 0.80 * width) textLayout = textLayout.getJustifiedLayout(width); if (g != null) textLayout.draw(g, x, y + textLayout.getAscent()); y += textLayout.getDescent() + textLayout.getLeading() + textLayout.getAscent(); max = Math.max(max, textLayout.getVisibleAdvance()); } w += max; } return new Dimension((int)Math.ceil(w), (int)Math.ceil(y) + insets.bottom + margin.bottom); }}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?