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

Change SequenceEncoder FPS
How to find limits of selection based on (using) selected random numbers?
Happens-before when synchronized method exits
does a application context always need a war file to be loaded on the server
Java Controller not transforming for JSON to entity
Maven BOM: Super BOM which gathers all BOMs?
Java 8 string handling - replaceFirst and replaceAll
Difference between the annotations #GetMapping and #RequestMapping(method = RequestMethod.GET)
Get time from Time Server using java [duplicate]
How to convert a String object into TextField Object in javafx?
Retrofit2: Error Handling
Gzip compression and http post from python to java
JavaFX Video Stutter (MediaView)
Want to train weka from Database but the Instances Object cant retrieve
Java: Optimization of checking Attribute of ObjectList andObject2List
How to skip emails in copy operation for INBOX folder when emails already exist in java ?

Categories

HOME
sendgrid
twitter
xamarin
bluetooth
urbancode
comparison
hashmap
react-router
cvs
razor
callback
yum
gnupg
ssl-client-authentication
izpack
spring-tool-suite
hex-editors
designer
workload-scheduler
saxon
pc
pugjs
nhibernate-envers
emulator
paging
cx-freeze
autoconf
tokenize
intentfilter
ehcache
tapestry
firebase-crash-reporting
emgucv
fish
windows-error-reporting
social-media
wtx
skia
bcd
xquery-3.0
exuberant-ctags
oracle-fusion-middleware
typed.js
asset-pipeline
textmate
uiswipegesturerecognizer
mozilla
http-digest
main
neuroscience
unspecified
email-templates
import-from-excel
sas-jmp
outlook-2013
smartcontracts
chain-builder
errordocument
powercli
mu
np-complete
boost-preprocessor
dwscript
cubes
static-ip-address
azure-sdk
log4c
mongocsharpdriver
autorest
persist
react-native-listview
system.management
browser-link
iad
atk4
angular-leaflet-directive
sframe
ionic
jsonpickle
android-nested-fragment
issuu
spring-io
ftps
jquery-mobile-dialog
comaddin
interface-orientation
flashvars
manchester-syntax
datawindow
javaspaces
ocx
cufon
custom-backend
spyware
heartbeat
h.323
digest-authentication
filtered-index
castle-monorail
avatar
noscript
zend-decorators
dbisam
ugc
lzh

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