Java Tutorial/Swing/JDialog
Содержание
- 1 Address Dialog
- 2 A dialog allow selection and a font and its associated info.
- 3 A dialog that presents the user with a sequence of steps for completing a task.
- 4 A Simple Modal Dialog
- 5 Dialog Introduction
- 6 Dialog Panel
- 7 Extending JDialog
- 8 extends JDialog to create your own dialog
- 9 FontChooser by Noah w
- 10 Font Chooser extends javax.swing.JDialog
- 11 JDialog is specify that pressing the Escape key cancels the dialog.
- 12 Positions the specified dialog at a position relative to its parent.
- 13 Set Default Close Operation for Dialog
- 14 The base class for standard dialogs.
Address Dialog
<source lang="java">
import java.awt.FlowLayout; import java.awt.Frame; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JButton; import javax.swing.JDialog; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JTextField; class AddressDialog extends JDialog {
JLabel label1 = new JLabel("Address"); JLabel label2 = new JLabel("City"); JLabel label3 = new JLabel("State"); JLabel label4 = new JLabel("Zip Code"); JTextField addressField = new JTextField(); JTextField cityField = new JTextField(); JTextField stateField = new JTextField(); JTextField zipCodeField = new JTextField(); String[] address = new String[4]; public AddressDialog(Frame owner, boolean modal) { super(owner, modal); init(); } private void init() { this.setTitle("Address Dialog"); this.setLayout(new GridLayout(4, 2)); this.add(label1); this.add(addressField); this.add(label2); this.add(cityField); this.add(label3); this.add(stateField); this.add(label4); this.add(zipCodeField); } public String[] getAddress() { address[0] = addressField.getText(); address[1] = cityField.getText(); address[2] = stateField.getText(); address[3] = zipCodeField.getText(); return address; }
} public class JDialogTest extends JFrame {
AddressDialog dialog = new AddressDialog(this, false); public JDialogTest(String title) { super(title); init(); } public JDialogTest() { super(); init(); } private void init() { this.getContentPane().setLayout(new FlowLayout()); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); final AddressDialog dialog = new AddressDialog(this, false); JButton button = new JButton("Show Dialog"); button.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent ae) { dialog.setSize(250, 120); dialog.setVisible(true); } }); this.getContentPane().add(button); } public static void main(String[] args) { JFrame.setDefaultLookAndFeelDecorated(true); JDialog.setDefaultLookAndFeelDecorated(true); JDialogTest frame = new JDialogTest(); frame.pack(); frame.setVisible(true); }
}</source>
A dialog allow selection and a font and its associated info.
<source lang="java">
/*
* Copyright (C) 2001-2004 Colin Bell * colbell@users.sourceforge.net * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
import java.awt.BorderLayout; import java.awt.Dialog; import java.awt.Dimension; import java.awt.Font; import java.awt.Frame; import java.awt.GraphicsEnvironment; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.Insets; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.Serializable; import javax.swing.BorderFactory; import javax.swing.JButton; import javax.swing.JCheckBox; import javax.swing.JComboBox; import javax.swing.JDialog; import javax.swing.JLabel; import javax.swing.JPanel; /**
* A dialog allow selection and a font and its associated info. * * @author */
public class FontChooser extends JDialog {
private final boolean _selectStyles; private JComboBox _fontNamesCmb; private final JComboBox _fontSizesCmb = new JComboBox(new String[] { "8", "9", "10", "12", "14" }); private final JCheckBox _boldChk = new JCheckBox("Bold"); private final JCheckBox _italicChk = new JCheckBox("Italic"); private final JLabel _previewLbl = new JLabel("PreviewText"); private Font _font; private ActionListener _previewUpdater; /** * Default ctor. */ public FontChooser() { this((Frame)null); } /** * ctor specifying whether styles can be selected. * * @param selectStyles If true bold and italic checkboxes displayed. */ public FontChooser(boolean selectStyles) { this((Frame)null, selectStyles); } /** * ctor specifying the parent frame. * * @param owner Parent frame. */ public FontChooser(Frame owner) { super(owner, "Font Chooser", true); _selectStyles = true; createUserInterface(); } /** * ctor specifying the parent frame and whether styles can be selected. * * @param owner Parent frame. * @param selectStyles If true bold and italic checkboxes displayed. */ public FontChooser(Frame owner, boolean selectStyles) { super(owner, "Font Chooser", true); _selectStyles = selectStyles; createUserInterface(); } /** * ctor specifying the parent dialog. * * @param owner Parent frame. */ public FontChooser(Dialog owner) { super(owner, "Font Chooser", true); _selectStyles = true; createUserInterface(); } /** * ctor specifying the parent dialog and whether styles can be selected. * * @param owner Parent frame. * @param selectStyles If true bold and italic checkboxes displayed. */ public FontChooser(Dialog owner, boolean selectStyles) { super(owner, "Font Chooser", true); _selectStyles = selectStyles; createUserInterface(); } /** * Component is being added to its parent. */ public void addNotify() { super.addNotify(); if (_previewUpdater == null) { _previewUpdater = new PreviewLabelUpdater(); _fontNamesCmb.addActionListener(_previewUpdater); _fontSizesCmb.addActionListener(_previewUpdater); _boldChk.addActionListener(_previewUpdater); _italicChk.addActionListener(_previewUpdater); } } /** * Component is being removed from its parent. */ public void removeNotify() { super.removeNotify(); if (_previewUpdater != null) { _fontNamesCmb.removeActionListener(_previewUpdater); _fontSizesCmb.removeActionListener(_previewUpdater); _boldChk.removeActionListener(_previewUpdater); _italicChk.removeActionListener(_previewUpdater); _previewUpdater = null; } } public Font showDialog() { return showDialog(null); } /** * Show dialog defaulting to the passed font. * * @param font The font to default to. */ public Font showDialog(Font font) { if (font != null) { _fontNamesCmb.setSelectedItem(font.getName()); _fontSizesCmb.setSelectedItem("" + font.getSize()); _boldChk.setSelected(_selectStyles && font.isBold()); _italicChk.setSelected(_selectStyles && font.isItalic()); } else { _fontNamesCmb.setSelectedIndex(0); _fontSizesCmb.setSelectedIndex(0); _boldChk.setSelected(false); _italicChk.setSelected(false); } setupPreviewLabel(); setVisible(true); return _font; } public Font getSelectedFont() { return _font; } protected void setupFontFromDialog() { int size = 12; try { size = Integer.parseInt((String)_fontSizesCmb.getSelectedItem()); } catch (Exception ignore) { // Ignore. } FontInfo fi = new FontInfo(); fi.setFamily((String)_fontNamesCmb.getSelectedItem()); fi.setSize(size); fi.setIsBold(_boldChk.isSelected()); fi.setIsItalic(_italicChk.isSelected()); _font = fi.createFont(); } private void createUserInterface() { final JPanel content = new JPanel(new GridBagLayout()); final GridBagConstraints gbc = new GridBagConstraints(); setContentPane(content); content.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5)); gbc.anchor = GridBagConstraints.WEST; gbc.insets = new Insets(2, 2, 2, 2); gbc.fill = GridBagConstraints.HORIZONTAL; gbc.gridx = gbc.gridy = 0; content.add(new JLabel("Font"), gbc); ++gbc.gridx; content.add(new JLabel("Size"), gbc); if (_selectStyles) { ++gbc.gridx; content.add(new JLabel("Style"), gbc); } ++gbc.gridy; gbc.gridx = 0; _fontNamesCmb = new JComboBox(GraphicsEnvironment.getLocalGraphicsEnvironment().getAvailableFontFamilyNames()); content.add(_fontNamesCmb, gbc); ++gbc.gridx; _fontSizesCmb.setEditable(true); content.add(_fontSizesCmb, gbc); if (_selectStyles) { ++gbc.gridx; content.add(_boldChk, gbc); ++gbc.gridy; content.add(_italicChk, gbc); } gbc.gridx = 0; ++gbc.gridy; gbc.gridwidth = GridBagConstraints.REMAINDER; gbc.fill = GridBagConstraints.BOTH; gbc.anchor = GridBagConstraints.CENTER; content.add(createPreviewPanel(), gbc); ++gbc.gridy; gbc.fill = GridBagConstraints.HORIZONTAL; content.add(createButtonsPanel(), gbc); pack(); setResizable(true); } private JPanel createPreviewPanel() { final JPanel pnl = new JPanel(new BorderLayout()); pnl.setBorder(BorderFactory.createTitledBorder("PreviewTitle")); Dimension prefSize = _previewLbl.getPreferredSize(); prefSize.height = 50; _previewLbl.setPreferredSize(prefSize); pnl.add(_previewLbl, BorderLayout.CENTER); setupPreviewLabel(); return pnl; } private JPanel createButtonsPanel() { JPanel pnl = new JPanel(); JButton okBtn = new JButton("OK"); okBtn.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent evt) { setupFontFromDialog(); dispose(); } }); JButton cancelBtn = new JButton("Cancel"); cancelBtn.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent evt) { FontChooser.this._font = null; dispose(); } }); pnl.add(okBtn); pnl.add(cancelBtn); getRootPane().setDefaultButton(okBtn); return pnl; } private void setupPreviewLabel() { setupFontFromDialog(); _previewLbl.setFont(_font); } private final class PreviewLabelUpdater implements ActionListener { public void actionPerformed(ActionEvent evt) { setupPreviewLabel(); } }
}
/*
* Copyright (C) 2001-2003 Colin Bell * colbell@users.sourceforge.net * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ class FontInfo implements Cloneable, Serializable
{
private static final long serialVersionUID = 1L; public interface IPropertyNames { String FAMILY = "family"; String IS_BOLD = "isBold"; String IS_ITALIC = "isItalic"; String SIZE = "size"; } private static String DEFAULT_FAMILY = "Monospaced"; private String _familyName; private boolean _isBold; private boolean _isItalic; private int _size; public FontInfo() { super(); setFamily(DEFAULT_FAMILY); setSize(12); } public FontInfo(Font font) { super(); if (font == null) { throw new IllegalArgumentException("Null Font passed"); } setFont(font); } /** * Return a copy of this object. */ public Object clone() { try { return super.clone(); } catch (CloneNotSupportedException ex) { throw new InternalError(ex.getMessage()); // Impossible. } } public String getFamily() { return _familyName; } public void setFamily(String value) { _familyName = value != null ? value : DEFAULT_FAMILY; } public boolean isBold() { return _isBold; } public void setIsBold(boolean value) { _isBold = value; } public boolean isItalic() { return _isItalic; } public void setIsItalic(boolean value) { _isItalic = value; } public int getSize() { return _size; } public void setSize(int value) { _size = value; } public void setFont(Font font) throws IllegalArgumentException { if (font == null) { throw new IllegalArgumentException("Null Font passed"); } _familyName = font.getFamily(); _isBold = font.isBold(); _isItalic = font.isItalic(); _size = font.getSize(); } public boolean doesFontMatch(Font font) { if (font == null) { return false; } return font.getFamily().equals(_familyName) && font.getSize() == getSize() && font.getStyle() == generateStyle(); } public int generateStyle() { int style = 0; if (!_isBold && !_isItalic) { style = Font.PLAIN; } else { if (_isBold) { style |= Font.BOLD; } if (_isItalic) { style |= Font.ITALIC; } } return style; } public Font createFont() { return new Font(_familyName, generateStyle(), _size); } // i18n ? What is this used for? public String toString() { StringBuffer buf = new StringBuffer(); buf.append(_familyName).append(", " + _size); if (_isBold) { buf.append(", bold"); } if (_isItalic) { buf.append(", italic"); } return buf.toString(); } /** * @see java.lang.Object#hashCode() */ @Override public int hashCode() { final int PRIME = 31; int result = 1; result = PRIME * result + ((_familyName == null) ? 0 : _familyName.hashCode()); result = PRIME * result + (_isBold ? 1231 : 1237); result = PRIME * result + (_isItalic ? 1231 : 1237); result = PRIME * result + _size; return result; } /** * @see java.lang.Object#equals(java.lang.Object) */ @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; final FontInfo other = (FontInfo) obj; if (_familyName == null) { if (other._familyName != null) return false; } else if (!_familyName.equals(other._familyName)) return false; if (_isBold != other._isBold) return false; if (_isItalic != other._isItalic) return false; if (_size != other._size) return false; return true; }
}</source>
A dialog that presents the user with a sequence of steps for completing a task.
<source lang="java">
import java.awt.BorderLayout; import java.awt.Container; import java.awt.LayoutManager; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.ArrayList; import javax.swing.BorderFactory; import javax.swing.JButton; import javax.swing.JDialog; import javax.swing.JFrame; import javax.swing.JPanel; /**
* A dialog that presents the user with a sequence of steps for completing a * task. The dialog contains "Next" and "Previous" buttons, allowing the user to * navigate through the task.*
* When the user backs up by one or more steps, the dialog keeps the completed * steps so that they can be reused if the user doesn"t change anything - this * handles the cases where the user backs up a few steps just to review what has * been completed. * <p> * But if the user changes some options in an earlier step, then the dialog may * have to discard the later steps and have them repeated. * <P> * THIS CLASS IS NOT WORKING CORRECTLY YET. * * * @author David Gilbert */ public class WizardDialog extends JDialog implements ActionListener { /** The end result of the wizard sequence. */ private Object result; /** The current step in the wizard process (starting at step zero). */ private int step; /** A reference to the current panel. */ private WizardPanel currentPanel; /** * A list of references to the panels the user has already seen - used for * navigating through the steps that have already been completed. */ private java.util.List panels; /** A handy reference to the "previous" button. */ private JButton previousButton; /** A handy reference to the "next" button. */ private JButton nextButton; /** A handy reference to the "finish" button. */ private JButton finishButton; /** A handy reference to the "help" button. */ private JButton helpButton; /** * Standard constructor - builds and returns a new WizardDialog. * * @param owner * the owner. * @param modal * modal? * @param title * the title. * @param firstPanel * the first panel. */ public WizardDialog(final JDialog owner, final boolean modal, final String title, final WizardPanel firstPanel) { super(owner, title + " : step 1", modal); this.result = null; this.currentPanel = firstPanel; this.step = 0; this.panels = new ArrayList(); this.panels.add(firstPanel); setContentPane(createContent()); } /** * Standard constructor - builds a new WizardDialog owned by the specified * JFrame. * * @param owner * the owner. * @param modal * modal? * @param title * the title. * @param firstPanel * the first panel. */ public WizardDialog(final JFrame owner, final boolean modal, final String title, final WizardPanel firstPanel) { super(owner, title + " : step 1", modal); this.result = null; this.currentPanel = firstPanel; this.step = 0; this.panels = new ArrayList(); this.panels.add(firstPanel); setContentPane(createContent()); } /** * Returns the result of the wizard sequence. * * @return the result. */ public Object getResult() { return this.result; } /** * Returns the total number of steps in the wizard sequence, if this number is * known. Otherwise this method returns zero. Subclasses should override this * method unless the number of steps is not known. * * @return the number of steps. */ public int getStepCount() { return 0; } /** * Returns true if it is possible to back up to the previous panel, and false * otherwise. * * @return boolean. */ public boolean canDoPreviousPanel() { return (this.step > 0); } /** * Returns true if there is a "next" panel, and false otherwise. * * @return boolean. */ public boolean canDoNextPanel() { return this.currentPanel.hasNextPanel(); } /** * Returns true if it is possible to finish the sequence at this point * (possibly with defaults for the remaining entries). * * @return boolean. */ public boolean canFinish() { return this.currentPanel.canFinish(); } /** * Returns the panel for the specified step (steps are numbered from zero). * * @param step * the current step. * * @return the panel. */ public WizardPanel getWizardPanel(final int step) { if (step < this.panels.size()) { return (WizardPanel) this.panels.get(step); } else { return null; } } /** * Handles events. * * @param event * the event. */ public void actionPerformed(final ActionEvent event) { final String command = event.getActionCommand(); if (command.equals("nextButton")) { next(); } else if (command.equals("previousButton")) { previous(); } else if (command.equals("finishButton")) { finish(); } } /** * Handles a click on the "previous" button, by displaying the previous panel * in the sequence. */ public void previous() { if (this.step > 0) { final WizardPanel previousPanel = getWizardPanel(this.step - 1); // tell the panel that we are returning previousPanel.returnFromLaterStep(); final Container content = getContentPane(); content.remove(this.currentPanel); content.add(previousPanel); this.step = this.step - 1; this.currentPanel = previousPanel; setTitle("Step " + (this.step + 1)); enableButtons(); pack(); } } /** * Displays the next step in the wizard sequence. */ public void next() { WizardPanel nextPanel = getWizardPanel(this.step + 1); if (nextPanel != null) { if (!this.currentPanel.canRedisplayNextPanel()) { nextPanel = this.currentPanel.getNextPanel(); } } else { nextPanel = this.currentPanel.getNextPanel(); } this.step = this.step + 1; if (this.step < this.panels.size()) { this.panels.set(this.step, nextPanel); } else { this.panels.add(nextPanel); } final Container content = getContentPane(); content.remove(this.currentPanel); content.add(nextPanel); this.currentPanel = nextPanel; setTitle("Step " + (this.step + 1)); enableButtons(); pack(); } /** * Finishes the wizard. */ public void finish() { this.result = this.currentPanel.getResult(); setVisible(false); } /** * Enables/disables the buttons according to the current step. A good idea * would be to ask the panels to return the status... */ private void enableButtons() { this.previousButton.setEnabled(this.step > 0); this.nextButton.setEnabled(canDoNextPanel()); this.finishButton.setEnabled(canFinish()); this.helpButton.setEnabled(false); } /** * Checks, whether the user cancelled the dialog. * * @return false. */ public boolean isCancelled() { return false; } /** * Creates a panel containing the user interface for the dialog. * * @return the panel. */ public JPanel createContent() { final JPanel content = new JPanel(new BorderLayout()); content.setBorder(BorderFactory.createEmptyBorder(4, 4, 4, 4)); content.add((JPanel) this.panels.get(0)); final L1R3ButtonPanel buttons = new L1R3ButtonPanel("Help", "Previous", "Next", "Finish"); this.helpButton = buttons.getLeftButton(); this.helpButton.setEnabled(false); this.previousButton = buttons.getRightButton1(); this.previousButton.setActionCommand("previousButton"); this.previousButton.addActionListener(this); this.previousButton.setEnabled(false); this.nextButton = buttons.getRightButton2(); this.nextButton.setActionCommand("nextButton"); this.nextButton.addActionListener(this); this.nextButton.setEnabled(true); this.finishButton = buttons.getRightButton3(); this.finishButton.setActionCommand("finishButton"); this.finishButton.addActionListener(this); this.finishButton.setEnabled(false); buttons.setBorder(BorderFactory.createEmptyBorder(4, 0, 0, 0)); content.add(buttons, BorderLayout.SOUTH); return content; } } /* * JCommon : a free general purpose class library for the Java(tm) platform * * * (C) Copyright 2000-2005, by Object Refinery Limited and Contributors. * * Project Info: http://www.jfree.org/jcommon/index.html * * This library is free software; you can redistribute it and/or modify it under * the terms of the GNU Lesser General Public License as published by the Free * Software Foundation; either version 2.1 of the License, or (at your option) * any later version. * * This library is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more * details. * * You should have received a copy of the GNU Lesser General Public License * along with this library; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * * [Java is a trademark or registered trademark of Sun Microsystems, Inc. in the * United States and other countries.] * * ---------------- WizardPanel.java ---------------- (C) Copyright 2000-2004, * by Object Refinery Limited. * * Original Author: David Gilbert (for Object Refinery Limited); Contributor(s): -; * * $Id: WizardPanel.java,v 1.5 2007/11/02 17:50:36 taqua Exp $ * * Changes (from 26-Oct-2001) -------------------------- 26-Oct-2001 : Changed * package to com.jrefinery.ui.*; 14-Oct-2002 : Fixed errors reported by * Checkstyle (DG); * */ /** * A panel that provides the user interface for a single step in a WizardDialog. * * @author David Gilbert */ abstract class WizardPanel extends JPanel { /** The owner. */ private WizardDialog owner; /** * Creates a new panel. * * @param layout * the layout manager. */ protected WizardPanel(final LayoutManager layout) { super(layout); } /** * Returns a reference to the dialog that owns the panel. * * @return the owner. */ public WizardDialog getOwner() { return this.owner; } /** * Sets the reference to the dialog that owns the panel (this is called * automatically by the dialog when the panel is added to the dialog). * * @param owner * the owner. */ public void setOwner(final WizardDialog owner) { this.owner = owner; } /** * Returns the result. * * @return the result. */ public Object getResult() { return null; } /** * This method is called when the dialog redisplays this panel as a result of * the user clicking the "Previous" button. Inside this method, subclasses * should make a note of their current state, so that they can decide what to * do when the user hits "Next". */ public abstract void returnFromLaterStep(); /** * Returns true if it is OK to redisplay the last version of the next panel, * or false if a new version is required. * * @return boolean. */ public abstract boolean canRedisplayNextPanel(); /** * Returns true if there is a next panel. * * @return boolean. */ public abstract boolean hasNextPanel(); /** * Returns true if it is possible to finish from this panel. * * @return boolean. */ public abstract boolean canFinish(); /** * Returns the next panel in the sequence, given the current user input. * Returns null if this panel is the last one in the sequence. * * @return the next panel in the sequence. */ public abstract WizardPanel getNextPanel(); } /* * JCommon : a free general purpose class library for the Java(tm) platform * * * (C) Copyright 2000-2005, by Object Refinery Limited and Contributors. * * Project Info: http://www.jfree.org/jcommon/index.html * * This library is free software; you can redistribute it and/or modify it under * the terms of the GNU Lesser General Public License as published by the Free * Software Foundation; either version 2.1 of the License, or (at your option) * any later version. * * This library is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more * details. * * You should have received a copy of the GNU Lesser General Public License * along with this library; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * * [Java is a trademark or registered trademark of Sun Microsystems, Inc. in the * United States and other countries.] * * -------------------- L1R3ButtonPanel.java -------------------- (C) Copyright * 2000-2004, by Object Refinery Limited. * * Original Author: David Gilbert (for Object Refinery Limited); Contributor(s): -; * * $Id: L1R3ButtonPanel.java,v 1.5 2007/11/02 17:50:36 taqua Exp $ * * Changes (from 26-Oct-2001) -------------------------- 26-Oct-2001 : Changed * package to com.jrefinery.ui.* (DG); 26-Jun-2002 : Removed unnecessary import * (DG); 14-Oct-2002 : Fixed errors reported by Checkstyle (DG); * */ /** * A "ready-made" panel that has one button on the left and three buttons on the * right - nested panels and layout managers take care of resizing. * * @author David Gilbert */ class L1R3ButtonPanel extends JPanel { /** The left button. */ private JButton left; /** The first button on the right of the panel. */ private JButton right1; /** The second button on the right of the panel. */ private JButton right2; /** The third button on the right of the panel. */ private JButton right3; /** * Standard constructor - creates panel with the specified button labels. * * @param label1 * the label for button 1. * @param label2 * the label for button 2. * @param label3 * the label for button 3. * @param label4 * the label for button 4. */ public L1R3ButtonPanel(final String label1, final String label2, final String label3, final String label4) { setLayout(new BorderLayout()); // create the pieces... final JPanel panel = new JPanel(new BorderLayout()); final JPanel panel2 = new JPanel(new BorderLayout()); this.left = new JButton(label1); this.right1 = new JButton(label2); this.right2 = new JButton(label3); this.right3 = new JButton(label4); // ...and put them together panel.add(this.left, BorderLayout.WEST); panel2.add(this.right1, BorderLayout.EAST); panel.add(panel2, BorderLayout.CENTER); panel.add(this.right2, BorderLayout.EAST); add(panel, BorderLayout.CENTER); add(this.right3, BorderLayout.EAST); } /** * Returns a reference to button 1, allowing the caller to set labels, * action-listeners etc. * * @return the left button. */ public JButton getLeftButton() { return this.left; } /** * Returns a reference to button 2, allowing the caller to set labels, * action-listeners etc. * * @return the right button 1. */ public JButton getRightButton1() { return this.right1; } /** * Returns a reference to button 3, allowing the caller to set labels, * action-listeners etc. * * @return the right button 2. */ public JButton getRightButton2() { return this.right2; } /** * Returns a reference to button 4, allowing the caller to set labels, * action-listeners etc. * * @return the right button 3. */ public JButton getRightButton3() { return this.right3; } }</source>
A Simple Modal Dialog
<source lang="java">
import java.awt.BorderLayout; import java.awt.Dimension; import java.awt.Point; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JButton; import javax.swing.JDialog; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; public class AboutDialog extends JDialog implements ActionListener {
public AboutDialog(JFrame parent, String title, String message) { super(parent, title, true); if (parent != null) { Dimension parentSize = parent.getSize(); Point p = parent.getLocation(); setLocation(p.x + parentSize.width / 4, p.y + parentSize.height / 4); } JPanel messagePane = new JPanel(); messagePane.add(new JLabel(message)); getContentPane().add(messagePane); JPanel buttonPane = new JPanel(); JButton button = new JButton("OK"); buttonPane.add(button); button.addActionListener(this); getContentPane().add(buttonPane, BorderLayout.SOUTH); setDefaultCloseOperation(DISPOSE_ON_CLOSE); pack(); setVisible(true); } public void actionPerformed(ActionEvent e) { setVisible(false); dispose(); } public static void main(String[] a) { AboutDialog dlg = new AboutDialog(new JFrame(), "title", "message"); }
}</source>
Dialog Introduction
- A dialog can be either modal or modeless.
- A modal dialog blocks user input to all other windows in the same application when it is visible. You have to close a modal dialog before other windows in the same application can get focus.
- A modeless one does not block user input.
- A dialog can belong to another dialog or a frame. Or, it can stand alone like a JFrame.
<source lang="java">
class Help extends JDialog {
Help(Frame frame, String title) { super(frame, title); setModalExclusionType(Dialog.ModalExclusionType.APPLICATION_EXCLUDE); try { JEditorPane ep = new JEditorPane("file:///" + new File("").getAbsolutePath() + "/uchelp.html"); ep.setEnabled(false); getContentPane().add(ep); } catch (IOException ioe) { JOptionPane.showMessageDialog(frame, "Unable to install editor pane"); return; } setSize(200, 200); setLocationRelativeTo(frame); setVisible(true); }
}</source>
Dialog Panel
<source lang="java">
/*
* Enhydra Java Application Server Project * * The contents of this file are subject to the Enhydra Public License * Version 1.1 (the "License"); you may not use this file except in * compliance with the License. You may obtain a copy of the License on * the Enhydra web site ( http://www.enhydra.org/ ). * * Software distributed under the License is distributed on an "AS IS" * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See * the License for the specific terms governing rights and limitations * under the License. * * The Initial Developer of the Enhydra Application Server is Lutris * Technologies, Inc. The Enhydra Application Server and portions created * by Lutris Technologies, Inc. are Copyright Lutris Technologies, Inc. * All Rights Reserved. * * Contributor(s): * */
// Standard imports import java.awt.BorderLayout; import java.awt.Window; import java.awt.Dialog; import java.awt.Frame; import java.awt.Point; import java.awt.event.WindowEvent; import javax.swing.JDialog; import javax.swing.JPanel; import javax.swing.JOptionPane; // public class DialogPanel extends JPanel {
public final static int CANCEL_OPTION = JOptionPane.CANCEL_OPTION; public final static int OK_OPTION = JOptionPane.OK_OPTION; // private int option = DialogPanel.CANCEL_OPTION; private LocalDialog dialog = null; private Window owner = null; private boolean windowClose = false; private boolean standalone = false; private boolean modal = true; private String title = new String(); public Window getOwner() { return owner; } public void setOwner(Window w) { owner = w; } public String getTitle() { return title; } public void setTitle(String t) { title = t; } public boolean isModal() { return modal; } public void setModal(boolean b) { modal = b; } public int getOption() { return option; } public void setOption(int o) { option = o; } public LocalDialog getDialog() { return dialog; } public void startDialogThread() { Thread dialogThread = new Thread() { public void run() { showDialog(); } }; dialogThread.start(); } public int showDialog() { BorderLayout layout = null; Point cp = null; if (dialog == null) { if (getOwner() == null) { dialog = new LocalDialog(); } else if (getOwner() instanceof Frame) { dialog = new LocalDialog((Frame) getOwner()); } else if (getOwner() instanceof Dialog) { dialog = new LocalDialog((Dialog) getOwner()); } else { dialog = new LocalDialog(); } } dialog.setModal(isModal()); dialog.setTitle(getTitle()); layout = new BorderLayout(); dialog.getRootPane().setLayout(layout); dialog.getRootPane().add(this, BorderLayout.CENTER); dialog.pack(); dialog.show(); return option; } // // PROTECTED // protected void hideDialog() { if (dialog != null) { dialog.setVisible(false); } } protected void clearDialog() { if (dialog != null) { dialog.setVisible(false); dialog.getRootPane().removeAll(); dialog.removeAll(); dialog.dispose(); } if (isStandalone()) { System.exit(0); } } protected boolean isWindowClose() { return windowClose; } protected void setWindowClose(boolean b) { windowClose = b; } protected boolean isStandalone() { return standalone; } protected void setStandalone(boolean b) { standalone = b; } private class LocalDialog extends JDialog { public LocalDialog() { super(); } public LocalDialog(Dialog owner) { super(owner); } public LocalDialog(Frame owner) { super(owner); } protected void processWindowEvent(WindowEvent e) { if (isWindowClose()) { if (e.getID() == WindowEvent.WINDOW_CLOSING) { clearDialog(); } super.processWindowEvent(e); } } }
}</source>
Extending JDialog
<p>If you need to extend JDialog, the class has two protected methods of importance:
<source lang="java">
protected void dialogInit() protected JRootPane createRootPane()</source>
extends JDialog to create your own dialog
<source lang="java">
/*
* Copyright (c) 1995 - 2008 Sun Microsystems, Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * - 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. * * - Neither the name of Sun Microsystems 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 COPYRIGHT OWNER 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. */
import java.awt.BorderLayout; import java.awt.Dimension; import java.awt.Font; import java.awt.Frame; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.ruponentAdapter; import java.awt.event.ruponentEvent; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import javax.swing.BorderFactory; import javax.swing.Box; import javax.swing.BoxLayout; import javax.swing.ButtonGroup; import javax.swing.ImageIcon; import javax.swing.JButton; import javax.swing.JDialog; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JRadioButton; import javax.swing.JTabbedPane; import javax.swing.JTextField; import javax.swing.border.Border; /*
* DialogDemo.java requires these files: CustomDialog.java images/middle.gif */
public class DialogDemo extends JPanel {
JLabel label; ImageIcon icon = createImageIcon("images/middle.gif"); JFrame frame; String simpleDialogDesc = "Some simple message dialogs"; String iconDesc = "A JOptionPane has its choice of icons"; String moreDialogDesc = "Some more dialogs"; CustomDialog customDialog; /** Creates the GUI shown inside the frame"s content pane. */ public DialogDemo(JFrame frame) { super(new BorderLayout()); this.frame = frame; customDialog = new CustomDialog(frame, "geisel", this); customDialog.pack(); // Create the components. JPanel frequentPanel = createSimpleDialogBox(); JPanel featurePanel = createFeatureDialogBox(); JPanel iconPanel = createIconDialogBox(); label = new JLabel("Click the \"Show it!\" button" + " to bring up the selected dialog.", JLabel.CENTER); // Lay them out. Border padding = BorderFactory.createEmptyBorder(20, 20, 5, 20); frequentPanel.setBorder(padding); featurePanel.setBorder(padding); iconPanel.setBorder(padding); JTabbedPane tabbedPane = new JTabbedPane(); tabbedPane.addTab("Simple Modal Dialogs", null, frequentPanel, simpleDialogDesc); // tooltip text tabbedPane.addTab("More Dialogs", null, featurePanel, moreDialogDesc); // tooltip // text tabbedPane.addTab("Dialog Icons", null, iconPanel, iconDesc); // tooltip // text add(tabbedPane, BorderLayout.CENTER); add(label, BorderLayout.PAGE_END); label.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); } /** Sets the text displayed at the bottom of the frame. */ void setLabel(String newText) { label.setText(newText); } /** Returns an ImageIcon, or null if the path was invalid. */ protected static ImageIcon createImageIcon(String path) { java.net.URL imgURL = DialogDemo.class.getResource(path); if (imgURL != null) { return new ImageIcon(imgURL); } else { System.err.println("Couldn"t find file: " + path); return null; } } /** Creates the panel shown by the first tab. */ private JPanel createSimpleDialogBox() { final int numButtons = 4; JRadioButton[] radioButtons = new JRadioButton[numButtons]; final ButtonGroup group = new ButtonGroup(); JButton showItButton = null; final String defaultMessageCommand = "default"; final String yesNoCommand = "yesno"; final String yeahNahCommand = "yeahnah"; final String yncCommand = "ync"; radioButtons[0] = new JRadioButton("OK (in the L&F"s words)"); radioButtons[0].setActionCommand(defaultMessageCommand); radioButtons[1] = new JRadioButton("Yes/No (in the L&F"s words)"); radioButtons[1].setActionCommand(yesNoCommand); radioButtons[2] = new JRadioButton("Yes/No " + "(in the programmer"s words)"); radioButtons[2].setActionCommand(yeahNahCommand); radioButtons[3] = new JRadioButton("Yes/No/Cancel " + "(in the programmer"s words)"); radioButtons[3].setActionCommand(yncCommand); for (int i = 0; i < numButtons; i++) { group.add(radioButtons[i]); } radioButtons[0].setSelected(true); showItButton = new JButton("Show it!"); showItButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { String command = group.getSelection().getActionCommand(); // ok dialog if (command == defaultMessageCommand) { JOptionPane.showMessageDialog(frame, "Eggs aren"t supposed to be green."); // yes/no dialog } else if (command == yesNoCommand) { int n = JOptionPane.showConfirmDialog(frame, "Would you like green eggs and ham?", "An Inane Question", JOptionPane.YES_NO_OPTION); if (n == JOptionPane.YES_OPTION) { setLabel("Ewww!"); } else if (n == JOptionPane.NO_OPTION) { setLabel("Me neither!"); } else { setLabel("Come on -- tell me!"); } // yes/no (not in those words) } else if (command == yeahNahCommand) { Object[] options = { "Yes, please", "No way!" }; int n = JOptionPane.showOptionDialog(frame, "Would you like green eggs and ham?", "A Silly Question", JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE, null, options, options[0]); if (n == JOptionPane.YES_OPTION) { setLabel("You"re kidding!"); } else if (n == JOptionPane.NO_OPTION) { setLabel("I don"t like them, either."); } else { setLabel("Come on -- "fess up!"); } // yes/no/cancel (not in those words) } else if (command == yncCommand) { Object[] options = { "Yes, please", "No, thanks", "No eggs, no ham!" }; int n = JOptionPane.showOptionDialog(frame, "Would you like some green eggs to go " + "with that ham?", "A Silly Question", JOptionPane.YES_NO_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE, null, options, options[2]); if (n == JOptionPane.YES_OPTION) { setLabel("Here you go: green eggs and ham!"); } else if (n == JOptionPane.NO_OPTION) { setLabel("OK, just the ham, then."); } else if (n == JOptionPane.CANCEL_OPTION) { setLabel("Well, I"m certainly not going to eat them!"); } else { setLabel("Please tell me what you want!"); } } return; } }); return createPane(simpleDialogDesc + ":", radioButtons, showItButton); } /** * Used by createSimpleDialogBox and createFeatureDialogBox to create a pane * containing a description, a single column of radio buttons, and the Show * it! button. */ private JPanel createPane(String description, JRadioButton[] radioButtons, JButton showButton) { int numChoices = radioButtons.length; JPanel box = new JPanel(); JLabel label = new JLabel(description); box.setLayout(new BoxLayout(box, BoxLayout.PAGE_AXIS)); box.add(label); for (int i = 0; i < numChoices; i++) { box.add(radioButtons[i]); } JPanel pane = new JPanel(new BorderLayout()); pane.add(box, BorderLayout.PAGE_START); pane.add(showButton, BorderLayout.PAGE_END); return pane; } /** * Like createPane, but creates a pane with 2 columns of radio buttons. The * number of buttons passed in *must* be even. */ private JPanel create2ColPane(String description, JRadioButton[] radioButtons, JButton showButton) { JLabel label = new JLabel(description); int numPerColumn = radioButtons.length / 2; JPanel grid = new JPanel(new GridLayout(0, 2)); for (int i = 0; i < numPerColumn; i++) { grid.add(radioButtons[i]); grid.add(radioButtons[i + numPerColumn]); } JPanel box = new JPanel(); box.setLayout(new BoxLayout(box, BoxLayout.PAGE_AXIS)); box.add(label); grid.setAlignmentX(0.0f); box.add(grid); JPanel pane = new JPanel(new BorderLayout()); pane.add(box, BorderLayout.PAGE_START); pane.add(showButton, BorderLayout.PAGE_END); return pane; } /* * Creates the panel shown by the 3rd tab. These dialogs are implemented using * showMessageDialog, but you can specify the icon (using similar code) for * any other kind of dialog, as well. */ private JPanel createIconDialogBox() { JButton showItButton = null; final int numButtons = 6; JRadioButton[] radioButtons = new JRadioButton[numButtons]; final ButtonGroup group = new ButtonGroup(); final String plainCommand = "plain"; final String infoCommand = "info"; final String questionCommand = "question"; final String errorCommand = "error"; final String warningCommand = "warning"; final String customCommand = "custom"; radioButtons[0] = new JRadioButton("Plain (no icon)"); radioButtons[0].setActionCommand(plainCommand); radioButtons[1] = new JRadioButton("Information icon"); radioButtons[1].setActionCommand(infoCommand); radioButtons[2] = new JRadioButton("Question icon"); radioButtons[2].setActionCommand(questionCommand); radioButtons[3] = new JRadioButton("Error icon"); radioButtons[3].setActionCommand(errorCommand); radioButtons[4] = new JRadioButton("Warning icon"); radioButtons[4].setActionCommand(warningCommand); radioButtons[5] = new JRadioButton("Custom icon"); radioButtons[5].setActionCommand(customCommand); for (int i = 0; i < numButtons; i++) { group.add(radioButtons[i]); } radioButtons[0].setSelected(true); showItButton = new JButton("Show it!"); showItButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { String command = group.getSelection().getActionCommand(); // no icon if (command == plainCommand) { JOptionPane.showMessageDialog(frame, "Eggs aren"t supposed to be green.", "A plain message", JOptionPane.PLAIN_MESSAGE); // information icon } else if (command == infoCommand) { JOptionPane.showMessageDialog(frame, "Eggs aren"t supposed to be green.", "Inane informational dialog", JOptionPane.INFORMATION_MESSAGE); // XXX: It doesn"t make sense to make a question with // XXX: only one button. // XXX: See "Yes/No (but not in those words)" for a better solution. // question icon } else if (command == questionCommand) { JOptionPane.showMessageDialog(frame, "You shouldn"t use a message dialog " + "(like this)\n" + "for a question, OK?", "Inane question", JOptionPane.QUESTION_MESSAGE); // error icon } else if (command == errorCommand) { JOptionPane.showMessageDialog(frame, "Eggs aren"t supposed to be green.", "Inane error", JOptionPane.ERROR_MESSAGE); // warning icon } else if (command == warningCommand) { JOptionPane.showMessageDialog(frame, "Eggs aren"t supposed to be green.", "Inane warning", JOptionPane.WARNING_MESSAGE); // custom icon } else if (command == customCommand) { JOptionPane.showMessageDialog(frame, "Eggs aren"t supposed to be green.", "Inane custom dialog", JOptionPane.INFORMATION_MESSAGE, icon); } } }); return create2ColPane(iconDesc + ":", radioButtons, showItButton); } /** Creates the panel shown by the second tab. */ private JPanel createFeatureDialogBox() { final int numButtons = 5; JRadioButton[] radioButtons = new JRadioButton[numButtons]; final ButtonGroup group = new ButtonGroup(); JButton showItButton = null; final String pickOneCommand = "pickone"; final String textEnteredCommand = "textfield"; final String nonAutoCommand = "nonautooption"; final String customOptionCommand = "customoption"; final String nonModalCommand = "nonmodal"; radioButtons[0] = new JRadioButton("Pick one of several choices"); radioButtons[0].setActionCommand(pickOneCommand); radioButtons[1] = new JRadioButton("Enter some text"); radioButtons[1].setActionCommand(textEnteredCommand); radioButtons[2] = new JRadioButton("Non-auto-closing dialog"); radioButtons[2].setActionCommand(nonAutoCommand); radioButtons[3] = new JRadioButton("Input-validating dialog " + "(with custom message area)"); radioButtons[3].setActionCommand(customOptionCommand); radioButtons[4] = new JRadioButton("Non-modal dialog"); radioButtons[4].setActionCommand(nonModalCommand); for (int i = 0; i < numButtons; i++) { group.add(radioButtons[i]); } radioButtons[0].setSelected(true); showItButton = new JButton("Show it!"); showItButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { String command = group.getSelection().getActionCommand(); // pick one of many if (command == pickOneCommand) { Object[] possibilities = { "ham", "spam", "yam" }; String s = (String) JOptionPane.showInputDialog(frame, "Complete the sentence:\n" + "\"Green eggs and...\"", "Customized Dialog", JOptionPane.PLAIN_MESSAGE, icon, possibilities, "ham"); // If a string was returned, say so. if ((s != null) && (s.length() > 0)) { setLabel("Green eggs and... " + s + "!"); return; } // If you"re here, the return value was null/empty. setLabel("Come on, finish the sentence!"); // text input } else if (command == textEnteredCommand) { String s = (String) JOptionPane .showInputDialog(frame, "Complete the sentence:\n" + "\"Green eggs and...\"", "Customized Dialog", JOptionPane.PLAIN_MESSAGE, icon, null, "ham"); // If a string was returned, say so. if ((s != null) && (s.length() > 0)) { setLabel("Green eggs and... " + s + "!"); return; } // If you"re here, the return value was null/empty. setLabel("Come on, finish the sentence!"); // non-auto-closing dialog } else if (command == nonAutoCommand) { final JOptionPane optionPane = new JOptionPane( "The only way to close this dialog is by\n" + "pressing one of the following buttons.\n" + "Do you understand?", JOptionPane.QUESTION_MESSAGE, JOptionPane.YES_NO_OPTION); // You can"t use pane.createDialog() because that // method sets up the JDialog with a property change // listener that automatically closes the window // when a button is clicked. final JDialog dialog = new JDialog(frame, "Click a button", true); dialog.setContentPane(optionPane); dialog.setDefaultCloseOperation(JDialog.DO_NOTHING_ON_CLOSE); dialog.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent we) { setLabel("Thwarted user attempt to close window."); } }); optionPane.addPropertyChangeListener(new PropertyChangeListener() { public void propertyChange(PropertyChangeEvent e) { String prop = e.getPropertyName(); if (dialog.isVisible() && (e.getSource() == optionPane) && (JOptionPane.VALUE_PROPERTY.equals(prop))) { // If you were going to check something // before closing the window, you"d do // it here. dialog.setVisible(false); } } }); dialog.pack(); dialog.setLocationRelativeTo(frame); dialog.setVisible(true); int value = ((Integer) optionPane.getValue()).intValue(); if (value == JOptionPane.YES_OPTION) { setLabel("Good."); } else if (value == JOptionPane.NO_OPTION) { setLabel("Try using the window decorations " + "to close the non-auto-closing dialog. " + "You can"t!"); } else { setLabel("Window unavoidably closed (ESC?)."); } // non-auto-closing dialog with custom message area // NOTE: if you don"t intend to check the input, // then just use showInputDialog instead. } else if (command == customOptionCommand) { customDialog.setLocationRelativeTo(frame); customDialog.setVisible(true); String s = customDialog.getValidatedText(); if (s != null) { // The text is valid. setLabel("Congratulations! " + "You entered \"" + s + "\"."); } // non-modal dialog } else if (command == nonModalCommand) { // Create the dialog. final JDialog dialog = new JDialog(frame, "A Non-Modal Dialog"); // Add contents to it. It must have a close button, // since some L&Fs (notably Java/Metal) don"t provide one // in the window decorations for dialogs.JLabel label = new JLabel("<html>
"
+ "This is a non-modal dialog.
"
+ "You can have one or more of these up
"
+ "and still use the main window.");
label.setHorizontalAlignment(JLabel.CENTER);
Font font = label.getFont();
label.setFont(label.getFont().deriveFont(font.PLAIN, 14.0f));
JButton closeButton = new JButton("Close");
closeButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
dialog.setVisible(false);
dialog.dispose();
}
});
JPanel closePanel = new JPanel();
closePanel.setLayout(new BoxLayout(closePanel, BoxLayout.LINE_AXIS));
closePanel.add(Box.createHorizontalGlue());
closePanel.add(closeButton);
closePanel.setBorder(BorderFactory.createEmptyBorder(0, 0, 5, 5));
JPanel contentPane = new JPanel(new BorderLayout());
contentPane.add(label, BorderLayout.CENTER);
contentPane.add(closePanel, BorderLayout.PAGE_END);
contentPane.setOpaque(true);
dialog.setContentPane(contentPane);
// Show it.
dialog.setSize(new Dimension(300, 150));
dialog.setLocationRelativeTo(frame);
dialog.setVisible(true);
}
}
});
return createPane(moreDialogDesc + ":", radioButtons, showItButton);
}
/**
* Create the GUI and show it. For thread safety, this method should be
* invoked from the event-dispatching thread.
*/
private static void createAndShowGUI() {
// Create and set up the window.
JFrame frame = new JFrame("DialogDemo");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// Create and set up the content pane.
DialogDemo newContentPane = new DialogDemo(frame);
newContentPane.setOpaque(true); // content panes must be opaque
frame.setContentPane(newContentPane);
// Display the window.
frame.pack();
frame.setVisible(true);
}
public static void main(String[] args) {
// Schedule a job for the event-dispatching thread:
// creating and showing this application"s GUI.
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGUI();
}
});
}
}
/*
* Copyright (c) 1995 - 2008 Sun Microsystems, Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
* - Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* - 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.
* - Neither the name of Sun Microsystems 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 COPYRIGHT OWNER 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.
*/
/* 1.4 example used by DialogDemo.java. */
class CustomDialog extends JDialog implements ActionListener,
PropertyChangeListener {
private String typedText = null;
private JTextField textField;
private DialogDemo dd;
private String magicWord;
private JOptionPane optionPane;
private String btnString1 = "Enter";
private String btnString2 = "Cancel";
/**
* Returns null if the typed string was invalid; otherwise, returns the string
* as the user entered it.
*/
public String getValidatedText() {
return typedText;
}
/** Creates the reusable dialog. */
public CustomDialog(Frame aFrame, String aWord, DialogDemo parent) {
super(aFrame, true);
dd = parent;
magicWord = aWord.toUpperCase();
setTitle("Quiz");
textField = new JTextField(10);
// Create an array of the text and components to be displayed.
String msgString1 = "What was Dr. SEUSS"s real last name?";
String msgString2 = "(The answer is \"" + magicWord + "\".)";
Object[] array = { msgString1, msgString2, textField };
// Create an array specifying the number of dialog buttons
// and their text.
Object[] options = { btnString1, btnString2 };
// Create the JOptionPane.
optionPane = new JOptionPane(array, JOptionPane.QUESTION_MESSAGE,
JOptionPane.YES_NO_OPTION, null, options, options[0]);
// Make this dialog display it.
setContentPane(optionPane);
// Handle window closing correctly.
setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);
addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent we) {
/*
* Instead of directly closing the window, we"re going to change the
* JOptionPane"s value property.
*/
optionPane.setValue(new Integer(JOptionPane.CLOSED_OPTION));
}
});
// Ensure the text field always gets the first focus.
addComponentListener(new ComponentAdapter() {
public void componentShown(ComponentEvent ce) {
textField.requestFocusInWindow();
}
});
// Register an event handler that puts the text into the option pane.
textField.addActionListener(this);
// Register an event handler that reacts to option pane state changes.
optionPane.addPropertyChangeListener(this);
}
/** This method handles events for the text field. */
public void actionPerformed(ActionEvent e) {
optionPane.setValue(btnString1);
}
/** This method reacts to state changes in the option pane. */
public void propertyChange(PropertyChangeEvent e) {
String prop = e.getPropertyName();
if (isVisible()
&& (e.getSource() == optionPane)
&& (JOptionPane.VALUE_PROPERTY.equals(prop) || JOptionPane.INPUT_VALUE_PROPERTY
.equals(prop))) {
Object value = optionPane.getValue();
if (value == JOptionPane.UNINITIALIZED_VALUE) {
// ignore reset
return;
}
// Reset the JOptionPane"s value.
// If you don"t do this, then if the user
// presses the same button next time, no
// property change event will be fired.
optionPane.setValue(JOptionPane.UNINITIALIZED_VALUE);
if (btnString1.equals(value)) {
typedText = textField.getText();
String ucText = typedText.toUpperCase();
if (magicWord.equals(ucText)) {
// we"re done; clear and dismiss the dialog
clearAndHide();
} else {
// text was invalid
textField.selectAll();
JOptionPane.showMessageDialog(CustomDialog.this, "Sorry, \""
+ typedText + "\" " + "isn"t a valid response.\n"
+ "Please enter " + magicWord + ".", "Try again",
JOptionPane.ERROR_MESSAGE);
typedText = null;
textField.requestFocusInWindow();
}
} else { // user closed dialog or clicked cancel
dd.setLabel("It"s OK. " + "We won"t force you to type " + magicWord
+ ".");
typedText = null;
clearAndHide();
}
}
}
/** This method clears the dialog and hides it. */
public void clearAndHide() {
textField.setText(null);
setVisible(false);
}
}</source>
FontChooser by Noah w
<source lang="java">
/* This code was found posted on a forum without any copyright
* restrictions. It was written by someone named Noah W. * That"s all I know */
/* I have modified the original code but claim no copyright on it of any kind */
/* This file is part of BORG.
BORG is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. BORG is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with BORG; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
Copyright 2003 by Mike Berger
*/
import java.awt.Color; import java.awt.Font; import java.awt.Frame; import java.awt.GraphicsEnvironment; import java.awt.Insets; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.util.Enumeration; import javax.swing.JButton; import javax.swing.JDialog; import javax.swing.JLabel; import javax.swing.JList; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTextField; import javax.swing.UIManager; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; import javax.swing.plaf.FontUIResource;
// // FontChooser by Noah w. // public class NwFontChooserS extends JDialog {
String[] styleList = new String[] { "Plain", "Bold", "Italic" }; String[] sizeList = new String[] { "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "22", "24", "27", "30", "34", "39", "45", "51", "60" }; NwList StyleList; NwList FontList; NwList SizeList; static JLabel Sample = new JLabel(); boolean ob = false; private NwFontChooserS(Frame parent, boolean modal, Font font) { super(parent, modal); initAll(); setTitle("Font Choosr"); if (font == null) font = Sample.getFont(); FontList.setSelectedItem(font.getName()); SizeList.setSelectedItem(font.getSize() + ""); StyleList.setSelectedItem(styleList[font.getStyle()]); } public static Font showDialog(Frame parent, String s, Font font) { NwFontChooserS fd = new NwFontChooserS(parent, true, font); if (s != null) fd.setTitle(s); fd.setVisible(true); Font fo = null; if (fd.ob) fo = Sample.getFont(); fd.dispose(); return (fo); } private void initAll() { getContentPane().setLayout(null); setBounds(50, 50, 450, 450); addLists(); addButtons(); Sample.setBounds(10, 320, 415, 25); Sample.setForeground(Color.black); getContentPane().add(Sample); addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { setVisible(false); } }); } private void addLists() { FontList = new NwList( GraphicsEnvironment .getLocalGraphicsEnvironment() .getAvailableFontFamilyNames()); StyleList = new NwList(styleList); SizeList = new NwList(sizeList); FontList.setBounds(10, 10, 260, 295); StyleList.setBounds(280, 10, 80, 295); SizeList.setBounds(370, 10, 40, 295); getContentPane().add(FontList); getContentPane().add(StyleList); getContentPane().add(SizeList); } private void addButtons() { JButton ok = new JButton("OK"); ok.setMargin(new Insets(0, 0, 0, 0)); JButton ca = new JButton("Cancel"); ca.setMargin(new Insets(0, 0, 0, 0)); ok.setBounds(260, 350, 70, 20); ok.setFont(new Font(" ", 1, 11)); ca.setBounds(340, 350, 70, 20); ca.setFont(new Font(" ", 1, 12)); getContentPane().add(ok); getContentPane().add(ca); ok.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { setVisible(false); ob = true; } }); ca.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { setVisible(false); ob = false; } }); } private void showSample() { int g = 0; try { g = Integer.parseInt(SizeList.getSelectedValue()); } catch (NumberFormatException nfe) { } String st = StyleList.getSelectedValue(); int s = Font.PLAIN; if (st.equalsIgnoreCase("Bold")) s = Font.BOLD; if (st.equalsIgnoreCase("Italic")) s = Font.ITALIC; Sample.setFont(new Font(FontList.getSelectedValue(), s, g)); Sample.setText("The quick brown fox jumped over the lazy dog."); } ////////////////////////////////////////////////////////////////////// private class NwList extends JPanel { JList jl; JScrollPane sp; JLabel jt; String si = " "; public NwList(String[] values) { setLayout(null); jl = new JList(values); sp = new JScrollPane(jl); jt = new JLabel(); jt.setBackground(Color.white); jt.setForeground(Color.black); jt.setOpaque(true); jt.setBorder(new JTextField().getBorder()); jt.setFont(getFont()); jl.setBounds(0, 0, 100, 1000); jl.setBackground(Color.white); jl.addListSelectionListener(new ListSelectionListener() { public void valueChanged(ListSelectionEvent e) { jt.setText((String) jl.getSelectedValue()); si = (String) jl.getSelectedValue(); showSample(); } }); add(sp); add(jt); } public String getSelectedValue() { return (si); } public void setSelectedItem(String s) { jl.setSelectedValue(s, true); } public void setBounds(int x, int y, int w, int h) { super.setBounds(x, y, w, h); sp.setBounds(0, y + 12, w, h - 23); sp.revalidate(); jt.setBounds(0, 0, w, 20); } } static public String fontString(Font font) { String fs = font.getFamily(); if( !font.isPlain() ) { fs += "-"; if( font.isBold()) { fs += "BOLD"; } if( font.isItalic()) { fs += "ITALIC"; } } fs += "-" + font.getSize(); return(fs); } static public void setDefaultFont(Font f ) { FontUIResource fui = new FontUIResource(f); Enumeration<Object> keys = UIManager.getDefaults().keys(); while (keys.hasMoreElements()) { Object key = keys.nextElement(); Object value = UIManager.get(key); if (value instanceof FontUIResource) UIManager.put(key, fui); } } public static void main(String args[]) { Font font = null; font = NwFontChooserS.showDialog(null, null, null); System.out.println(fontString(font)); }
}</source>
Font Chooser extends javax.swing.JDialog
<source lang="java">
/* Atlantida is an open source (GPL) multilingual dictionary written in Java. It can translate words from one language to another and pronounce them. Copyright (C) 2006 Sergey S. http://atla.revdanica.ru/ This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- /
/**
- FontChooser
- @author Janos Szatmary, Sergei S.
- @version 003
- /
/*
* http://forum.java.sun.ru/thread.jsp?forum=57&thread=124810 * For those who asked where"s the constructor, have in mind that the constructor provided * is private. As the author of the code says, the use of this class is as * follows (supposing we are in a Frame class): * FontChooser.showDialog(this,"FontChooser",new Font("Dialog", 0, 12)); * This file originally writter by Janos Szatmary, then modifyed by Sergei S. for * Atlantida Multilingual Dictionary http://atla.sf.net
- /
import java.awt.*; import java.awt.event.*; import java.util.*; import javax.swing.*;
public class FontChooser extends javax.swing.JDialog {
String[] styleList = new String[] { "Plain","Bold","Italic"}; String[] sizeList = new String[] { "2","4","6","8","10","12","14","16","18","20","22","24","30","36","48","72"}; String currentFont = null; int currentStyle = -1; int currentSize = -1; public boolean ok = false; /* ------------------------------------------------------------- */ private FontChooser(java.awt.Frame parent,boolean modal) { super (parent,modal); initComponents(); setListValues(jFontList,GraphicsEnvironment.getLocalGraphicsEnvironment().getAvailableFontFamilyNames()); setListValues(jStyleList,styleList); setListValues(jSizeList,sizeList); setCurrentFont(jSample.getFont()); pack(); } private FontChooser(java.awt.Frame parent,boolean modal,Font font) { this(parent,modal); setCurrentFont(font); } /* ------------------------------------------------------------- */ private void setListValues(JList list,String[] values) { if(list.getModel() instanceof DefaultListModel) { DefaultListModel model = (DefaultListModel) list.getModel(); model.removeAllElements(); for( String value : values ) { model.addElement( value ); } } } /* ------------------------------------------------------------- */ private void setSampleFont() { if(currentFont != null && currentStyle >= 0 && currentSize > 0) { jSample.setFont(new Font (currentFont,currentStyle,currentSize)); } } private String styleToString(int style) { String str = ""; if((style&Font.BOLD) == Font.BOLD) { if(str.length() > 0) { str += ","; } str += "Bold"; } if((style&Font.ITALIC) == Font.ITALIC) { if(str.length() > 0) { str += ","; } str += "Italic"; } if( str.length() <= 0 ) { str = "Plain"; } return str; } /* ------------------------------------------------------------- */ public Font getCurrentFont() { return jSample.getFont(); } /* ------------------------------------------------------------- */ public void setCurrentFont(Font font) { if(font==null) { font = jSample.getFont(); } jFont.setText(font.getName()); jFontActionPerformed(null); jStyle.setText(styleToString(font.getStyle())); jStyleActionPerformed(null); jSize.setText(Integer.toString(font.getSize())); jSizeActionPerformed(null); }
// Create font chooser dialog. // If user selected a font (i.e. clicked OK button) - return the font that user has selected. // If user didn"t click OK button - return "null". public static Font showDialog( Frame parent, String title, Font font) { FontChooser dialog = new FontChooser(parent,true,font); Point p1 = parent.getLocation(); Dimension d1 = parent.getSize(); Dimension d2 = dialog.getSize(); int x = p1.x+(d1.width-d2.width)/2; int y = p1.y+(d1.height-d2.height)/2; if(x < 0) { x = 0; } if(y < 0) { y = 0; } if(title!=null) { dialog.setTitle(title); } dialog.setLocation(x,y); dialog.setVisible(true); Font newfont = null; if(dialog.ok) { newfont = dialog.getCurrentFont(); } dialog.dispose(); return newfont; } /** This method is called from within the constructor to * initialize the form. * WARNING: Do NOT modify this code. The content of this method is * always regenerated by the FormEditor. */ private void initComponents() { jPanel3 = new javax.swing.JPanel(); jFont = new javax.swing.JTextField(); jScrollPane1 = new javax.swing.JScrollPane(); jFontList = new javax.swing.JList(); jPanel4 = new javax.swing.JPanel(); jStyle = new javax.swing.JTextField(); jScrollPane2 = new javax.swing.JScrollPane(); jStyleList = new javax.swing.JList(); jPanel5 = new javax.swing.JPanel(); jSize = new javax.swing.JTextField(); jScrollPane3 = new javax.swing.JScrollPane(); jSizeList = new javax.swing.JList(); jPanel1 = new javax.swing.JPanel(); jScrollPane4 = new javax.swing.JScrollPane(); jSample = new javax.swing.JTextArea(); jButtons = new javax.swing.JPanel(); jOk = new javax.swing.JButton(); jCancel = new javax.swing.JButton(); jLabel6 = new javax.swing.JLabel(); getContentPane().setLayout(new java.awt.GridBagLayout()); java.awt.GridBagConstraints gridBagConstraints1; setTitle("Font Chooser"); addWindowListener(new java.awt.event.WindowAdapter() { public void windowClosing(java.awt.event.WindowEvent evt) { closeDialog(evt); } } ); jPanel3.setLayout(new java.awt.GridBagLayout()); java.awt.GridBagConstraints gridBagConstraints2; jPanel3.setBorder(new javax.swing.border.TitledBorder(new javax.swing.border.EtchedBorder(), " Font ")); jFont.setColumns(24); jFont.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { jFontActionPerformed(evt); } } ); gridBagConstraints2 = new java.awt.GridBagConstraints(); gridBagConstraints2.gridwidth = 0; gridBagConstraints2.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints2.insets = new java.awt.Insets(0, 3, 0, 3); gridBagConstraints2.anchor = java.awt.GridBagConstraints.NORTHWEST; gridBagConstraints2.weightx = 1.0; jPanel3.add(jFont, gridBagConstraints2);
jFontList.setModel(new DefaultListModel()); jFontList.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION); jFontList.addListSelectionListener(new javax.swing.event.ListSelectionListener() { public void valueChanged(javax.swing.event.ListSelectionEvent evt) { jFontListValueChanged(evt); } } ); jScrollPane1.setViewportView(jFontList); gridBagConstraints2 = new java.awt.GridBagConstraints(); gridBagConstraints2.fill = java.awt.GridBagConstraints.BOTH; gridBagConstraints2.insets = new java.awt.Insets(3, 3, 3, 3); gridBagConstraints2.anchor = java.awt.GridBagConstraints.NORTHWEST; gridBagConstraints2.weightx = 1.0; gridBagConstraints2.weighty = 1.0; jPanel3.add(jScrollPane1, gridBagConstraints2);
gridBagConstraints1 = new java.awt.GridBagConstraints(); gridBagConstraints1.fill = java.awt.GridBagConstraints.BOTH; gridBagConstraints1.insets = new java.awt.Insets(5, 5, 0, 0); gridBagConstraints1.weightx = 0.5; gridBagConstraints1.weighty = 1.0; getContentPane().add(jPanel3, gridBagConstraints1);
jPanel4.setLayout(new java.awt.GridBagLayout()); java.awt.GridBagConstraints gridBagConstraints3; jPanel4.setBorder(new javax.swing.border.TitledBorder(new javax.swing.border.EtchedBorder(), " Style ")); jStyle.setColumns(18); jStyle.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { jStyleActionPerformed(evt); } } ); gridBagConstraints3 = new java.awt.GridBagConstraints(); gridBagConstraints3.gridwidth = 0; gridBagConstraints3.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints3.insets = new java.awt.Insets(0, 3, 0, 3); gridBagConstraints3.anchor = java.awt.GridBagConstraints.NORTHWEST; gridBagConstraints3.weightx = 1.0; jPanel4.add(jStyle, gridBagConstraints3); jStyleList.setModel(new DefaultListModel()); jStyleList.setVisibleRowCount(4); jStyleList.addListSelectionListener(new javax.swing.event.ListSelectionListener() { public void valueChanged(javax.swing.event.ListSelectionEvent evt) { jStyleListValueChanged(evt); } } ); jScrollPane2.setViewportView(jStyleList); gridBagConstraints3 = new java.awt.GridBagConstraints(); gridBagConstraints3.fill = java.awt.GridBagConstraints.BOTH; gridBagConstraints3.insets = new java.awt.Insets(3, 3, 3, 3); gridBagConstraints3.anchor = java.awt.GridBagConstraints.NORTHWEST; gridBagConstraints3.weightx = 0.5; gridBagConstraints3.weighty = 1.0; jPanel4.add(jScrollPane2, gridBagConstraints3); gridBagConstraints1 = new java.awt.GridBagConstraints(); gridBagConstraints1.fill = java.awt.GridBagConstraints.BOTH; gridBagConstraints1.insets = new java.awt.Insets(5, 5, 0, 0); gridBagConstraints1.weightx = 0.375; gridBagConstraints1.weighty = 1.0; getContentPane().add(jPanel4, gridBagConstraints1); jPanel5.setLayout(new java.awt.GridBagLayout()); java.awt.GridBagConstraints gridBagConstraints4; jPanel5.setBorder(new javax.swing.border.TitledBorder(new javax.swing.border.EtchedBorder(), " Size ")); jSize.setColumns(6); jSize.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { jSizeActionPerformed(evt); } } ); gridBagConstraints4 = new java.awt.GridBagConstraints(); gridBagConstraints4.gridwidth = 0; gridBagConstraints4.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints4.insets = new java.awt.Insets(0, 3, 0, 3); gridBagConstraints4.anchor = java.awt.GridBagConstraints.NORTHWEST; gridBagConstraints4.weightx = 1.0; jPanel5.add(jSize, gridBagConstraints4); jSizeList.setModel(new DefaultListModel()); jSizeList.setVisibleRowCount(4); jSizeList.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION); jSizeList.addListSelectionListener(new javax.swing.event.ListSelectionListener() { public void valueChanged(javax.swing.event.ListSelectionEvent evt) { jSizeListValueChanged(evt); } } ); jScrollPane3.setViewportView(jSizeList); gridBagConstraints4 = new java.awt.GridBagConstraints(); gridBagConstraints4.fill = java.awt.GridBagConstraints.BOTH; gridBagConstraints4.insets = new java.awt.Insets(3, 3, 3, 3); gridBagConstraints4.anchor = java.awt.GridBagConstraints.NORTHWEST; gridBagConstraints4.weightx = 0.25; gridBagConstraints4.weighty = 1.0; jPanel5.add(jScrollPane3, gridBagConstraints4); gridBagConstraints1 = new java.awt.GridBagConstraints(); gridBagConstraints1.gridwidth = 0; gridBagConstraints1.fill = java.awt.GridBagConstraints.BOTH; gridBagConstraints1.insets = new java.awt.Insets(5, 5, 0, 5); gridBagConstraints1.weightx = 0.125; gridBagConstraints1.weighty = 1.0; getContentPane().add(jPanel5, gridBagConstraints1); jPanel1.setLayout(new java.awt.GridBagLayout()); java.awt.GridBagConstraints gridBagConstraints5; jPanel1.setBorder(new javax.swing.border.TitledBorder(new javax.swing.border.EtchedBorder(), " Sample ")); jSample.setWrapStyleWord(true); jSample.setLineWrap(true); jSample.setColumns(20); jSample.setRows(3); jSample.setText("The quick brown fox jumped over the lazy dog."); jScrollPane4.setViewportView(jSample); gridBagConstraints5 = new java.awt.GridBagConstraints(); gridBagConstraints5.fill = java.awt.GridBagConstraints.BOTH; gridBagConstraints5.insets = new java.awt.Insets(0, 3, 3, 3); gridBagConstraints5.weightx = 1.0; gridBagConstraints5.weighty = 1.0; jPanel1.add(jScrollPane4, gridBagConstraints5); gridBagConstraints1 = new java.awt.GridBagConstraints(); gridBagConstraints1.gridwidth = 0; gridBagConstraints1.fill = java.awt.GridBagConstraints.BOTH; gridBagConstraints1.insets = new java.awt.Insets(0, 5, 0, 5); gridBagConstraints1.anchor = java.awt.GridBagConstraints.NORTHWEST; gridBagConstraints1.weightx = 1.0; getContentPane().add(jPanel1, gridBagConstraints1); jButtons.setLayout(new java.awt.GridBagLayout()); java.awt.GridBagConstraints gridBagConstraints6; jOk.setMnemonic(KeyEvent.VK_O); jOk.setText("OK"); jOk.setRequestFocusEnabled(false); jOk.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { jOkActionPerformed(evt); } } ); gridBagConstraints6 = new java.awt.GridBagConstraints(); gridBagConstraints6.insets = new java.awt.Insets(5, 5, 5, 0); gridBagConstraints6.anchor = java.awt.GridBagConstraints.WEST; jButtons.add(jOk, gridBagConstraints6);
jCancel.setMnemonic(KeyEvent.VK_C); jCancel.setText("Cancel"); jCancel.setRequestFocusEnabled(false); jCancel.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { jCancelActionPerformed(evt); } } ); gridBagConstraints6 = new java.awt.GridBagConstraints(); gridBagConstraints6.gridwidth = 0; gridBagConstraints6.insets = new java.awt.Insets(5, 5, 5, 5); gridBagConstraints6.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints6.weightx = 1.0; jButtons.add(jCancel, gridBagConstraints6); gridBagConstraints6 = new java.awt.GridBagConstraints(); gridBagConstraints6.weightx = 1.0; jButtons.add(jLabel6, gridBagConstraints6); gridBagConstraints1 = new java.awt.GridBagConstraints(); gridBagConstraints1.gridwidth = 0; gridBagConstraints1.anchor = java.awt.GridBagConstraints.SOUTHWEST; gridBagConstraints1.weightx = 1.0; getContentPane().add(jButtons, gridBagConstraints1); } private void jCancelActionPerformed(java.awt.event.ActionEvent evt) { // Add your handling code here: setVisible(false); } private void jOkActionPerformed (java.awt.event.ActionEvent evt) { // Add your handling code here: ok = true; setVisible(false); } private void jSizeActionPerformed (java.awt.event.ActionEvent evt) { // Add your handling code here: int size = Integer.parseInt(jSize.getText()); if(size > 0) { currentSize = size; setSampleFont(); } } private void jStyleActionPerformed (java.awt.event.ActionEvent evt) { // Add your handling code here: StringTokenizer st = new StringTokenizer(jStyle.getText(),","); int style = 0; while(st.hasMoreTokens()) { String str = st.nextToken().trim(); if(str.equalsIgnoreCase("Plain")) { style |= Font.PLAIN; } else if(str.equalsIgnoreCase("Bold")) { style |= Font.BOLD; } else if(str.equalsIgnoreCase("Italic")) { style |= Font.ITALIC; } } if(style >= 0) { currentStyle = style; setSampleFont(); } } private void jFontActionPerformed (java.awt.event.ActionEvent evt) { // Add your handling code here: DefaultListModel model = (DefaultListModel) jFontList.getModel(); if(model.indexOf(jFont.getText()) >= 0) { currentFont = jFont.getText(); setSampleFont(); } } private void jStyleListValueChanged(javax.swing.event.ListSelectionEvent evt) { // Add your handling code here: String str = ""; Object[] values = jStyleList.getSelectedValues(); if(values.length > 0) { int j; for(j=0; j < values.length; j++) { String s = (String) values[j]; if(s.equalsIgnoreCase("Plain")) { str = "Plain"; break; } if(str.length() > 0) { str += ","; } str += (String) values[j]; } } else { str = styleToString(currentStyle); } jStyle.setText(str); jStyleActionPerformed(null); } private void jSizeListValueChanged(javax.swing.event.ListSelectionEvent evt) { // Add your handling code here: String str = (String) jSizeList.getSelectedValue(); if(str==null || str.length() <= 0) { str = Integer.toString(currentSize); } jSize.setText(str); jSizeActionPerformed(null); } private void jFontListValueChanged(javax.swing.event.ListSelectionEvent evt) { // Add your handling code here: String str = (String) jFontList.getSelectedValue(); if(str==null || str.length() <= 0) { str = currentFont; } jFont.setText(str); jFontActionPerformed(null); } /** Closes the dialog */ private void closeDialog(java.awt.event.WindowEvent evt) { setVisible (false); } // Variables declaration - do not modify private javax.swing.JPanel jPanel3; private javax.swing.JTextField jFont; private javax.swing.JScrollPane jScrollPane1; private javax.swing.JList jFontList; private javax.swing.JPanel jPanel4; private javax.swing.JTextField jStyle; private javax.swing.JScrollPane jScrollPane2; private javax.swing.JList jStyleList; private javax.swing.JPanel jPanel5; private javax.swing.JTextField jSize; private javax.swing.JScrollPane jScrollPane3; private javax.swing.JList jSizeList; private javax.swing.JPanel jPanel1; private javax.swing.JScrollPane jScrollPane4; private javax.swing.JTextArea jSample; private javax.swing.JPanel jButtons; private javax.swing.JButton jOk; private javax.swing.JButton jCancel; private javax.swing.JLabel jLabel6; // End of variables declaration
}</source>
JDialog is specify that pressing the Escape key cancels the dialog.
<source lang="java">
import java.awt.Frame; import java.awt.event.ActionEvent; import javax.swing.AbstractAction; import javax.swing.Action; import javax.swing.InputMap; import javax.swing.JButton; import javax.swing.JComponent; import javax.swing.JDialog; import javax.swing.JRootPane; import javax.swing.KeyStroke; class EscapeDialog extends JDialog {
public EscapeDialog() { super((Frame) null, false); } protected JRootPane createRootPane() { JRootPane rootPane = new JRootPane(); KeyStroke stroke = KeyStroke.getKeyStroke("ESCAPE"); Action actionListener = new AbstractAction() { public void actionPerformed(ActionEvent actionEvent) { System.out.println("about to disappear"); setVisible(false); } }; InputMap inputMap = rootPane.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW); inputMap.put(stroke, "ESCAPE"); rootPane.getActionMap().put("ESCAPE", actionListener); return rootPane; }
} public class EscapeDialogTest {
public static void main(String[] a) { EscapeDialog dlg = new EscapeDialog(); dlg.add(new JButton("asdf")); dlg.setSize(300, 100); dlg.setVisible(true); }
}</source>
Positions the specified dialog at a position relative to its parent.
<source lang="java">
/*
* JCommon : a free general purpose class library for the Java(tm) platform * * * (C) Copyright 2000-2005, by Object Refinery Limited and Contributors. * * Project Info: http://www.jfree.org/jcommon/index.html * * This library is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or * (at your option) any later version. * * This library is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public * License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, * USA. * * [Java is a trademark or registered trademark of Sun Microsystems, Inc. * in the United States and other countries.] * * ---------------------- * RefineryUtilities.java * ---------------------- * (C) Copyright 2000-2005, by Object Refinery Limited. * * Original Author: David Gilbert (for Object Refinery Limited); * Contributor(s): Jon Iles; * * $Id: RefineryUtilities.java,v 1.11 2007/11/02 17:50:36 taqua Exp $ * * Changes (from 26-Oct-2001) * -------------------------- * 26-Oct-2001 : Changed package to com.jrefinery.ui.*; * 26-Nov-2001 : Changed name to SwingRefinery.java to make it obvious that this is not part of * the Java APIs (DG); * 10-Dec-2001 : Changed name (again) to JRefineryUtilities.java (DG); * 28-Feb-2002 : Moved system properties classes into com.jrefinery.ui.about (DG); * 19-Apr-2002 : Renamed JRefineryUtilities-->RefineryUtilities. Added drawRotatedString() * method (DG); * 21-May-2002 : Changed frame positioning methods to accept Window parameters, as suggested by * Laurence Vanhelsuwe (DG); * 27-May-2002 : Added getPointInRectangle method (DG); * 26-Jun-2002 : Removed unnecessary imports (DG); * 12-Jul-2002 : Added workaround for rotated text (JI); * 14-Oct-2002 : Fixed errors reported by Checkstyle (DG); * 08-May-2003 : Added a new drawRotatedString() method (DG); * 09-May-2003 : Added a drawRotatedShape() method (DG); * 10-Jun-2003 : Updated aligned and rotated string methods (DG); * 29-Oct-2003 : Added workaround for font alignment in PDF output (DG); * 07-Nov-2003 : Added rotateShape() method (DG); * 16-Mar-2004 : Moved rotateShape() method to ShapeUtils.java (DG); * 07-Apr-2004 : Modified text bounds calculation with TextUtilities.getTextBounds() (DG); * 21-May-2004 : Fixed bug 951870 - precision in drawAlignedString() method (DG); * 30-Sep-2004 : Deprecated and moved a number of methods to the TextUtilities class (DG); * 04-Oct-2004 : Renamed ShapeUtils --> ShapeUtilities (DG); * 11-Jan-2005 : Removed deprecated code in preparation for the 1.0.0 release (DG); * */
import java.awt.Container; import java.awt.Dialog; import java.awt.Dimension; import java.awt.GraphicsEnvironment; import java.awt.Rectangle; import java.awt.Toolkit; import java.lang.reflect.Method; /**
* * * @author David Gilbert */
public class Main{
/** * Positions the specified dialog at a position relative to its parent. * * @param dialog the dialog to be positioned. * @param horizontalPercent the relative location. * @param verticalPercent the relative location. */ public static void positionDialogRelativeToParent(final Dialog dialog, final double horizontalPercent, final double verticalPercent) { final Dimension d = dialog.getSize(); final Container parent = dialog.getParent(); final Dimension p = parent.getSize(); final int baseX = parent.getX() - d.width; final int baseY = parent.getY() - d.height; final int w = d.width + p.width; final int h = d.height + p.height; int x = baseX + (int) (horizontalPercent * w); int y = baseY + (int) (verticalPercent * h); // make sure the dialog fits completely on the screen... final Rectangle s = getMaximumWindowBounds(); x = Math.min(x, (s.width - d.width)); x = Math.max(x, 0); y = Math.min(y, (s.height - d.height)); y = Math.max(y, 0); dialog.setBounds(x + s.x, y + s.y, d.width, d.height); } /** * Computes the maximum bounds of the current screen device. If this method is called on JDK 1.4, Xinerama-aware * results are returned. (See Sun-Bug-ID 4463949 for details). * * @return the maximum bounds of the current screen. */ public static Rectangle getMaximumWindowBounds () { final GraphicsEnvironment localGraphicsEnvironment = GraphicsEnvironment.getLocalGraphicsEnvironment(); try { final Method method = GraphicsEnvironment.class.getMethod("getMaximumWindowBounds", (Class[]) null); return (Rectangle) method.invoke(localGraphicsEnvironment, (Object[]) null); } catch(Exception e) { // ignore ... will fail if this is not a JDK 1.4 .. } final Dimension s = Toolkit.getDefaultToolkit().getScreenSize(); return new Rectangle (0, 0, s.width, s.height); }
}</source>
Set Default Close Operation for Dialog
<source lang="java">
import java.awt.BorderLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JButton; import javax.swing.JDialog; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.WindowConstants; public class Test extends JFrame {
JDialog d = new JDialog(this, "Dialog title", true); public Test() { setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); d.getContentPane().add(new JLabel("Click the OK button"), BorderLayout.CENTER); JButton closeIt = new JButton("OK"); closeIt.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { System.out.println("Closing dialog"); d.dispose(); } }); d.getContentPane().add(closeIt, BorderLayout.SOUTH); d.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); d.pack(); getContentPane().add(new JLabel("Placeholder label")); pack(); setSize(200, 200); setVisible(true); d.setVisible(true); } public static void main(String[] args) { new Test(); }
}</source>
The base class for standard dialogs.
<source lang="java">
/*
* JCommon : a free general purpose class library for the Java(tm) platform * * * (C) Copyright 2000-2008, by Object Refinery Limited and Contributors. * * Project Info: http://www.jfree.org/jcommon/index.html * * This library is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or * (at your option) any later version. * * This library is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public * License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, * USA. * * [Java is a trademark or registered trademark of Sun Microsystems, Inc. * in the United States and other countries.] * * ------------------- * StandardDialog.java * ------------------- * (C) Copyright 2000-2008, by Object Refinery Limited. * * Original Author: David Gilbert (for Object Refinery Limited); * Contributor(s): Arnaud Lelievre; * * $Id: StandardDialog.java,v 1.7 2008/12/18 09:57:32 mungady Exp $ * * Changes (from 26-Oct-2001) * -------------------------- * 26-Oct-2001 : Changed package to com.jrefinery.ui.*; * 08-Sep-2003 : Added internationalization via use of properties * resourceBundle (RFE 690236) (AL); * 18-Dec-2008 : Use ResourceBundleWrapper - see JFreeChart patch 1607918 by * Jess Thrysoee (DG); * */
import java.awt.BorderLayout; import java.awt.Dialog; import java.awt.Frame; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.BorderFactory; import javax.swing.JButton; import javax.swing.JDialog; import javax.swing.JPanel;
/**
* The base class for standard dialogs. * * @author David Gilbert */
public class StandardDialog extends JDialog implements ActionListener {
/** Flag that indicates whether or not the dialog was cancelled. */ private boolean cancelled;
/** * Standard constructor - builds a dialog... * * @param owner the owner. * @param title the title. * @param modal modal? */ public StandardDialog(final Frame owner, final String title, final boolean modal) { super(owner, title, modal); this.cancelled = false; } /** * Standard constructor - builds a dialog... * * @param owner the owner. * @param title the title. * @param modal modal? */ public StandardDialog(final Dialog owner, final String title, final boolean modal) { super(owner, title, modal); this.cancelled = false; } /** * Returns a flag that indicates whether or not the dialog has been * cancelled. * * @return boolean. */ public boolean isCancelled() { return this.cancelled; } /** * Handles clicks on the standard buttons. * * @param event the event. */ public void actionPerformed(final ActionEvent event) { final String command = event.getActionCommand(); if (command.equals("helpButton")) { // display help information } else if (command.equals("okButton")) { this.cancelled = false; setVisible(false); } else if (command.equals("cancelButton")) { this.cancelled = true; setVisible(false); } } /** * Builds and returns the user interface for the dialog. This method is * shared among the constructors. * * @return the button panel. */ protected JPanel createButtonPanel() { final L1R2ButtonPanel buttons = new L1R2ButtonPanel( "Help", "OK", "Cancel"); final JButton helpButton = buttons.getLeftButton(); helpButton.setActionCommand("helpButton"); helpButton.addActionListener(this); final JButton okButton = buttons.getRightButton1(); okButton.setActionCommand("okButton"); okButton.addActionListener(this); final JButton cancelButton = buttons.getRightButton2(); cancelButton.setActionCommand("cancelButton"); cancelButton.addActionListener(this); buttons.setBorder(BorderFactory.createEmptyBorder(4, 0, 0, 0)); return buttons; }
} /*
* JCommon : a free general purpose class library for the Java(tm) platform * * * (C) Copyright 2000-2005, by Object Refinery Limited and Contributors. * * Project Info: http://www.jfree.org/jcommon/index.html * * This library is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or * (at your option) any later version. * * This library is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public * License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, * USA. * * [Java is a trademark or registered trademark of Sun Microsystems, Inc. * in the United States and other countries.] * * -------------------- * L1R2ButtonPanel.java * -------------------- * (C) Copyright 2000-2004, by Object Refinery Limited. * * Original Author: David Gilbert (for Object Refinery Limited); * Contributor(s): -; * * $Id: L1R2ButtonPanel.java,v 1.4 2007/11/02 17:50:36 taqua Exp $ * * Changes (from 26-Oct-2001) * -------------------------- * 26-Oct-2001 : Changed package to com.jrefinery.ui.*; * 26-Jun-2002 : Removed unnecessary import (DG); * 14-Oct-2002 : Fixed errors reported by Checkstyle (DG); * */
/**
* A "ready-made" panel that has one button on the left and two buttons on the right - nested * panels and layout managers take care of resizing. * * @author David Gilbert */
class L1R2ButtonPanel extends JPanel {
/** The left button. */ private JButton left; /** The first button on the right of the panel. */ private JButton right1; /** The second button on the right of the panel. */ private JButton right2; /** * Standard constructor - creates a three button panel with the specified button labels. * * @param label1 the label for button 1. * @param label2 the label for button 2. * @param label3 the label for button 3. */ public L1R2ButtonPanel(final String label1, final String label2, final String label3) { setLayout(new BorderLayout()); // create the pieces... this.left = new JButton(label1); final JPanel rightButtonPanel = new JPanel(new GridLayout(1, 2)); this.right1 = new JButton(label2); this.right2 = new JButton(label3); rightButtonPanel.add(this.right1); rightButtonPanel.add(this.right2); // ...and put them together add(this.left, BorderLayout.WEST); add(rightButtonPanel, BorderLayout.EAST); } /** * Returns a reference to button 1, allowing the caller to set labels, action-listeners etc. * * @return the left button. */ public JButton getLeftButton() { return this.left; } /** * Returns a reference to button 2, allowing the caller to set labels, action-listeners etc. * * @return the right button 1. */ public JButton getRightButton1() { return this.right1; } /** * Returns a reference to button 3, allowing the caller to set labels, action-listeners etc. * * @return the right button 2. */ public JButton getRightButton2() { return this.right2; }
}</source>