如何在java中自动移动圆?
我不熟悉JavaGUI,正在努力学习它。我想在屏幕上自动移动一个圆圈(即不通过按任何键或执行任何其他操作)。我通过做一些动作找到了移动它的方法,但这不是我需要的。谁能告诉我最简单的方法吗 我想在以下代码中删除动作侦听器,以便圆圈自动移动:如何在java中自动移动圆?,java,swing,animation,jframe,awt,Java,Swing,Animation,Jframe,Awt,我不熟悉JavaGUI,正在努力学习它。我想在屏幕上自动移动一个圆圈(即不通过按任何键或执行任何其他操作)。我通过做一些动作找到了移动它的方法,但这不是我需要的。谁能告诉我最简单的方法吗 我想在以下代码中删除动作侦听器,以便圆圈自动移动: public class MyFirstGraphics extends JFrame { int x = 100; int y = 100; MyFirstGraphics() { super("Circle");
public class MyFirstGraphics extends JFrame {
int x = 100;
int y = 100;
MyFirstGraphics() {
super("Circle");
setSize(800, 800);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
getContentPane().setBackground(Color.pink);
JButton f = new JButton("circle");
f.addActionListener(new re());
add(f, BorderLayout.NORTH);
}
private class re implements ActionListener {
public void actionPerformed(ActionEvent e) {
for (int i = 1; i < 50; i++) {
x++;
y++;
repaint();
}
}
}
public void paint(Graphics g) {
super.paint(g);
g.drawOval(x, y, 100, 100);
}
public static void main(String[] args) {
MyFirstGraphics l = new MyFirstGraphics();
l.setVisible(true);
}
}
公共类MyFirstGraphics扩展JFrame{
int x=100;
int y=100;
MyFirstGraphics(){
超级(“圆圈”);
设置大小(800800);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
getContentPane().setBackground(颜色为.pink);
JButton f=新JButton(“圆”);
f、 addActionListener(新的re());
添加(f,边界布局。北);
}
私有类重新实现ActionListener{
已执行的公共无效操作(操作事件e){
对于(int i=1;i<50;i++){
x++;
y++;
重新油漆();
}
}
}
公共空间涂料(图g){
超级油漆(g);
g、 牵引椭圆(x,y,100100);
}
公共静态void main(字符串[]args){
MyFirstGraphics l=新的MyFirstGraphics();
l、 setVisible(真);
}
}
若要设置该代码的动画,请使用基于Swing的计时器
,并将re
ActionListener
作为构造函数中的一个参数(另一个参数是延迟)
有关详细信息和工作示例,请参见。让我们从动画是随时间变化的幻觉这一事实开始。此外,Swing是一个单线程环境。您不能“阻止”Swing线程(也称为事件调度线程)并让它绘制更新,您需要某种方法定期安排更新,以便应用更改,然后重新绘制更改 所以您的第一个问题是您的
操作执行
方法
for (int i = 1; i < 50; i++) {
x++;
y++;
repaint();
}
for(int i=1;i<50;i++){
x++;
y++;
重新油漆();
}
基本上,唯一可以上漆的是150x150的球,中间没有其他东西可以上漆
相反,你需要把它改成更像
public void actionPerformed(ActionEvent e) {
if (x < 150 && y < 150) {
x++;
y++;
} else {
((Timer)e.getSource()).stop();
}
repaint();
}
public void actionPerformed(ActionEvent e){
如果(x<150&&y<150){
x++;
y++;
}否则{
((计时器)e.getSource()).stop();
}
重新油漆();
}
看看:
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.Timer;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
public class BounceyDot {
public static void main(String[] args) {
new BounceyDot();
}
public BounceyDot() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
}
JFrame frame = new JFrame("Testing");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new BorderLayout());
frame.add(new TestPane());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public class TestPane extends JPanel {
private int x = 0;
private int y = 100;
private int radius = 20;
private int xDelta = 2;
public TestPane() {
Timer timer = new Timer(40, new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
x += xDelta;
if (x + (radius * 2) > getWidth()) {
x = getWidth() - (radius * 2);
xDelta *= -1;
} else if (x < 0) {
x = 0;
xDelta *= -1;
}
repaint();
}
});
timer.start();
}
@Override
public Dimension getPreferredSize() {
return new Dimension(200, 200);
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.setColor(Color.RED);
g.fillOval(x, y - radius, radius * 2, radius * 2);
}
}
}
导入java.awt.BorderLayout;
导入java.awt.Color;
导入java.awt.Dimension;
导入java.awt.EventQueue;
导入java.awt.Graphics;
导入java.awt.event.ActionEvent;
导入java.awt.event.ActionListener;
导入javax.swing.JFrame;
导入javax.swing.JPanel;
导入javax.swing.Timer;
导入javax.swing.UIManager;
导入javax.swing.UnsupportedLookAndFeelException;
公共类弹跳点{
公共静态void main(字符串[]args){
新弹跳点();
}
公共弹跳点(){
invokeLater(新的Runnable(){
@凌驾
公开募捐{
试一试{
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
}catch(ClassNotFoundException |实例化Exception | IllegalacessException |不支持ookandfeelException ex){
}
JFrame=新JFrame(“测试”);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(新的BorderLayout());
frame.add(newtestpane());
frame.pack();
frame.setLocationRelativeTo(空);
frame.setVisible(true);
}
});
}
公共类TestPane扩展了JPanel{
私有整数x=0;
私人int y=100;
私有整数半径=20;
私有int xDelta=2;
公共测试窗格(){
计时器计时器=新计时器(40,新ActionListener(){
@凌驾
已执行的公共无效操作(操作事件e){
x+=xDelta;
如果(x+(半径*2)>getWidth()){
x=getWidth()-(半径*2);
xDelta*=-1;
}else如果(x<0){
x=0;
xDelta*=-1;
}
重新油漆();
}
});
timer.start();
}
@凌驾
公共维度getPreferredSize(){
返回新维度(200200);
}
@凌驾
受保护组件(图形g){
超级组件(g);
g、 setColor(Color.RED);
g、 圆角(x,y-半径,半径*2,半径*2);
}
}
}
SO上有很多示例,例如(滚动到底部)。你还应该看一看,关于如何实现的细节,动画也不是一个简单的主题(有趣,但不简单)。上面评论中的链接示例与Swing中的示例一样简单:“我找到了一种通过执行某些操作来移动它的方法,但这不是我所需要的。”为了更快地获得更好的帮助,请发布一个(最简单的完整且可验证的示例)。@AndrewThompson发布了一个示例代码。对代码块使用一致且逻辑性强的缩进。代码的缩进旨在帮助人们理解程序流程。谢谢!那正是我要找的东西。再次感谢。非常感谢。真的很有帮助。