Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 反向JFrame边界_Java_Swing_Concurrency_Bounds - Fatal编程技术网

Java 反向JFrame边界

Java 反向JFrame边界,java,swing,concurrency,bounds,Java,Swing,Concurrency,Bounds,我正在试着做一个弹跳球。边界设置允许球在超出帧边界时从起点开始。我无法使球反弹。我如何让球在边界(帧的外部边缘)被击中后反弹?我认为问题在于moveBall()方法 主类 导入javax.swing.JFrame public class MainForm { /** * @param args the command line arguments */ public static void main(String[] args) { Mai

我正在试着做一个弹跳球。边界设置允许球在超出帧边界时从起点开始。我无法使球反弹。我如何让球在边界(帧的外部边缘)被击中后反弹?我认为问题在于moveBall()方法

主类 导入javax.swing.JFrame

public class MainForm {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        MainFrame mainFrame = new MainFrame();
        mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        mainFrame.setSize(220, 270);
        mainFrame.setVisible(true);
    }

}
二等舱

import java.awt.BorderLayout;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class MainFrame extends JFrame {

    private CustomPanel _panel;

    public MainFrame()
    {
        super("Bouncing Ball");

        _panel = new CustomPanel();
        add(_panel, BorderLayout.CENTER);
    }
}
三等舱

import java.awt.Graphics;
import javax.swing.JPanel;


public class CustomPanel extends JPanel{

    private final BouncingBall _ball1;
    private final BouncingBall _ball2;
    private final BouncingBall _ball3;

    public CustomPanel ()
    {
        _ball1 = new BouncingBall(this, 20, 3);
        Thread thread1 = new Thread(_ball1);
        _ball2 = new BouncingBall(this, 40, 6);
        Thread thread2 = new Thread(_ball2);
        _ball3 = new BouncingBall(this, 60, 9);
        Thread thread3 = new Thread(_ball3);

        thread1.start();
        thread2.start();
        thread3.start();
    }

    @Override
    public void paintComponent(Graphics g)
    {
        super.paintComponent(g);

        _ball1.draw(g);
        _ball2.draw(g);
        _ball3.draw(g);
    }
}
四等

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Rectangle;

import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JPanel;


public class BouncingBall implements Runnable {

    private JPanel _panel;
    private int _xComponent;
    private int _yComponent;
    private int _sleepDelay;

    public BouncingBall(JPanel panel, int startingYPosition, int sleepDelay)
    {
        _panel = panel;
        _xComponent = 0;
        _yComponent = startingYPosition;
        _sleepDelay = sleepDelay;
    }

    @Override
    public void run()
    {
        while(true)
        {
            try
            {
                Thread.sleep(_sleepDelay);

                moveBall();
                _panel.repaint();
            }

            catch (InterruptedException ex)
            {
                Logger.getLogger(BouncingBall.class.getName()).log(Level.SEVERE,null, ex);
            }
        }
    }

    public void draw(Graphics g)
    {
        g.setColor(new Color(255, 0, 0));
        g.fillOval(_xComponent, _yComponent, 20, 20);
    }

    private void moveBall()
    {
        _xComponent += 2;

        Rectangle bounds = _panel.getBounds();

        if(_xComponent >= bounds.width)
            _xComponent = -_xComponent;
    }
}

\u xComponent
是球组件盒的左上角。所以,要从右侧和底部“检测碰撞”,您必须

if(\u xComponent+ball.width>=bounds.width)

代替

如果(\u xComponent>=bounds.width)

同样的,高度也必须与底部“碰撞”。 顶部和左侧碰撞可以直接检测

另一件事是,当你将你的
\uxcomponent
倒置,而不是从中减去/加上,你将很快移动你的绑定“球”。请记住,
(0,0)
是组件/屏幕的左上角,而不是其中心。所以基本上所有的负向分量都会导致屏幕外的图形

这里你可以直接从Oracle获得一些关于Swing坐标系的信息。

您需要反转速度(步数)

假设边界是相对的,在(0,0),一个从边界内开始

    x += dx;
    y += dy;

    if (x < 0 || x > bounds.width) {
        dx = -dx;
        x += dx;
    }
    if (y < 0 || y > bounds.height) {
        dy = -dy;
        y += dy;
    }
x+=dx;
y+=dy;
if(x<0 | | x>bounds.width){
dx=-dx;
x+=dx;
}
if(y<0 | | y>边界高度){
dy=-dy;
y+=dy;
}

x
\u xComponent
的缩写)

如果(\u xComponent+ball.width)我没有可以使用的ball变量。我也不明白第二部分。如果我加/减的话,它会超出界限,这是有道理的。那么,我如何操纵框架,使其具有球反转方向的边界呢?你没有ball.width,但根据
g.fillOval(_xComponent,_yComponent,20,20),你的球是20 px w/h首先,您需要了解您看到的并不是组件的实际情况。例如,您的ball组件不是一个椭圆形,而是一个在没有任何背景的情况下绘制了椭圆形的矩形。my ide无法识别命令ball.width。如果我发布整个代码会有帮助吗?我有4个文件。dx和dy代表什么?因此,当我反转代码时,我要么没有帧,要么球停在窗格的右侧或闪烁。仍然没有逆转_xComponent+=2;矩形边界=_panel.getBounds();如果(xComponent+20<0 | | xComponent+20>=bounds.width){uxComponent=-2;xComponent+=2;否,引入一个新字段
intdx=2;
(速度向量)。到达右侧时,它将被设置为-2,因此当
xComponent+=dx;
被调用时,它将返回。