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

Upload temporary file and read using apache POI
File sending stuck in the middle[Socket Programming] [closed]
Spring MVC -No mapping found for HTTP request with URI [/HelloWeb/WEB-INF/jsp/hello.jsp] in DispatcherServlet with name 'servletname' [duplicate]
How to create a .war file in gwt using maven in eclipse?
Sending message to a Handler on a dead thread when using Facebook GraphRequest in IntentService
Table column order generated by Hibernate
Converting Matrix to Graph using Jung
How to validate request parameter key in springs
Why is the the class not found error still showing up for Microsoft sql
How to calculate Big O for this algorithm?
Spark SQL: Nested classes to parquet error
Not able to get element by Xpath in Selenium webdriver
Draw data from InputStream every fixed byte length?
== and equals behaviour in java when string is concatenated at run time [duplicate]
Accessing URL with params in Spring Security
Calculating Tarloy series in Java

Categories

HOME
gitlab
openmp
azure-data-factory
server
comparison
bpmn
getelementsbytagname
cvs
setup-deployment
django-imagekit
multiple-records
pheatmap
tomcat6
volttron
spring-xd
dax
zend-framework3
windows-azure-storage
spring-tool-suite
vb.net-2010
gz
commonmark
windows-server-2012
netflix
http-status-code-504
object-detection
kudan
autosys
firebase-crash-reporting
tooltipster
applozic
fifo
libuv
google-rich-snippets
directx-10
nameservers
ecto
data-manipulation
airconsole
ioio
noraui
lxd
rotational-matrices
atl
mpmediaquery
fusionpbx
plsql-psp
objectlistview
code-search-engine
streamreader
mesos-chronos
particles.js
ruby-on-rails-3.1
elmah
eclipse-gef
businessworks
thin
logfiles
dds
theming
hendrix
fancybox-2
tropo
ifs
epson
linode
mediaelement
topbeat
pintos
cubes
mikroc
clang-static-analyzer
design-by-contract
ford-fulkerson
ios8-today-widget
wso2cloud
google-places
rgeo
muse
interrupted-exception
event-bubbling
notify
dia
tween
android-nested-fragment
java-metro-framework
titanium-modules
document-classification
has-many-through
kgdb
prettify
ora-00911
batterylevel
type-equivalence
wsdl-2.0
typoscript2
cascalog
enter
adk
gnu-prolog
libc++
invite
inotifycollectionchanged
mysql-error-1005
site.master
sudzc
asp.net-mvc-areas
vc90
ctp4
document-conversion





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