Java tutorial
/* 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; } }