349 lines
9.9 KiB
Java
349 lines
9.9 KiB
Java
|
Paint Shapes and Text of different colors and fonts
|
||
|
|
||
|
import java.awt.*;
|
||
|
import java.awt.event.*;
|
||
|
import javax.swing.*;
|
||
|
import javax.swing.event.*;
|
||
|
|
||
|
public class Painter2 extends JFrame {
|
||
|
private int topX, topY, width, fontSize,
|
||
|
height, bottomX, bottomY, shape;
|
||
|
private boolean clear, textOn, filled;
|
||
|
private Color drawingColor;
|
||
|
private String font;
|
||
|
private JTextField text;
|
||
|
private JPanel panel1, panel2, panel3, panel4;
|
||
|
private JRadioButton ovalBox, rectBox, lineBox;
|
||
|
private ButtonGroup shapeGroup;
|
||
|
private JCheckBox fillBox;
|
||
|
private JComboBox colorList, fontList, sizeList;
|
||
|
private JButton clearButton;
|
||
|
private String colorNames[] = { "Black", "Green", "Blue",
|
||
|
"Red", "Cyan" };
|
||
|
private Color colors[] = { Color.black, Color.green, Color.blue,
|
||
|
Color.red, Color.cyan };
|
||
|
private String fontNames[] = { "Serif", "SansSerif", "Monospaced" };
|
||
|
private String sizeNames[] = { "9", "10", "22", "72" };
|
||
|
private int sizes[] = { 9, 10, 22, 72 };
|
||
|
private final int OVAL = 1, LINE = 2, RECT = 3;
|
||
|
|
||
|
private ToolWindow tools;
|
||
|
|
||
|
// Painter2 constructor
|
||
|
public Painter2()
|
||
|
{
|
||
|
super( "Painting Window" );
|
||
|
|
||
|
addMouseListener( new MouseHandler() );
|
||
|
|
||
|
// set defaults for painting
|
||
|
drawingColor = Color.black;
|
||
|
shape = OVAL;
|
||
|
font = "Serif";
|
||
|
fontSize = 9;
|
||
|
|
||
|
setDefaultCloseOperation( EXIT_ON_CLOSE );
|
||
|
setBackground( Color.white );
|
||
|
setSize( 300, 300 );
|
||
|
show();
|
||
|
|
||
|
// create new ToolWindow
|
||
|
tools = new ToolWindow();
|
||
|
|
||
|
} // end constructor
|
||
|
|
||
|
// paint the new window. super is not called so
|
||
|
// that the previous images will not be erased.
|
||
|
public void paint( Graphics g )
|
||
|
{
|
||
|
g.setColor( drawingColor );
|
||
|
|
||
|
// draw text
|
||
|
if ( textOn ) {
|
||
|
g.setFont( new Font( font, Font.PLAIN, fontSize ) );
|
||
|
g.drawString( text.getText(), topX, topY );
|
||
|
textOn = false;
|
||
|
return;
|
||
|
|
||
|
} // end if statement
|
||
|
|
||
|
// set shape's top left coordinates
|
||
|
if ( shape != LINE ) {
|
||
|
topX = Math.min( topX, bottomX );
|
||
|
topY = Math.min( topY, bottomY );
|
||
|
|
||
|
} // end if statement
|
||
|
|
||
|
// draw filled shape
|
||
|
if ( filled && shape != LINE )
|
||
|
|
||
|
switch ( shape ) {
|
||
|
|
||
|
case OVAL:
|
||
|
g.fillOval( topX, topY, width, height );
|
||
|
break;
|
||
|
|
||
|
case RECT:
|
||
|
g.fillRect( topX, topY, width, height );
|
||
|
break;
|
||
|
|
||
|
} // end switch statement
|
||
|
|
||
|
// draw unfilled shapes
|
||
|
else
|
||
|
|
||
|
switch ( shape ) {
|
||
|
|
||
|
case OVAL:
|
||
|
g.drawOval( topX, topY, width, height );
|
||
|
break;
|
||
|
|
||
|
case LINE:
|
||
|
g.drawLine( topX, topY, bottomX, bottomY );
|
||
|
break;
|
||
|
|
||
|
case RECT:
|
||
|
g.drawRect( topX, topY, width, height );
|
||
|
break;
|
||
|
|
||
|
} // ens switch statement
|
||
|
|
||
|
// clear background
|
||
|
if ( clear == true ) {
|
||
|
g.setColor( Color.white );
|
||
|
g.fillRect( 0, 0, getSize().width, getSize().height );
|
||
|
clear = false;
|
||
|
|
||
|
} // end if statement
|
||
|
|
||
|
} // end method paint
|
||
|
|
||
|
// inner class for window containing GUI
|
||
|
private class ToolWindow extends JFrame {
|
||
|
|
||
|
// ToolWindow constructor
|
||
|
public ToolWindow()
|
||
|
{
|
||
|
super( "Tool Window" );
|
||
|
|
||
|
// set up to edit text
|
||
|
text = new JTextField( "Text", 25 );
|
||
|
|
||
|
text.addActionListener(
|
||
|
|
||
|
// anonymous inner class to handle text drawing
|
||
|
new ActionListener () {
|
||
|
|
||
|
public void actionPerformed( ActionEvent event )
|
||
|
{
|
||
|
textOn = true;
|
||
|
repaint();
|
||
|
|
||
|
} // end actionPerformed method
|
||
|
|
||
|
} // end anonymous inner class
|
||
|
|
||
|
); // end call to addActionListener
|
||
|
|
||
|
// set up to choose font
|
||
|
fontList = new JComboBox( fontNames );
|
||
|
fontList.setMaximumRowCount( 3 );
|
||
|
|
||
|
fontList.addItemListener(
|
||
|
|
||
|
// anonymous inner class to select font
|
||
|
new ItemListener() {
|
||
|
|
||
|
// change font
|
||
|
public void itemStateChanged( ItemEvent event )
|
||
|
{
|
||
|
font =
|
||
|
fontNames[ fontList.getSelectedIndex() ];
|
||
|
|
||
|
} // end itemStateChanged method
|
||
|
|
||
|
} // end anonymous inner class
|
||
|
|
||
|
); // end call to addItemListener
|
||
|
|
||
|
// set up to choose font size
|
||
|
sizeList = new JComboBox( sizeNames );
|
||
|
sizeList.setMaximumRowCount( 3 );
|
||
|
|
||
|
sizeList.addItemListener(
|
||
|
|
||
|
// anonymous inner class to select font size
|
||
|
new ItemListener() {
|
||
|
|
||
|
// change font size
|
||
|
public void itemStateChanged( ItemEvent event )
|
||
|
{
|
||
|
fontSize =
|
||
|
sizes[ sizeList.getSelectedIndex() ];
|
||
|
|
||
|
} // end itemStateChanged method
|
||
|
|
||
|
} // end anonymous inner class
|
||
|
|
||
|
); // end call to addItemListener
|
||
|
|
||
|
// set up to choose color
|
||
|
colorList = new JComboBox( colorNames );
|
||
|
colorList.setMaximumRowCount( 3 );
|
||
|
|
||
|
colorList.addItemListener(
|
||
|
|
||
|
// anonymous inner class to select color
|
||
|
new ItemListener() {
|
||
|
|
||
|
// change color
|
||
|
public void itemStateChanged( ItemEvent event )
|
||
|
{
|
||
|
drawingColor =
|
||
|
colors[ colorList.getSelectedIndex() ];
|
||
|
|
||
|
} // end itemStateChanged method
|
||
|
|
||
|
} // end anonymous inner class
|
||
|
|
||
|
); // end call to addItemListener
|
||
|
|
||
|
// set up clear button
|
||
|
clearButton = new JButton( "Clear" );
|
||
|
clearButton.addActionListener(
|
||
|
new ClearButtonHandler() );
|
||
|
|
||
|
// set up to choose filled
|
||
|
fillBox = new JCheckBox( "Filled" );
|
||
|
FillBoxHandler fillHandle = new FillBoxHandler();
|
||
|
fillBox.addItemListener( fillHandle );
|
||
|
|
||
|
// set up to choose shapes
|
||
|
ovalBox = new JRadioButton( "Oval", true );
|
||
|
lineBox = new JRadioButton( "Line", false );
|
||
|
rectBox = new JRadioButton( "Rectangle", false );
|
||
|
RadioButtonHandler handler = new RadioButtonHandler();
|
||
|
ovalBox.addItemListener( handler );
|
||
|
lineBox.addItemListener( handler );
|
||
|
rectBox.addItemListener( handler );
|
||
|
shapeGroup = new ButtonGroup();
|
||
|
shapeGroup.add(ovalBox);
|
||
|
shapeGroup.add(lineBox);
|
||
|
shapeGroup.add(rectBox);
|
||
|
|
||
|
// set up GUI layout
|
||
|
panel1 = new JPanel();
|
||
|
panel2 = new JPanel();
|
||
|
panel3 = new JPanel();
|
||
|
panel4 = new JPanel();
|
||
|
|
||
|
panel1.setLayout( new GridLayout( 1, 4 ) );
|
||
|
panel2.setLayout( new GridLayout( 1, 3 ) );
|
||
|
panel3.setLayout( new FlowLayout() );
|
||
|
panel4.setLayout( new FlowLayout() );
|
||
|
|
||
|
panel1.add( ovalBox );
|
||
|
panel1.add( lineBox );
|
||
|
panel1.add( rectBox );
|
||
|
panel1.add( fillBox );
|
||
|
panel2.add( new JScrollPane( colorList ) );
|
||
|
panel2.add( new JScrollPane( fontList ) );
|
||
|
panel2.add( new JScrollPane( sizeList ) );
|
||
|
panel3.add( text );
|
||
|
panel4.add( clearButton );
|
||
|
|
||
|
Container container = getContentPane();
|
||
|
container.setLayout( new FlowLayout() );
|
||
|
container.add( panel1 );
|
||
|
container.add( panel2 );
|
||
|
container.add( panel3 );
|
||
|
container.add( panel4 );
|
||
|
|
||
|
setDefaultCloseOperation( EXIT_ON_CLOSE );
|
||
|
setSize( 350, 175 );
|
||
|
setLocation( 300, 0 );
|
||
|
setVisible( true );
|
||
|
|
||
|
} // end ToolWindow constructor
|
||
|
|
||
|
} // end inner class ToolWindow
|
||
|
|
||
|
// set coordinate and dimension values
|
||
|
private class MouseHandler extends MouseAdapter {
|
||
|
|
||
|
public void mousePressed( MouseEvent event )
|
||
|
{
|
||
|
topX = event.getX();
|
||
|
topY = event.getY();
|
||
|
|
||
|
} // end mousePressed method
|
||
|
|
||
|
public void mouseReleased( MouseEvent event )
|
||
|
{
|
||
|
bottomX = event.getX();
|
||
|
bottomY = event.getY();
|
||
|
width = Math.abs( topX - bottomX );
|
||
|
height = Math.abs( topY - bottomY );
|
||
|
|
||
|
repaint();
|
||
|
|
||
|
} // end mouseReleased method
|
||
|
|
||
|
} // end inner class MouseHandler
|
||
|
|
||
|
// clear background
|
||
|
private class ClearButtonHandler implements ActionListener {
|
||
|
|
||
|
public void actionPerformed( ActionEvent event )
|
||
|
{
|
||
|
clear = true;
|
||
|
repaint();
|
||
|
|
||
|
} // end actionPerformed method
|
||
|
|
||
|
} // end inner class ClearButtonHandler
|
||
|
|
||
|
// determine which type of shape to draw
|
||
|
private class RadioButtonHandler implements ItemListener {
|
||
|
|
||
|
public void itemStateChanged( ItemEvent event )
|
||
|
{
|
||
|
if ( event.getSource() == ovalBox )
|
||
|
shape = OVAL;
|
||
|
|
||
|
else if ( event.getSource() == lineBox )
|
||
|
shape = LINE;
|
||
|
|
||
|
else if ( event.getSource() == rectBox )
|
||
|
shape = RECT;
|
||
|
|
||
|
} // end itemStateChanged method
|
||
|
|
||
|
} // end inner class RadioButtonHandler
|
||
|
|
||
|
// determine if shape should be filled
|
||
|
private class FillBoxHandler implements ItemListener {
|
||
|
|
||
|
public void itemStateChanged( ItemEvent event )
|
||
|
{
|
||
|
if ( event.getStateChange() == ItemEvent.SELECTED )
|
||
|
filled = true;
|
||
|
|
||
|
else
|
||
|
filled = false;
|
||
|
|
||
|
} // end ItemStateChanged method
|
||
|
|
||
|
} // end inner class FillBoxHandler
|
||
|
|
||
|
// execute application
|
||
|
public static void main( String args[] )
|
||
|
{
|
||
|
Painter2 application = new Painter2();
|
||
|
|
||
|
application.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
|
||
|
|
||
|
} // end main method
|
||
|
|
||
|
} // end class Painter2
|