001: package com.csa.lib.swing;
002:
003: import java.awt.Dimension;
004: import java.awt.Event;
005: import java.awt.FlowLayout;
006: import java.awt.Font;
007: import java.awt.Image;
008: import java.awt.MediaTracker;
009: import java.awt.Toolkit;
010: import java.awt.event.ActionEvent;
011: import java.awt.event.ActionListener;
012: import java.awt.event.MouseAdapter;
013: import java.awt.event.MouseEvent;
014: import java.net.URL;
015: import java.text.MessageFormat;
016: import java.util.Vector;
017:
018: import javax.swing.ImageIcon;
019: import javax.swing.JButton;
020: import javax.swing.JFrame;
021: import javax.swing.JLabel;
022: import javax.swing.JPanel;
023:
024: public class FontField extends JPanel {
025: private static final long serialVersionUID = 1L;
026: public static final String IMG_NAME = "fontfield.gif";
027:
028: Font currentFont;
029:
030: JLabel label;
031:
032: JButton openButton;
033:
034: /**
035: * Lista de componentes que reciben notificaciones desde este objeto
036: */
037: Vector actionListeners = new Vector();
038:
039: public String getFontDescription() {
040: if (currentFont == null)
041: return "";
042: return MessageFormat.format("{0}, {1}pt ", new Object[] {
043: currentFont.getFontName(),
044: new Integer(currentFont.getSize()) });
045:
046: }
047:
048: /**
049: * Crear un FontField
050: *
051: * @param sfmt
052: * formato para la fecha en el texto.
053: */
054: public FontField(Font f) {
055: setLayout(new FlowLayout(0, 0, 0));
056: label = new JLabel(getFontDescription());
057: label.setMinimumSize(new Dimension(70, 14));
058: setFont(f);
059:
060: URL res = FontField.class.getResource(IMG_NAME);
061: Image img = Toolkit.getDefaultToolkit().getImage(res);
062: MediaTracker m = new MediaTracker(this );
063: m.addImage(img, 0);
064: try {
065: m.waitForAll();
066: } catch (Exception e) {
067: System.err.println("Error al cargar imagen ");
068: e.printStackTrace();
069: }
070: ImageIcon icon = new ImageIcon(img);
071: openButton = new JButton(icon); // new JButton("...");
072: openButton.setPreferredSize(new Dimension(18, 20));
073: add(label);
074: add(openButton);
075: openButton.addActionListener(new ActionListener() {
076: public void actionPerformed(ActionEvent e) {
077: if (e.getSource() == openButton)
078: showHelpWindow();
079: }
080: });
081: label.addMouseListener(new MouseAdapter() {
082: public void mouseClicked(MouseEvent e) {
083: if (e.getClickCount() >= 2) {
084: showHelpWindow();
085: }
086: }
087: });
088: }
089:
090: public Font getFont() {
091: return currentFont;
092: }
093:
094: public void setFont(Font f) {
095: currentFont = f;
096: if (label == null)
097: return;
098: String text = getFontDescription();
099: label.setFont(f);
100: label.setText(text);
101:
102: //Graphics g = label.getGraphics();
103: //int w = g.getFontMetrics().stringWidth(text);
104: //int h = g.getFontMetrics().getHeight();
105: //g.dispose();
106: //label.setPreferredSize(new Dimension(w, h));
107: }
108:
109: public JButton getOpenButton() {
110: return openButton;
111: }
112:
113: // Soporte a eventos
114: public void addActionListener(ActionListener l) {
115: actionListeners.add(l);
116: }
117:
118: public void removeActionListener(ActionListener l) {
119: actionListeners.remove(l);
120: }
121:
122: protected void triggerAction() {
123: for (int i = 0; i < actionListeners.size(); i++) {
124: ActionListener l = (ActionListener) actionListeners.get(i);
125: ActionEvent a = new ActionEvent(this , Event.ACTION_EVENT,
126: "");
127: try {
128: l.actionPerformed(a);
129: } catch (Exception e) {
130: e.printStackTrace();
131: }
132: }
133: }
134:
135: protected void assignFont(Font f) {
136: setFont(f);
137: triggerAction();
138: }
139:
140: // Soporte a la ventana
141:
142: /**
143: * Muestra la ventana de ayuda de seleccion de fecha.
144: */
145: void showHelpWindow() {
146: FontChooserDialog fc = new FontChooserDialog(null);
147: fc.setFont(currentFont);
148: if (fc.execute()) {
149: assignFont(fc.getFont());
150: }
151: }
152:
153: /**
154: * Ejemplo
155: *
156: * @param args
157: */
158: public static void main(String[] args) {
159: JFrame f = new JFrame();
160: f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
161: f.getContentPane().setLayout(new FlowLayout());
162: f.getContentPane().add(new JLabel("Fecha"));
163: f.getContentPane().add(new FontField(null));
164: f.pack();
165: f.setVisible(true);
166: }
167: }
|