Mega Code Archive

 
Categories / Java / JDK
 

This program demonstrates the effect of the various rendering hints

/*  This program is a part of the companion code for Core Java 8th ed.  (http://horstmann.com/corejava)  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 3 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, see <http://www.gnu.org/licenses/>.  */ import java.awt.BorderLayout; import java.awt.EventQueue; import java.awt.Font; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.Image; import java.awt.Insets; import java.awt.RenderingHints; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.geom.Ellipse2D; import java.awt.geom.Line2D; import java.awt.geom.Rectangle2D; import java.io.File; import java.io.IOException; import javax.imageio.ImageIO; import javax.swing.ButtonGroup; import javax.swing.JComponent; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JRadioButton; /**  * This program demonstrates the effect of the various rendering hints.  *   * @version 1.10 2007-08-16  * @author Cay Horstmann  */ public class RenderQualityTest {   public static void main(String[] args) {     EventQueue.invokeLater(new Runnable() {       public void run() {         JFrame frame = new RenderQualityTestFrame();         frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);         frame.setVisible(true);       }     });   } } /**  * This frame contains buttons to set rendering hints and an image that is drawn  * with the selected hints.  */ class RenderQualityTestFrame extends JFrame {   public RenderQualityTestFrame() {     setTitle("RenderQualityTest");     setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT);     buttonBox = new JPanel();     buttonBox.setLayout(new GridBagLayout());     hints = new RenderingHints(null);     makeButtons("KEY_ANTIALIASING", "VALUE_ANTIALIAS_OFF", "VALUE_ANTIALIAS_ON");     makeButtons("KEY_TEXT_ANTIALIASING", "VALUE_TEXT_ANTIALIAS_OFF", "VALUE_TEXT_ANTIALIAS_ON");     makeButtons("KEY_FRACTIONALMETRICS", "VALUE_FRACTIONALMETRICS_OFF",         "VALUE_FRACTIONALMETRICS_ON");     makeButtons("KEY_RENDERING", "VALUE_RENDER_SPEED", "VALUE_RENDER_QUALITY");     makeButtons("KEY_STROKE_CONTROL", "VALUE_STROKE_PURE", "VALUE_STROKE_NORMALIZE");     canvas = new RenderQualityComponent();     canvas.setRenderingHints(hints);     add(canvas, BorderLayout.CENTER);     add(buttonBox, BorderLayout.NORTH);   }   /**    * Makes a set of buttons for a rendering hint key and values    *     * @param key    *          the key name    * @param value1    *          the name of the first value for the key    * @param value2    *          the name of the second value for the key    */   void makeButtons(String key, String value1, String value2) {     try {       final RenderingHints.Key k = (RenderingHints.Key) RenderingHints.class.getField(key)           .get(null);       final Object v1 = RenderingHints.class.getField(value1).get(null);       final Object v2 = RenderingHints.class.getField(value2).get(null);       JLabel label = new JLabel(key);       buttonBox.add(label, new GBC(0, r).setAnchor(GBC.WEST));       ButtonGroup group = new ButtonGroup();       JRadioButton b1 = new JRadioButton(value1, true);       buttonBox.add(b1, new GBC(1, r).setAnchor(GBC.WEST));       group.add(b1);       b1.addActionListener(new ActionListener() {         public void actionPerformed(ActionEvent event) {           hints.put(k, v1);           canvas.setRenderingHints(hints);         }       });       JRadioButton b2 = new JRadioButton(value2, false);       buttonBox.add(b2, new GBC(2, r).setAnchor(GBC.WEST));       group.add(b2);       b2.addActionListener(new ActionListener() {         public void actionPerformed(ActionEvent event) {           hints.put(k, v2);           canvas.setRenderingHints(hints);         }       });       hints.put(k, v1);       r++;     } catch (Exception e) {       e.printStackTrace();     }   }   private RenderQualityComponent canvas;   private JPanel buttonBox;   private RenderingHints hints;   private int r;   private static final int DEFAULT_WIDTH = 750;   private static final int DEFAULT_HEIGHT = 300; } /**  * This component produces a drawing that shows the effect of rendering hints.  */ class RenderQualityComponent extends JComponent {   public RenderQualityComponent() {     try {       image = ImageIO.read(new File("face.gif"));     } catch (IOException e) {       e.printStackTrace();     }   }   public void paintComponent(Graphics g) {     Graphics2D g2 = (Graphics2D) g;     g2.setRenderingHints(hints);     g2.draw(new Ellipse2D.Double(10, 10, 60, 50));     g2.setFont(new Font("Serif", Font.ITALIC, 40));     g2.drawString("Hello", 75, 50);     g2.draw(new Rectangle2D.Double(200, 10, 40, 40));     g2.draw(new Line2D.Double(201, 11, 239, 49));     g2.drawImage(image, 250, 10, 100, 100, null);   }   /**    * Sets the hints and repaints.    *     * @param h    *          the rendering hints    */   public void setRenderingHints(RenderingHints h) {     hints = h;     repaint();   }   private RenderingHints hints = new RenderingHints(null);   private Image image; } /*  * This program is a part of the companion code for Core Java 8th ed.  * (http://horstmann.com/corejava)  *   * 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 3 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, see <http://www.gnu.org/licenses/>.  */ /*  * GBC - A convenience class to tame the GridBagLayout  *   * Copyright (C) 2002 Cay S. Horstmann (http://horstmann.com)  *   * 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., 59 Temple  * Place, Suite 330, Boston, MA 02111-1307 USA  */ /**  * This class simplifies the use of the GridBagConstraints class.  */ class GBC extends GridBagConstraints {   /**    * Constructs a GBC with a given gridx and gridy position and all other grid    * bag constraint values set to the default.    *     * @param gridx    *          the gridx position    * @param gridy    *          the gridy position    */   public GBC(int gridx, int gridy) {     this.gridx = gridx;     this.gridy = gridy;   }   /**    * Constructs a GBC with given gridx, gridy, gridwidth, gridheight and all    * other grid bag constraint values set to the default.    *     * @param gridx    *          the gridx position    * @param gridy    *          the gridy position    * @param gridwidth    *          the cell span in x-direction    * @param gridheight    *          the cell span in y-direction    */   public GBC(int gridx, int gridy, int gridwidth, int gridheight) {     this.gridx = gridx;     this.gridy = gridy;     this.gridwidth = gridwidth;     this.gridheight = gridheight;   }   /**    * Sets the anchor.    *     * @param anchor    *          the anchor value    * @return this object for further modification    */   public GBC setAnchor(int anchor) {     this.anchor = anchor;     return this;   }   /**    * Sets the fill direction.    *     * @param fill    *          the fill direction    * @return this object for further modification    */   public GBC setFill(int fill) {     this.fill = fill;     return this;   }   /**    * Sets the cell weights.    *     * @param weightx    *          the cell weight in x-direction    * @param weighty    *          the cell weight in y-direction    * @return this object for further modification    */   public GBC setWeight(double weightx, double weighty) {     this.weightx = weightx;     this.weighty = weighty;     return this;   }   /**    * Sets the insets of this cell.    *     * @param distance    *          the spacing to use in all directions    * @return this object for further modification    */   public GBC setInsets(int distance) {     this.insets = new Insets(distance, distance, distance, distance);     return this;   }   /**    * Sets the insets of this cell.    *     * @param top    *          the spacing to use on top    * @param left    *          the spacing to use to the left    * @param bottom    *          the spacing to use on the bottom    * @param right    *          the spacing to use to the right    * @return this object for further modification    */   public GBC setInsets(int top, int left, int bottom, int right) {     this.insets = new Insets(top, left, bottom, right);     return this;   }   /**    * Sets the internal padding    *     * @param ipadx    *          the internal padding in x-direction    * @param ipady    *          the internal padding in y-direction    * @return this object for further modification    */   public GBC setIpad(int ipadx, int ipady) {     this.ipadx = ipadx;     this.ipady = ipady;     return this;   } }