尽管我使用writen frame.repaint()从循环中调用paintComponent()方法,但为什么仍观察到球的movemet import javax.swing.*; 导入java.awt.*; 导入java.awt.event.*; 类JAnimation实现ActionListener { JFrame框架; int x=40,y=40; 公共静态void main(字符串参数[]) { 新JAnimation().go(); } 公开作废go() { frame=新的JFrame(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JButton button=新JButton(“单击开始动画”); addActionListener(这个); MyDrawPanel=新建MyDrawPanel(); frame.getContentPane().add(BorderLayout.SOUTH,按钮); frame.getContentPane().add(BorderLayout.CENTER,panel); 框架。设置尺寸(300300); frame.setVisible(true); } 已执行的公共无效操作(操作事件e1) { System.out.println(“印度”) 对于(int i=0;i
您正在阻止EDT线程,因为该面板未更新。您冻结gui。您可以使用swing timer而不是线程在不阻止EDT的情况下为循环设置动画。请阅读 下面是一个例子尽管我使用writen frame.repaint()从循环中调用paintComponent()方法,但为什么仍观察到球的movemet import javax.swing.*; 导入java.awt.*; 导入java.awt.event.*; 类JAnimation实现ActionListener { JFrame框架; int x=40,y=40; 公共静态void main(字符串参数[]) { 新JAnimation().go(); } 公开作废go() { frame=新的JFrame(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JButton button=新JButton(“单击开始动画”); addActionListener(这个); MyDrawPanel=新建MyDrawPanel(); frame.getContentPane().add(BorderLayout.SOUTH,按钮); frame.getContentPane().add(BorderLayout.CENTER,panel); 框架。设置尺寸(300300); frame.setVisible(true); } 已执行的公共无效操作(操作事件e1) { System.out.println(“印度”) 对于(int i=0;i,java,Java,您正在阻止EDT线程,因为该面板未更新。您冻结gui。您可以使用swing timer而不是线程在不阻止EDT的情况下为循环设置动画。请阅读 下面是一个例子 import javax.swing.*; import java.awt.*; import java.awt.event.*; class JAnimation implements ActionListener { JFrame frame; int x=40,y=40; public static void main(S
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
class JAnimation implements ActionListener
{
JFrame frame;
int x=40,y=40;
public static void main(String args[])
{
new JAnimation().go();
}
public void go()
{
frame=new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JButton button=new JButton("CLICK TO START ANIMATION");
button.addActionListener(this);
MyDrawPanel panel=new MyDrawPanel();
frame.getContentPane().add(BorderLayout.SOUTH,button);
frame.getContentPane().add(BorderLayout.CENTER,panel);
frame.setSize(300,300);
frame.setVisible(true);
}
public void actionPerformed(ActionEvent e1)
{
System.out.println("INDIA")
for(int i=0;i<130;i++)
{
x++;
y++;
frame.repaint();
try
{
Thread.sleep(50);
}
catch(Exception e)
{
System.out.println(e);
}
}
}
class MyDrawPanel extends JPanel
{
public void paintComponent(Graphics g1)
{
System.out.println("HII");
Graphics2D g2=(Graphics2D)g1;
g2.setColor(Color.white);
g2.fillOval(0,0,this.getWidth(),this.getHeight());
g2.setColor(Color.green);
g2.fillOval(x,y,70,70);
System.out.println(x);
}
}
}
由于该面板未更新,您正在阻止EDT线程。您可以冻结gui。您可以使用swing timer而不是thread在不阻止EDT的情况下为循环设置动画。读取 下面是一个例子
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
class JAnimation implements ActionListener
{
JFrame frame;
int x=40,y=40;
public static void main(String args[])
{
new JAnimation().go();
}
public void go()
{
frame=new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JButton button=new JButton("CLICK TO START ANIMATION");
button.addActionListener(this);
MyDrawPanel panel=new MyDrawPanel();
frame.getContentPane().add(BorderLayout.SOUTH,button);
frame.getContentPane().add(BorderLayout.CENTER,panel);
frame.setSize(300,300);
frame.setVisible(true);
}
public void actionPerformed(ActionEvent e1)
{
System.out.println("INDIA")
for(int i=0;i<130;i++)
{
x++;
y++;
frame.repaint();
try
{
Thread.sleep(50);
}
catch(Exception e)
{
System.out.println(e);
}
}
}
class MyDrawPanel extends JPanel
{
public void paintComponent(Graphics g1)
{
System.out.println("HII");
Graphics2D g2=(Graphics2D)g1;
g2.setColor(Color.white);
g2.fillOval(0,0,this.getWidth(),this.getHeight());
g2.setColor(Color.green);
g2.fillOval(x,y,70,70);
System.out.println(x);
}
}
}
抱歉..为什么没有观察到球的移动..您可以使用摆动计时器。您正在修改建议:编辑您的问题以修复标题以及代码的间距/格式。您可能还想添加一些关于您面临的问题的更多描述,例如,您预期会发生什么以及会发生什么。这将鼓励更多的人尝试并帮助你。一般来说:你在问题上投入的精力越多,人们在回答问题上投入的精力就越多。对不起……为什么没有观察到球的运动。?你可以使用摆动计时器。你正在尝试建议:编辑你的问题以修复标题以及代码的间距/格式。你可以可能还需要对您面临的问题进行更多描述,例如,您预期会发生什么以及会发生什么。这将鼓励更多的人尝试帮助您。一般来说:您在问题上投入的精力越多,人们在尝试回答问题上投入的精力就越多。这是一个很好的答案。基本问题是您正在从事件调度线程(EDT)调用重新绘制。在actionPerformed方法退出之前,它无法执行。在此解决方案中,快速动作侦听器的多个实例会每隔一段时间放入事件调度队列。请参阅文档了解更多信息和其他可能的解决方案。@kushagra我不明白?您也可以使用线程,但不能使用l类似于此,您必须从edt更新guithread@kushagra阅读这篇文章和这篇文章,先生,我没有掌握关于edt的概念。实际上我是java初学者。你能解释一下上面的代码吗?请帮助我,先生。@kushagra你称之为
thread.sleep(50)
所以更新gui的EDT线程睡眠50毫秒。那么谁在更新它?没有人。因为你的帧看起来冻结。如果你尝试调整帧大小,你将看不到任何更新。即使你移动球直到EDT重新绘制球,你也看不到它在移动。这是一个很好的答案。基本的问题是你正在调用它从事件分派线程(EDT)重新绘制。在actionPerformed方法退出之前,它无法执行。在此解决方案中,快速动作侦听器的多个实例会每隔一段时间放入事件调度队列。请参阅文档了解更多信息和其他可能的解决方案。@kushagra我不明白?您也可以使用线程,但不能使用l类似于此,您必须从edt更新guithread@kushagra阅读这篇文章和这篇文章,先生,我没有掌握关于edt的概念。实际上我是java初学者。你能解释一下上面的代码吗?请帮助我,先生。@kushagra你称之为thread.sleep(50)
所以更新gui的EDT线程睡眠50毫秒。那么谁在更新它?没有人。因为你的帧看起来冻结。如果你尝试调整帧大小,你将看不到任何更新。即使你移动球,直到EDT重新绘制球,你也看不到它在移动。