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 convert tamil string to english string in java [closed]
Possible to configure more repositoryFactoryBeanClass in a spring boot, or need another work around?
What happens when using push(), offer() and add() methods in ArrayDeque at the same time?
how to hide params in $http POST method
Spring 4 data-jpa JpaReposetory
detect last foreach loop iteration
Using JPA native query with zero or more parameters
windows-my certificate store equivalent linux
Difference in BigDecimal behavior
Running a java script with a java program
Jasper report export pdf file content was duplicated
Java SlotMachine Exception Error [duplicate]
How to manage springs ROLE from my reactJS client
How do we get and set same Toggle value while navigating from one screen(activity) to another activity?
Editor initialization failed site is incorrect in rcp eclipse
How to move one fragment to another fragment in android

Categories

HOME
log4j
azure-data-factory
vmware
webstorm
gis
jira
spring-cloud-stream
spring-jdbc
baqend
ezpublish
upload
add
user-input
correlation
gz
ibm-odm
systemc
progressive-web-apps
oracle-coherence
shared-hosting
google-pagespeed
predix
custom-wordpress-pages
abi
tokenize
kudan
mmap
dxf
java-7
sparse-matrix
traffic
r-raster
lightswitch-2013
fabric8
phonegap
jquery-bootgrid
gesture
android-fingerprint-api
cookiecutter-django
android-tabhost
mapzen
eclipse-scout
menuitem
sage-one
nativeapplication
carrot
typed-lambda-calculus
pdfclown
titanium-android
eventkit
specrun
root-framework
dstu2-fhir
pervasive-sql
vhd
wso2cloud
sdhc
cyclomatic-complexity
varargs
graph-drawing
fluid-dynamics
inmobi
e10s
bigbluebutton
java.util.concurrent
seaside
tidy
listings
batterylevel
eclipse-memory-analyzer
android-hardware
referrer
unc
quickdialog
cascalog
dbproviderfactories
ohm
boost-filesystem
gnustep
table-footer
mongomapper
google-friend-connect
sustainable-pace
procedural-music
port-number
data-acquisition
django-notification

Resources

Mobile Apps Dev
Database Users
javascript
java
csharp
php
android
MS Developer
developer works
python
ios
c
html
jquery
RDBMS discuss
Cloud Virtualization
Database Dev&Adm
javascript
java
csharp
php
python
android
jquery
ruby
ios
html
Mobile App
Mobile App
Mobile App