Mega Code Archive

 
Categories / Java / 2D Graphics GUI
 

This program demonstrates different stroke types

/*    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.BasicStroke; import java.awt.BorderLayout; import java.awt.EventQueue; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.GridLayout; import java.awt.Point; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.event.MouseMotionAdapter; import java.awt.geom.GeneralPath; import java.awt.geom.Point2D; import java.awt.geom.Rectangle2D; import javax.swing.ButtonGroup; import javax.swing.JComponent; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JRadioButton; /**  * This program demonstrates different stroke types.  * @version 1.03 2007-08-16  * @author Cay Horstmann  */ public class StrokeTest {    public static void main(String[] args)    {       EventQueue.invokeLater(new Runnable()          {             public void run()             {                JFrame frame = new StrokeTestFrame();                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);                frame.setVisible(true);             }          });    } } /**  * This frame lets the user choose the cap, join, and line style, and shows the resulting stroke.  */ class StrokeTestFrame extends JFrame {    public StrokeTestFrame()    {       setTitle("StrokeTest");       setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT);       canvas = new StrokeComponent();       add(canvas, BorderLayout.CENTER);       buttonPanel = new JPanel();       buttonPanel.setLayout(new GridLayout(3, 3));       add(buttonPanel, BorderLayout.NORTH);       ButtonGroup group1 = new ButtonGroup();       makeCapButton("Butt Cap", BasicStroke.CAP_BUTT, group1);       makeCapButton("Round Cap", BasicStroke.CAP_ROUND, group1);       makeCapButton("Square Cap", BasicStroke.CAP_SQUARE, group1);       ButtonGroup group2 = new ButtonGroup();       makeJoinButton("Miter Join", BasicStroke.JOIN_MITER, group2);       makeJoinButton("Bevel Join", BasicStroke.JOIN_BEVEL, group2);       makeJoinButton("Round Join", BasicStroke.JOIN_ROUND, group2);       ButtonGroup group3 = new ButtonGroup();       makeDashButton("Solid Line", false, group3);       makeDashButton("Dashed Line", true, group3);    }    /**     * Makes a radio button to change the cap style.     * @param label the button label     * @param style the cap style     * @param group the radio button group     */    private void makeCapButton(String label, final int style, ButtonGroup group)    {       // select first button in group       boolean selected = group.getButtonCount() == 0;       JRadioButton button = new JRadioButton(label, selected);       buttonPanel.add(button);       group.add(button);       button.addActionListener(new ActionListener()          {             public void actionPerformed(ActionEvent event)             {                canvas.setCap(style);             }          });    }    /**     * Makes a radio button to change the join style.     * @param label the button label     * @param style the join style     * @param group the radio button group     */    private void makeJoinButton(String label, final int style, ButtonGroup group)    {       // select first button in group       boolean selected = group.getButtonCount() == 0;       JRadioButton button = new JRadioButton(label, selected);       buttonPanel.add(button);       group.add(button);       button.addActionListener(new ActionListener()          {             public void actionPerformed(ActionEvent event)             {                canvas.setJoin(style);             }          });    }    /**     * Makes a radio button to set solid or dashed lines     * @param label the button label     * @param style false for solid, true for dashed lines     * @param group the radio button group     */    private void makeDashButton(String label, final boolean style, ButtonGroup group)    {       // select first button in group       boolean selected = group.getButtonCount() == 0;       JRadioButton button = new JRadioButton(label, selected);       buttonPanel.add(button);       group.add(button);       button.addActionListener(new ActionListener()          {             public void actionPerformed(ActionEvent event)             {                canvas.setDash(style);             }          });    }    private StrokeComponent canvas;    private JPanel buttonPanel;    private static final int DEFAULT_WIDTH = 400;    private static final int DEFAULT_HEIGHT = 400; } /**  * This component draws two joined lines, using different stroke objects, and allows the user to drag  * the three points defining the lines.  */ class StrokeComponent extends JComponent {    public StrokeComponent()    {       addMouseListener(new MouseAdapter()          {             public void mousePressed(MouseEvent event)             {                Point p = event.getPoint();                for (int i = 0; i < points.length; i++)                {                   double x = points[i].getX() - SIZE / 2;                   double y = points[i].getY() - SIZE / 2;                   Rectangle2D r = new Rectangle2D.Double(x, y, SIZE, SIZE);                   if (r.contains(p))                   {                      current = i;                      return;                   }                }             }             public void mouseReleased(MouseEvent event)             {                current = -1;             }          });       addMouseMotionListener(new MouseMotionAdapter()          {             public void mouseDragged(MouseEvent event)             {                if (current == -1) return;                points[current] = event.getPoint();                repaint();             }          });       points = new Point2D[3];       points[0] = new Point2D.Double(200, 100);       points[1] = new Point2D.Double(100, 200);       points[2] = new Point2D.Double(200, 200);       current = -1;       width = 8.0F;    }    public void paintComponent(Graphics g)    {       Graphics2D g2 = (Graphics2D) g;       GeneralPath path = new GeneralPath();       path.moveTo((float) points[0].getX(), (float) points[0].getY());       for (int i = 1; i < points.length; i++)          path.lineTo((float) points[i].getX(), (float) points[i].getY());       BasicStroke stroke;       if (dash)       {          float miterLimit = 10.0F;          float[] dashPattern = { 10F, 10F, 10F, 10F, 10F, 10F, 30F, 10F, 30F, 10F, 30F, 10F, 10F,                10F, 10F, 10F, 10F, 30F };          float dashPhase = 0;          stroke = new BasicStroke(width, cap, join, miterLimit, dashPattern, dashPhase);       }       else stroke = new BasicStroke(width, cap, join);       g2.setStroke(stroke);       g2.draw(path);    }    /**     * Sets the join style.     * @param j the join style     */    public void setJoin(int j)    {       join = j;       repaint();    }    /**     * Sets the cap style.     * @param c the cap style     */    public void setCap(int c)    {       cap = c;       repaint();    }    /**     * Sets solid or dashed lines     * @param d false for solid, true for dashed lines     */    public void setDash(boolean d)    {       dash = d;       repaint();    }    private Point2D[] points;    private static int SIZE = 10;    private int current;    private float width;    private int cap;    private int join;    private boolean dash; }