我有一个小面板,我正在通过改变它x co-ordinate
来移动球。
我希望球在遇到框架末端时向后移动。我的框架宽度 300
(by fr.setSize(300,300))
。
现在我将动画编程为:
// when x == 300
// stop the timer
但是x = 300似乎比它的宽度大300!这怎么可能。
**球移出300 x 300
框架并变得不可见。
为什么会这样?
这些是最终发生的事情的屏幕截图。
第一个快照是移动球的快照,第二个显示球已经消失,第三个显示放大那个球在那里。
为什么会这样。?如何将帧的终点设置为球的终点?
答案 0 :(得分:2)
你的球的“x坐标”可能是它的左上边界吗?这可以解释为什么它在框架之外移动。还要考虑到你的框架周围有一些装饰像素。
也许你需要调整到像
这样的东西if (x == framewidth - decorationwidth - ballwidth) stopAnimation ();
答案 1 :(得分:2)
x坐标指向图像的左上角?如果是这样,当x == 300时,图像的其余部分将已经不在帧中。您必须从等式中减去图像的宽度。
答案 2 :(得分:2)
您需要考虑组件的可查看大小。它不一定与您要求的尺寸相同。
您可以使用getSize
方法确定组件的实际大小,但您还需要调用getInsets
以确定是否已为边框使用保留任何空间。这将为您提供真实的可绘制区域:
public void paint(Graphics g) {
Dimension size = getSize();
Insets insets = getInsets();
int available = size.width - insets.left - insets.right;
// Draw stuff. Remember to offset by insets.left and insets.top!
...
}
还要记住像Graphics
这样的fillOval
例程在您指定的坐标的右侧和右侧绘制,因此您需要考虑球坐标的含义。它是球的中心,还是左侧或右侧?在计算是否到达可绘制区域的一侧时,您可能需要减去球的宽度。
答案 3 :(得分:1)
这是条件
if ( end > (frameWidth-ballWidth) ) // end is any integer
// stop the timer or do whatever
请注意,椭圆的x坐标和y坐标是椭圆的中心。因此,您需要从框架宽度中减去球宽。
答案 4 :(得分:0)
Rectangle
必须获得paintComponent(Graphics g)
。
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class AnimationJPanel extends JPanel {
private static final long serialVersionUID = 1L;
private int cx = 0;
private int cy = 150;
private int cw = 20;
private int ch = 20;
private int xinc = 1;
private int yinc = 1;
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
AnimationJPanel panel = new AnimationJPanel();
panel.setPreferredSize(new Dimension(400, 300));
panel.animate();
JFrame frame = new JFrame("Test");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(panel);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public AnimationJPanel() {
setLayout(new BorderLayout());
JLabel label = new JLabel("This is an AnimationJPanel");
label.setForeground(Color.RED);
label.setHorizontalAlignment(SwingConstants.CENTER);
add(label);
setBackground(Color.BLACK);
setForeground(Color.RED);
setOpaque(true);
}
public void animate() {
new Timer(15, new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
Rectangle oldCircle = new Rectangle(cx - 1, cy - 1, cw + 2, ch + 2);
cx += xinc;
cy += yinc;
if (cx >= getWidth() - cw || cx <= 0) {
xinc *= -1;
}
if (cy >= getHeight() - ch || cy <= 0) {
yinc *= -1;
}
repaint(oldCircle);
repaint(cx - 1, cy - 1, cw + 2, ch + 2);
}
}).start();
}
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawOval(cx, cy, cw, ch);
}
}