Re: Change buttons to a limited frame movement
bH wrote:
Hi Mark,
Your Q "do you mean actually resizing the JFrame normally?"
Yes that is my target. To make the drawing inside smaller
or larger depending on which way the frame border moves.
John's demo above looks like
it should do the task but at this time I have not adapted that
to my program.
Yes, John's post was quite good. Here's what I came up with:
package fubar;
import java.awt.Color;
import java.awt.Container;
import java.awt.EventQueue;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class Octogon
{
public static void main( String[] args )
{
ShowAPolygon.main( args );
}
}
class ShowAPolygon extends JFrame implements
ActionListener
{
private JButton drawLgrBtn = new JButton( "Draw Lgr" );
private JButton drawSmrBtn = new JButton( "Draw Smlr" );
private JButton closeBtn = new JButton( "Close" );
private JPanel btnPanel = new JPanel();
private int fontSize = 12;//Message Font size
private String msgStr = "Stop Sign Polygon";
private static final int width = 300;// frame width
private static final int height = 320;
;// frame height
int xPosition = 150;// repostions drawing x values
int yPosition = 200;// repostions drawing y values
int measureOfDiameter = 90; // image is drawn with circle
int measureIncreaseBy = 15; // image is dia is incrsd by amt
int measureDecreaseBy = 15; // image is dia is decrsd by amt
int numPoints = 8;// num points needed for a octagon
int[] xPoints = new int[numPoints];// array stores x values
//for a polygon
int[] yPoints = new int[numPoints];// array stores y values
//for a polygon
ShowAPolygon()
{
setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
btnPanel.add( drawLgrBtn );
drawLgrBtn.addActionListener( this );
btnPanel.add( drawSmrBtn );
drawSmrBtn.addActionListener( this );
btnPanel.add( closeBtn );
closeBtn.addActionListener( this );
Container contentPane = getContentPane();
contentPane.add( btnPanel );
contentPane.setLayout( new GridLayout( 1, 1 ) );
this.setSize( width, height );
this.setResizable( true );
setVisible( true );
}
public void actionPerformed( ActionEvent e )
{
if( e.getSource() == drawLgrBtn ) {
measureOfDiameter = measureOfDiameter +
measureIncreaseBy;
fontSize = fontSize + 1;
repaint();
}
if( e.getSource() == drawSmrBtn ) {
measureOfDiameter = measureOfDiameter -
measureDecreaseBy;
fontSize = fontSize - 1;
repaint();
}
if( e.getSource() == closeBtn ) {
System.exit( 0 );
}
}
public void paint( Graphics g )
{
super.paint( g );
int w = getWidth();
int h = getHeight();
System.err.printf( "w=%d, h=%d%n", w, h );
xPosition = w / 2;
yPosition = h / 2 + 20;
measureOfDiameter = Math.min( h, w ) * 35 / 100; // integer %
System.err.printf( "x=%d, y=%d, m=%d%n", xPosition, yPosition,
measureOfDiameter );
Graphics2D g2 = (Graphics2D) g;
Color rndm = new Color( (int) (Math.random() * 255),
(int) (Math.random() * 255), (int) (Math.random() *
255) );
g.setColor( rndm );
//calculating point locations
for( int n = 0; n < numPoints; n++ ) {
xPoints[n] = (int) (xPosition + measureOfDiameter *
Math.cos( (2 * Math.PI / numPoints) * (0.5 + n) ));
yPoints[n] = (int) (yPosition + measureOfDiameter *
Math.sin( (2 * Math.PI / numPoints) * (0.5 + n) ));
}
g.fillPolygon( xPoints, yPoints, numPoints );
g.setColor( Color.black );//accents the shape visually
g.drawPolygon( xPoints, yPoints, numPoints );
//for message inside the polygon
g.setFont( new Font( "Helvetica", 2, fontSize ) );
g.drawString( msgStr, 100, 200 );
}
public static void main( String[] args )
{
EventQueue.invokeLater( new Runnable()
{
public void run()
{
ShowAPolygon sapg = new ShowAPolygon();
}
} );
}
}