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();
        }

    }

}