java


Java (Swing) - How to rotate a bunch of lines?


I've been looking for this online, but I can't seem to find how to rotate a bunch of lines. I made a "plane" with the Graphics.drawLine() function, but I want to know how to rotate the whole thing 90 degrees to the right when it hits a wall. Here is my current code:
/* MovePlane
* Moves plane to the right, down, left, up, and repeats using Timer object
*/
import java.awt.event.*;
import java.awt.*;
import javax.swing.*;
public class MovePlane extends JPanel implements ActionListener {
private int delay = 5;
private Timer timer;
private int x = 10; // x position
private int y = 10; // y position
private boolean right = true;
private boolean up = true;
public MovePlane() {
timer = new Timer(delay, this);
timer.start(); // start the timer - infinite
}
public void actionPerformed(ActionEvent e) {
// will run when the timer fires
repaint();
}
public void paintComponent(Graphics g) {
// both paint and paintComponent work - difference?
super.paintComponent(g); // call superclass's paintComponent
g.drawLine(x,y,x+20,y); // body - drawn in terms of x
g.drawLine(x+15,y-5,x+15,y+5); // wing
g.drawLine(x,y-2,x,y+2);
if (right && up) {
x++;
if (x == getWidth()-25) {
right = false;
up = false;
}
} else if (!right && !up) {
y++;
if (y == getHeight()-10) {
up = true;
}
} else {
if (x <= getWidth()-15 && x > 0) {
x--;
}
if (x == 0) {
y--;
}
if (y == 10) {
right = true;
}
}
}
public static void main(String args[]) {
JFrame frame = new JFrame("Move Plane");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
MovePlane bp = new MovePlane();
frame.add(bp);
frame.setSize(300, 300); // set frame size
frame.setVisible(true); // display frame
}
}
You need to change it everytime you change the direction, so, you need to move your g.drawLine(...) calls inside each if conditions...
But while rotating the plane, you also need to take care of the "bounds" or the limits of the screen, so, I modified if (x == 0) and ... && x > 0 conditions to have a gap of 20 instead...
Let's start for the plane going from left to right:
g.drawLine(x, y, x + 20, y); // body - drawn in terms of x
g.drawLine(x + 15, y - 5, x + 15, y + 5); // wing
g.drawLine(x, y - 2, x, y + 2);
This is telling us that:
Your plane's body length is 20
Your wings are 15 units from the back
Your tail is right on the back
So, to change it to move from left to right, we need to invert the wings and tail positions...
Plane lenght is still the same
Wings are now 5 units from the back
Tail is now on the front
Then, we have this code:
g.drawLine(x, y, x + 20, y); // Body length 20
g.drawLine(x + 5, y - 5, x + 5, y + 5); // Wing's are 5 units from the front
g.drawLine(x + 20, y - 2, x + 20, y + 2); // Tail is on the front (at body's length)
And for when going down:
Body's length is now on Y axis
Wings should be at 15 units from the back
Tail is at the back
So we have:
g.drawLine(x, y, x, y + 20); // Body is now on Y axis
g.drawLine(x - 5, y + 15, x + 5, y + 15); // Wings are 15 units from the back
g.drawLine(x - 2, y, x + 2, y); // Tail is on the back
And applying same logic as when going from right to left:
g.drawLine(x, y + 20, x, y);
g.drawLine(x - 5, y + 5, x + 5, y + 5);
g.drawLine(x - 2, y + 20, x + 2, y + 20);
Then your paintComponent(...) method looks like this:
public void paintComponent(Graphics g) {
// both paint and paintComponent work - difference?
super.paintComponent(g); // call superclass's paintComponent
if (right && up) {
g.drawLine(x, y, x + 20, y); // body - drawn in terms of x
g.drawLine(x + 15, y - 5, x + 15, y + 5); // wing
g.drawLine(x, y - 2, x, y + 2);
x++;
if (x == getWidth() - 25) {
right = false;
up = false;
}
} else if (!right && !up) {
g.drawLine(x, y, x, y + 20); // body - drawn in terms of x
g.drawLine(x - 5, y + 15, x + 5, y + 15); // wing
g.drawLine(x - 2, y, x + 2, y);
y++;
if (y == getHeight() - 25) {
up = true;
}
} else {
if (x <= getWidth() - 15 && x > 20) {
g.drawLine(x, y, x + 20, y); // body - drawn in terms of x
g.drawLine(x + 5, y - 5, x + 5, y + 5); // wing
g.drawLine(x + 20, y - 2, x + 20, y + 2);
x--;
}
if (x == 20) {
g.drawLine(x, y, x, y + 20); // body - drawn in terms of x
g.drawLine(x - 5, y + 5, x + 5, y + 5); // wing
g.drawLine(x - 2, y + 20, x + 2, y + 20);
y--;
}
if (y == 10) {
right = true;
}
}
}
And that's it! Here's an image showing how it looks like:
Additional tips:
Don't call frame.setSize() but override MovePlane's JPanel getPreferredSize() to return a fixed size of 300, 300.
Always place your GUI in the Event Dispatch Thread (EDT) by wrapping your main method like this:
public static void main(String args[]) {
SwingUtilities.invokeLater(new Runnable() {
#Override
public void run() {
//Your code here
}
});
}
Related to tip #1, call frame.pack(); instead of frame.setSize() after overriding JPanel's getPreferredSize() :)

Related Links

How to emulate CPUs in Java? [closed]
Java jTable is not visible inside jScrollPane
Extending an Enum by copying
Android / Java - Add textView to Drag-Drop GridView Tutorial / Example
Thread.Sleep crashes my app
Simple map app on Android(google api v2). Doesnt work. Error
How can i make an application to send messages not knowing the ip address of the receiver application?
How to call JBoss's Drools as a remote rules executor
JSoup: How to parse the cells of 1st column of a table?
Dynamically adding column to grid using Jquery Datatable and Spring
How to group data specific field wise?
How to fix NullPointerException
Where main method is creating in my web application if i use struts or servlet or spring [closed]
Static reference to three objects, but no matter which object I return, the same value is returned
How to use father's method with son's variable in java?
HTMLUnit doesn't work

Categories

HOME
sendgrid
osgi
cloud
relative-path
mean-stack
rsyslog
paw-app
jxls
add
adobe-analytics
etl
jplayer
static-libraries
leiningen
decimal
after-effects
pythonanywhere
csrf-protection
excel-2007
trading
phpfox
linkerd
jspm
unboundid
openoffice.org
azure-sql-database
accelerate-framework
android-kernel
picasso
nssegmentedcontrol
overriding
hilbert-curve
uft-api
unobtrusive-validation
leading-zero
dism
reportingservices-2005
botbuilder
ibpy
lowpass-filter
recursive-datastructures
arrow-keys
mcafee
chord-diagram
specrun
infix-notation
bstr
r-tree
execute
jms2
lemon
marching-cubes
0xdbe
interrupted-exception
pretty-print
javax.mail
nsmutabledictionary
typekit
cdt
winddk
tld
aapt
hippomocks
braille
cloud-connect
soundtouch
file-locking
rabl
chronoforms
yui-compressor
sabredav
limejs
enterprisedb
tridion-worldserver
ticoredatasync
reddot
adrotator

Resources

Encrypt Message