package net.sf.openrocket.gui.components; import java.awt.Font; import javax.swing.JLabel; import javax.swing.SwingConstants; /** * A resizeable and styleable JLabel. The method {@link #resizeFont(float)} changes the * current font size by the given (positive or negative) amount. The change is relative * to the current font size. The method {@link #setFontStyle(Style)} sets the style * (bold/italic) of the font. * <p> * A nice small text is achievable by <code>new ResizeLabel("My text", -2);</code> * * @author Sampo Niskanen <sampo.niskanen@iki.fi> */ public class StyledLabel extends JLabel { public enum Style { PLAIN(Font.PLAIN), BOLD(Font.BOLD), ITALIC(Font.ITALIC), BOLD_ITALIC(Font.BOLD | Font.ITALIC); private int style; Style(int fontStyle) { this.style = fontStyle; } public int getFontStyle() { return style; } } public StyledLabel() { this("", SwingConstants.LEADING, 0f); } public StyledLabel(String text) { this(text, SwingConstants.LEADING, 0f); } public StyledLabel(float size) { this("", SwingConstants.LEADING, size); } public StyledLabel(String text, float size) { this(text, SwingConstants.LEADING, size); } public StyledLabel(String text, int horizontalAlignment, float size) { super(text, horizontalAlignment); resizeFont(size); checkPreferredSize(size, Style.PLAIN); } public StyledLabel(Style style) { this("", SwingConstants.LEADING, 0f, style); } public StyledLabel(String text, Style style) { this(text, SwingConstants.LEADING, 0f, style); } public StyledLabel(float size, Style style) { this("", SwingConstants.LEADING, size, style); } public StyledLabel(String text, float size, Style style) { this(text, SwingConstants.LEADING, size, style); } public StyledLabel(String text, int horizontalAlignment, float size, Style style) { super(text, horizontalAlignment); resizeFont(size); setFontStyle(style); checkPreferredSize(size, style); } private void checkPreferredSize(float size, Style style) { String str = this.getText(); if (str.startsWith("<html>") && str.indexOf("<br") < 0) { StyledLabel label = new StyledLabel("plaintext", size, style); label.validate(); //System.out.println("Plain-text label: " + label.getPreferredSize()); //System.out.println("HTML label: " + this.getPreferredSize()); } } public void resizeFont(float size) { Font font = this.getFont(); font = font.deriveFont(font.getSize2D()+size); this.setFont(font); } public void setFontStyle(Style style) { Font font = this.getFont(); font = font.deriveFont(style.getFontStyle()); this.setFont(font); } }