Java 秋千中的球动画
问题是当我调整Java 秋千中的球动画,java,swing,resize,paintcomponent,jcomponent,Java,Swing,Resize,Paintcomponent,Jcomponent,问题是当我调整JFrame的大小时,动画会继续使用它为JComponent预先提供的维度。当我调整JFrame的大小时,是否有一种方法可以更新我的宽度和高度变量,以便动画可以与新坐标一起运行 更简单地说,假设JComponent具有初始width=300和height=300,因此BALL在这些指定的坐标内移动。现在,如果我调整我的JFrame,那么JComponent的大小仍然保持不变,即width=300和height=300,但我希望的是,能够用窗口的当前大小修改这些变量。如果我在解释我的
JFrame
的大小时,动画会继续使用它为JComponent
预先提供的维度。当我调整JFrame
的大小时,是否有一种方法可以更新我的宽度
和高度
变量,以便动画可以与新坐标一起运行
更简单地说,假设JComponent
具有初始width=300
和height=300
,因此BALL
在这些指定的坐标内移动。现在,如果我调整我的JFrame
,那么JComponent
的大小仍然保持不变,即width=300
和height=300
,但我希望的是,能够用窗口的当前大小修改这些变量。如果我在解释我的问题时缺少一些东西,一定要让我知道
以下是我正在使用的代码:
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class BallAnimation
{
private int x;
private int y;
private int count;
private int width;
private int height;
private int speedValue;
private boolean flag;
/*
* These variables are used to keep track of
* the ball, either it is going LEFT or RIGHT
* depending on that, we will set the
* Co-ordinates.
*/
private boolean toLeft, toRight;
private boolean fromTop, fromBottom;
private Timer timer;
private JButton button;
private ActionListener actionTimer;
private ActionListener buttonAction;
public BallAnimation()
{
x = y = count = 0;
flag = toLeft = false;
toRight = true;
fromTop = true;
fromBottom = false;
speedValue = 5;
}
public static void main(String args[])
{
Runnable runnable = new Runnable()
{
public void run()
{
BallAnimation animation = new BallAnimation();
animation.go();
}
};
SwingUtilities.invokeLater(runnable);
}
public void go()
{
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//JPanel contentPane = new JPanel();
/*
* Class Name :
* Java Naming Convention says that class names
* should be in Pascal Case, i.e. the first
* letter of the class name should be capitalized
* and every new word must start with a capitalized
* Alphabet.
* For Example :
* public class ClassName{...}
* ----------------------------------------------------------
* Variable Name :
* Java Naming Convention says that the variable name
* should be in Camel Case, i.e. the first letter of
* the variable name should be small case or _ (underscore)
* and every new word must start with a capitalized
* Alphabet.
* ---------------------------------------------------------
*/
final MyDraw drawPanel = new MyDraw(0, 0);
x = drawPanel.getXValue();
y = drawPanel.getYValue();
//contentPane.add(drawPanel);
actionTimer = new ActionListener()
{
public void actionPerformed(ActionEvent ae)
{
if (fromTop && !fromBottom && x < width && y < height
&& toRight && !toLeft)
{
x += speedValue;
y += speedValue;
}
else if (fromTop && !fromBottom && x < width && y >= height
&& toRight && !toLeft)
{
/*
* Since the ball coming from the TOP LEFT Side
* touched the BOTTOM of the JPanel.
*/
y -= speedValue;
x += speedValue;
fromTop = false;
fromBottom = true;
}
else if (!fromTop && fromBottom && x < width && y <= 0
&& toRight && !toLeft)
{
/*
* Since the ball coming from BOTTOM LEFT Side
* touched the TOP of the JPanel.
*/
fromTop = true;
fromBottom = false;
x += speedValue;
y += speedValue;
}
else if (!fromTop && fromBottom && x < width && y < height
&& toRight && !toLeft)
{
x += speedValue;
y -= speedValue;
}
else if (!fromTop && fromBottom && x >= width && y < height
&& toRight && !toLeft)
{
/*
* Since the ball coming from the BOTTOM LEFT Side
* touched the RIGHT Side of the JPanel.
*/
toRight = false;
toLeft = true;
x -= speedValue;
y -= speedValue;
}
else if (!fromTop && fromBottom && x < width && y <= 0
&& !toRight && toLeft)
{
/*
* Since the ball coming from the BOTTOM RIGHT Side
* touched the Top Side of the JPanel.
*/
fromTop = true;
fromBottom = false;
x -= speedValue;
y += speedValue;
}
else if (fromTop && !fromBottom && x <= 0 && y < height
&& !toRight && toLeft)
{
/*
* Since the ball coming from the TOP RIGHT Side
* touched the LEFT Side of the JPanel.
*/
toRight = true;
toLeft = false;
x += speedValue;
y += speedValue;
}
else if (fromTop && !fromBottom && x >= width && y < height
&& toRight && !toLeft)
{
/*
* Since the ball coming from the TOP LEFT Side
* touched the RIGHT Side of the JPanel
*/
toRight = false;
toLeft = true;
x -= speedValue;
y += speedValue;
}
else if (fromTop && !fromBottom && x < width && y < height
&& !toRight && toLeft)
{
x -= speedValue;
y += speedValue;
}
else if (!fromTop && fromBottom && x <= 0 && y < height
&& !toRight && toLeft)
{
/*
* Since the ball coming from the BOTTOM RIGHT Side
* touched the LEFT Side of the JPanel.
*/
toRight = true;
toLeft = false;
x += speedValue;
y -= speedValue;
}
else if (!fromTop && fromBottom && x < width && y < height
&& !toRight && toLeft)
{
x -= speedValue;
y -= speedValue;
}
else if (fromTop && !fromBottom && x < width && y >= height
&& !toRight && toLeft)
{
/*
* Since the ball coming from the TOP RIGHT Side
* touched the BOTTOM Side of the JPanel.
*/
fromTop = false;
fromBottom = true;
x -= speedValue;
y -= speedValue;
}
System.out.println("X : " + x);
System.out.println("Y : " + y);
System.out.println("Direction is LEFT : " + toLeft);
System.out.println("Direction is RIGHT : " + toRight);
System.out.println("Coming from TOP : " + fromTop);
System.out.println("Coming from BOTTOM : " + fromBottom);
drawPanel.setXYValues(x, y);
}
};
buttonAction = new ActionListener()
{
public void actionPerformed(ActionEvent ae)
{
if (!flag)
{
timer.start();
button.setText("STOP ANIMATION");
flag = true;
}
else if (flag)
{
timer.stop();
button.setText("START ANIMATION");
flag = false;
}
}
};
button = new JButton("START ANIMATION");
button.addActionListener(buttonAction);
frame.getContentPane().add(drawPanel, BorderLayout.CENTER);
frame.getContentPane().add(button, BorderLayout.PAGE_END);
frame.setSize(300, 300);
//frame.pack();
frame.setVisible(true);
timer = new Timer(40, actionTimer);
width = drawPanel.getWidth() - 30;
System.out.println("WIDTH : " + width);
height = drawPanel.getHeight() - 30;
System.out.println("HEIGHT : " + height);
}
class MyDraw extends JComponent
{
private int x;
private int y;
private Timer timer;
public MyDraw(int x, int y)
{
this.x = x;
this.y = y;
}
public int getXValue()
{
return x;
}
public int getYValue()
{
return y;
}
public void setXYValues(int x, int y)
{
this.x = x;
this.y = y;
repaint();
}
public Dimension getPreferredSize()
{
return (new Dimension(300, 300));
}
public void paintComponent(Graphics g)
{
g.setColor(Color.WHITE);
g.fillRect(0, 0, getWidth(), getHeight());
g.setColor(Color.BLUE);
g.fillOval(x, y, 40, 40);
}
}
}
import javax.swing.*;
导入java.awt.*;
导入java.awt.event.*;
公共课叙事
{
私人INTX;
私营企业;
私人整数计数;
私有整数宽度;
私人内部高度;
私人价值;
私有布尔标志;
/*
*这些变量用于跟踪
*球要么向左,要么向右
*根据这一点,我们将设置
*坐标。
*/
私有布尔toLeft,toRight;
自上而下的私有布尔值;
私人定时器;
私人按钮;
私有ActionListener actionTimer;
私人动作监听按钮;
公共民谣()
{
x=y=count=0;
flag=toLeft=false;
toRight=正确;
fromTop=true;
fromBottom=false;
速度值=5;
}
公共静态void main(字符串参数[])
{
Runnable Runnable=新的Runnable()
{
公开募捐
{
BallAnimation动画=新的BallAnimation();
动画。go();
}
};
SwingUtilities.invokeLater(可运行);
}
公开作废go()
{
JFrame=新JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//JPanel contentPane=新的JPanel();
/*
*类名:
*Java命名约定说类名
*应在Pascal情况下,即第一个
*类名的字母应该大写
*每个新词都必须以大写字母开头
*字母表。
*例如:
*公共类类名{…}
* ----------------------------------------------------------
*变量名:
*Java命名约定表示变量名
*应为驼色字母,即字母的第一个字母
*变量名应为小写或ux(下划线)
*每个新词都必须以大写字母开头
*字母表。
* ---------------------------------------------------------
*/
最终MyDraw drawPanel=新的MyDraw(0,0);
x=drawPanel.getXValue();
y=drawPanel.getYValue();
//contentPane.add(drawPanel);
actionTimer=新建ActionListener()
{
已执行的公共无效行动(行动事件ae)
{
如果(从上到下)&&x<宽度和y<高度
&&toRight&!toLeft)
{
x+=速度值;
y+=速度值;
}
否则,如果(从顶部开始&&!从底部开始&&x<宽度&&y>=高度
&&toRight&!toLeft)
{
/*
*因为球从左上方传来
*触到了JPanel的底部。
*/
y-=速度值;
x+=速度值;
fromTop=false;
fromBottom=true;
}
如果(!fromTop&&fromtown&&x 否则,如果(!fromTop&&fromtown&&xWindowEventListener
?)绑定到JFrame,以便在窗口尺寸更改时更新width
和height
。现在这是一个完整的代码帮助!试试这个变体(打断一两件事,但解决了主要问题)。解决方法是根据组件的当前大小确定宽度/高度
package test;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class BallAnimation
{
private int x;
private int y;
private int count;
//private int drawPanel.getWidth();
//private int drawPanel.getHeight();
private int speedValue;
private boolean flag;
/*
* These variables are used to keep track of
* the ball, either it is going LEFT or RIGHT
* depending on that, we will set the
* Co-ordinates.
*/
private boolean toLeft, toRight;
private boolean fromTop, fromBottom;
private Timer timer;
private JButton button;
private ActionListener actionTimer;
private ActionListener buttonAction;
MyDraw drawPanel;
public BallAnimation()
{
x = y = count = 0;
flag = toLeft = false;
toRight = true;
fromTop = true;
fromBottom = false;
speedValue = 5;
}
public static void main(String args[])
{
Runnable runnable = new Runnable()
{
public void run()
{
BallAnimation animation = new BallAnimation();
animation.go();
}
};
SwingUtilities.invokeLater(runnable);
}
public void go()
{
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//JPanel contentPane = new JPanel();
/*
* Class Name :
* Java Naming Convention says that class names
* should be in Pascal Case, i.e. the first
* letter of the class name should be capitalized
* and every new word must start with a capitalized
* Alphabet.
* For Example :
* public class ClassName{...}
* ----------------------------------------------------------
* Variable Name :
* Java Naming Convention says that the variable name
* should be in Camel Case, i.e. the first letter of
* the variable name should be small case or _ (underscore)
* and every new word must start with a capitalized
* Alphabet.
* ---------------------------------------------------------
*/
drawPanel = new MyDraw(0, 0);
x = drawPanel.getXValue();
y = drawPanel.getYValue();
//contentPane.add(drawPanel);
actionTimer = new ActionListener()
{
public void actionPerformed(ActionEvent ae)
{
if (fromTop && !fromBottom && x < drawPanel.getWidth() && y < drawPanel.getHeight()
&& toRight && !toLeft)
{
x += speedValue;
y += speedValue;
}
else if (fromTop && !fromBottom && x < drawPanel.getWidth() && y >= drawPanel.getHeight()
&& toRight && !toLeft)
{
/*
* Since the ball coming from the TOP LEFT Side
* touched the BOTTOM of the JPanel.
*/
y -= speedValue;
x += speedValue;
fromTop = false;
fromBottom = true;
}
else if (!fromTop && fromBottom && x < drawPanel.getWidth() && y <= 0
&& toRight && !toLeft)
{
/*
* Since the ball coming from BOTTOM LEFT Side
* touched the TOP of the JPanel.
*/
fromTop = true;
fromBottom = false;
x += speedValue;
y += speedValue;
}
else if (!fromTop && fromBottom && x < drawPanel.getWidth() && y < drawPanel.getHeight()
&& toRight && !toLeft)
{
x += speedValue;
y -= speedValue;
}
else if (!fromTop && fromBottom && x >= drawPanel.getWidth() && y < drawPanel.getHeight()
&& toRight && !toLeft)
{
/*
* Since the ball coming from the BOTTOM LEFT Side
* touched the RIGHT Side of the JPanel.
*/
toRight = false;
toLeft = true;
x -= speedValue;
y -= speedValue;
}
else if (!fromTop && fromBottom && x < drawPanel.getWidth() && y <= 0
&& !toRight && toLeft)
{
/*
* Since the ball coming from the BOTTOM RIGHT Side
* touched the Top Side of the JPanel.
*/
fromTop = true;
fromBottom = false;
x -= speedValue;
y += speedValue;
}
else if (fromTop && !fromBottom && x <= 0 && y < drawPanel.getHeight()
&& !toRight && toLeft)
{
/*
* Since the ball coming from the TOP RIGHT Side
* touched the LEFT Side of the JPanel.
*/
toRight = true;
toLeft = false;
x += speedValue;
y += speedValue;
}
else if (fromTop && !fromBottom && x >= drawPanel.getWidth() && y < drawPanel.getHeight()
&& toRight && !toLeft)
{
/*
* Since the ball coming from the TOP LEFT Side
* touched the RIGHT Side of the JPanel
*/
toRight = false;
toLeft = true;
x -= speedValue;
y += speedValue;
}
else if (fromTop && !fromBottom && x < drawPanel.getWidth() && y < drawPanel.getHeight()
&& !toRight && toLeft)
{
x -= speedValue;
y += speedValue;
}
else if (!fromTop && fromBottom && x <= 0 && y < drawPanel.getHeight()
&& !toRight && toLeft)
{
/*
* Since the ball coming from the BOTTOM RIGHT Side
* touched the LEFT Side of the JPanel.
*/
toRight = true;
toLeft = false;
x += speedValue;
y -= speedValue;
}
else if (!fromTop && fromBottom && x < drawPanel.getWidth() && y < drawPanel.getHeight()
&& !toRight && toLeft)
{
x -= speedValue;
y -= speedValue;
}
else if (fromTop && !fromBottom && x < drawPanel.getWidth() && y >= drawPanel.getHeight()
&& !toRight && toLeft)
{
/*
* Since the ball coming from the TOP RIGHT Side
* touched the BOTTOM Side of the JPanel.
*/
fromTop = false;
fromBottom = true;
x -= speedValue;
y -= speedValue;
}
System.out.println("X : " + x);
System.out.println("Y : " + y);
System.out.println("Direction is LEFT : " + toLeft);
System.out.println("Direction is RIGHT : " + toRight);
System.out.println("Coming from TOP : " + fromTop);
System.out.println("Coming from BOTTOM : " + fromBottom);
drawPanel.setXYValues(x, y);
}
};
buttonAction = new ActionListener()
{
public void actionPerformed(ActionEvent ae)
{
if (!flag)
{
timer.start();
button.setText("STOP ANIMATION");
flag = true;
}
else if (flag)
{
timer.stop();
button.setText("START ANIMATION");
flag = false;
}
}
};
button = new JButton("START ANIMATION");
button.addActionListener(buttonAction);
frame.getContentPane().add(drawPanel, BorderLayout.CENTER);
frame.getContentPane().add(button, BorderLayout.PAGE_END);
frame.setSize(300, 300);
//frame.pack();
frame.setVisible(true);
timer = new Timer(40, actionTimer);
System.out.println("WIDTH : " + drawPanel.getWidth());
System.out.println("HEIGHT : " + drawPanel.getHeight());
}
class MyDraw extends JComponent
{
private int x;
private int y;
private Timer timer;
public MyDraw(int x, int y)
{
this.x = x;
this.y = y;
}
public int getXValue()
{
return x;
}
public int getYValue()
{
return y;
}
public void setXYValues(int x, int y)
{
this.x = x;
this.y = y;
repaint();
}
public Dimension getPreferredSize()
{
return (new Dimension(300, 300));
}
public void paintComponent(Graphics g)
{
g.setColor(Color.WHITE);
g.fillRect(0, 0, getWidth(), getHeight());
g.setColor(Color.BLUE);
g.fillOval(x, y, 40, 40);
}
}
}
封装测试;
导入javax.swing.*;
导入java.awt.*;
导入java.awt.event.*;
公共课叙事
{
私人INTX;
私营企业;
私人整数计数;
//私有int drawPanel.getWidth();
//private int drawPanel.getHeight();
私人价值;
私有布尔标志;
/*
*这些变量用于跟踪
*球要么向左,要么向右
*根据这一点,我们将设置
*坐标。
*/
私有布尔toLeft,toRight;
自上而下的私有布尔值;
私人定时器;
私人按钮;
私有ActionListener actionTimer;
私人动作监听按钮;
MyDraw绘图面板;
公共民谣()
{
x=y=count=0;
flag=toLeft=false;
toRight=正确;
fromTop=true;
fromBottom=false;
private HierarchyBoundsListener boundsListener =
new HierarchyBoundsListener()
{
public void ancestorMoved(HierarchyEvent he)
{
}
public void ancestorResized(HierarchyEvent he)
{
JComponent component = (JComponent) he.getComponent();
width = component.getWidth() - 30;
height = component.getHeight() - 30;
}
};
drawPanel.addHierarchyBoundsListener(boundsListener);