/******************************************************************************** * ********************************************************* * * * $Package: ZoeloeSoft.projects.JFontChooser * * * * $Id: JFontChooser.java * * * * $Date: 23:39 19/04/2004 * * * * * * * * $Creator: Tim Eeckhaut * * * * $Alias: zoeloeboeloe * * * * * * * * $Company: ZoeloeSoft * * * * $Website: http://users.pandora.be/ZoeloeSof * * * ********************************************************* * * * * Copyright (c) 2004, Tim Eeckhaut * * All rights reserved. * * * * Redistribution and use in source and binary forms, with or without * * modification, are permitted provided that the following conditions * * are met: * * * * 1. Redistributions of source code must retain the above copyright * * notice, this list of conditions and the following disclaimer. * * * * 2. Redistributions in binary form must reproduce the above copyright * * notice, this list of conditions and the following disclaimer in the * * documentation and/or other materials provided with the distribution. * * * * 3. Neither the name of the company nor the names of its * * contributors may be used to endorse or promote products derived from this * * software without specific prior written permission. * * * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR * * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * * ********************************************************************************/ package ZoeloeSoft.projects.JFontChooser; import java.awt.Dimension; import java.awt.Font; import java.awt.Frame; import java.awt.GraphicsEnvironment; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JButton; import javax.swing.JCheckBox; import javax.swing.JDialog; import javax.swing.JList; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTextArea; import javax.swing.ListSelectionModel; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; public class JFontChooser extends JDialog { public static int OK_OPTION = 0; public static int CANCEL_OPTION = 1; private JList fontList, sizeList; private JCheckBox cbBold, cbItalic; private JTextArea txtSample; private int OPTION; private final String[] sizes = new String[] { "2","4","6","8","10","11","12","13","14","16","18","20","22","24","30","36","48","72" }; public int showDialog(Font font) { setFont(font); return showDialog(); } public int showDialog() { setVisible(true); return OPTION; } public JFontChooser(Frame parent) { super(parent, true); setTitle("JFontChooser"); OPTION = JFontChooser.CANCEL_OPTION; // create all components JButton btnOK = new JButton("OK"); btnOK.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { JFontChooser.this.OPTION = JFontChooser.OK_OPTION; JFontChooser.this.setVisible(false); } }); JButton btnCancel = new JButton("Cancel"); btnCancel.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { JFontChooser.this.OPTION = JFontChooser.CANCEL_OPTION; JFontChooser.this.setVisible(false); } }); fontList = new JList(GraphicsEnvironment.getLocalGraphicsEnvironment(). getAvailableFontFamilyNames()) { @Override public Dimension getPreferredScrollableViewportSize() { return new Dimension(150, 144); } }; fontList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); sizeList = new JList(sizes) { @Override public Dimension getPreferredScrollableViewportSize() { return new Dimension(25, 144); } }; sizeList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); cbBold = new JCheckBox("Bold"); cbItalic = new JCheckBox("Italic"); txtSample = new JTextArea() { @Override public Dimension getPreferredScrollableViewportSize() { return new Dimension(385, 80); } }; txtSample.setFont(new Font("Monospaced", Font.PLAIN, 12)); txtSample.setText("The quick brown fox jumped over the fence"); // set the default font setFont(null); // add the listeners ListSelectionListener listListener = new ListSelectionListener() { @Override public void valueChanged(ListSelectionEvent e) { txtSample.setFont(getCurrentFont()); } }; fontList.addListSelectionListener(listListener); sizeList.addListSelectionListener(listListener); ActionListener cbListener = new ActionListener() { @Override public void actionPerformed(ActionEvent e) { txtSample.setFont(getCurrentFont()); } }; cbBold.addActionListener(cbListener); cbItalic.addActionListener(cbListener); // build the container getContentPane().setLayout(new java.awt.BorderLayout()); JPanel leftPanel = new JPanel(); leftPanel.setLayout(new java.awt.BorderLayout()); leftPanel.add(new JScrollPane(fontList), java.awt.BorderLayout.CENTER); leftPanel.add(new JScrollPane(sizeList), java.awt.BorderLayout.EAST); getContentPane().add(leftPanel, java.awt.BorderLayout.CENTER); JPanel rightPanel = new JPanel(); rightPanel.setLayout(new java.awt.BorderLayout()); JPanel rightPanelSub1 = new JPanel(); rightPanelSub1.setLayout(new java.awt.FlowLayout()); rightPanelSub1.add(cbBold); rightPanelSub1.add(cbItalic); rightPanel.add(rightPanelSub1, java.awt.BorderLayout.NORTH); JPanel rightPanelSub2 = new JPanel(); rightPanelSub2.setLayout(new java.awt.GridLayout(2, 1)); rightPanelSub2.add(btnOK); rightPanelSub2.add(btnCancel); rightPanel.add(rightPanelSub2, java.awt.BorderLayout.SOUTH); getContentPane().add(rightPanel, java.awt.BorderLayout.EAST); getContentPane().add(new JScrollPane(txtSample), java.awt.BorderLayout.SOUTH); setSize(200, 200); setResizable(false); pack(); } @Override public void setFont(Font font) { if (font == null) font = txtSample.getFont(); fontList.setSelectedValue(font.getName(), true); fontList.ensureIndexIsVisible(fontList.getSelectedIndex()); sizeList.setSelectedValue("" + font.getSize(), true); sizeList.ensureIndexIsVisible(sizeList.getSelectedIndex()); cbBold.setSelected(font.isBold()); cbItalic.setSelected(font.isItalic()); } @Override public Font getFont() { if (OPTION == OK_OPTION) { return getCurrentFont(); } else return null; } private Font getCurrentFont() { try { String fontFamily = (String)fontList.getSelectedValue(); int fontSize = Integer.parseInt((String)sizeList.getSelectedValue()); int fontType = Font.PLAIN; if (cbBold.isSelected()) fontType += Font.BOLD; if (cbItalic.isSelected()) fontType += Font.ITALIC; return new Font(fontFamily, fontType, fontSize); } catch (Exception ex) { // if error return current sample font. return txtSample.getFont(); } } }