Java 使用JApplet环绕窗口的图像
这就是我被困的地方。。。我让它水平移动到窗口的末端,然后向下移动,但我不知道如何使它在到达窗口底部后向左移动,然后在到达屏幕左侧时向上移动。 谢谢Java 使用JApplet环绕窗口的图像,java,animation,applet,japplet,Java,Animation,Applet,Japplet,这就是我被困的地方。。。我让它水平移动到窗口的末端,然后向下移动,但我不知道如何使它在到达窗口底部后向左移动,然后在到达屏幕左侧时向上移动。 谢谢 从概念上讲,这个想法很简单。当你到达一个边缘时,你需要改变你的移动方向 if x + image.width > width then go down else if x < 0 then go up else if y + image.height > height then go left else if y < 0 th
从概念上讲,这个想法很简单。当你到达一个边缘时,你需要改变你的移动方向
if x + image.width > width then go down
else if x < 0 then go up
else if y + image.height > height then go left
else if y < 0 then go right
如果x+image.width>width,则向下
否则,如果x<0,则上升
否则,如果y+image.height>height,则向左移动
否则,如果y<0,则向右移动
用于时钟方向的运动
导入java.awt.Dimension;
导入java.awt.EventQueue;
导入java.awt.Graphics;
导入java.awt.Graphics2D;
导入java.awt.event.ActionEvent;
导入java.awt.event.ActionListener;
导入java.awt.event.MouseAdapter;
导入java.awt.event.MouseEvent;
导入java.awt.image.buffereImage;
导入java.io.File;
导入java.io.IOException;
导入javax.imageio.imageio;
导入javax.swing.JFrame;
导入javax.swing.JPanel;
导入javax.swing.Timer;
导入javax.swing.UIManager;
导入javax.swing.UnsupportedLookAndFeelException;
公共类移动测试{
公共静态void main(字符串[]args){
新的MoveTest();
}
公共交通测试{
invokeLater(新的Runnable(){
@凌驾
公开募捐{
试一试{
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
}catch(ClassNotFoundException |实例化Exception | IllegalacessException |不支持ookandfeelException ex){
例如printStackTrace();
}
JFrame=新JFrame(“测试”);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(newtestpane());
frame.pack();
frame.setLocationRelativeTo(空);
frame.setVisible(true);
}
});
}
公共类TestPane扩展了JPanel{
专用缓冲图像img;
私有int xDelta=2;
私有int yDelta=0;
私有整数x,y=0;
公共测试窗格(){
试一试{
img=图像读取(…);
}捕获(IOEX异常){
例如printStackTrace();
}
计时器计时器=新计时器(15,新ActionListener(){
@凌驾
已执行的公共无效操作(操作事件e){
x+=xDelta;
y+=yDelta;
如果(x+img.getWidth()>getWidth()){
x=getWidth()-img.getWidth();
xDelta=0;
yDelta=2;
}else如果(x<0){
x=0;
xDelta=0;
yDelta=-2;
}
如果(y+img.getHeight()>getHeight()){
y=getHeight()-img.getHeight();
xDelta=-2;
yDelta=0;
}else if(y<0){
y=0;
xDelta=2;
yDelta=0;
}
重新油漆();
}
});
timer.start();
}
@凌驾
公共维度getPreferredSize(){
返回新维度(200200);
}
@凌驾
受保护组件(图形g){
超级组件(g);
Graphics2D g2d=(Graphics2D)g.create();
g2d.drawImage(img,x,y,this);
g2d.dispose();
}
}
}
您应该小心Swing中的线程,因为Swing不是线程保存。查看并获取更多详细信息有一个x/y增量,当不需要时,只需将其设置为
0
,当您到达其中一个边界(垂直/水平)时,将另一个增量设置为非0值我盯着这个代码看得太久了。太迷路了,谢谢。如果要单击最初绘制图像的位置,我会怎么做?添加一个MouseListener,当调用mouseClicked时,记录单击的x/y点,然后启动计时器
if x + image.width > width then go down
else if x < 0 then go up
else if y + image.height > height then go left
else if y < 0 then go right
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.Timer;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
public class MoveTest {
public static void main(String[] args) {
new MoveTest();
}
public MoveTest() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
ex.printStackTrace();
}
JFrame frame = new JFrame("Testing");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(new TestPane());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public class TestPane extends JPanel {
private BufferedImage img;
private int xDelta = 2;
private int yDelta = 0;
private int x, y = 0;
public TestPane() {
try {
img = ImageIO.read(...);
} catch (IOException ex) {
ex.printStackTrace();
}
Timer timer = new Timer(15, new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
x += xDelta;
y += yDelta;
if (x + img.getWidth() > getWidth()) {
x = getWidth() - img.getWidth();
xDelta = 0;
yDelta = 2;
} else if (x < 0) {
x = 0;
xDelta = 0;
yDelta = -2;
}
if (y + img.getHeight() > getHeight()) {
y = getHeight() - img.getHeight();
xDelta = -2;
yDelta = 0;
} else if (y < 0) {
y = 0;
xDelta = 2;
yDelta = 0;
}
repaint();
}
});
timer.start();
}
@Override
public Dimension getPreferredSize() {
return new Dimension(200, 200);
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g.create();
g2d.drawImage(img, x, y, this);
g2d.dispose();
}
}
}