Java Gui和计时器问题
上周我问了一个关于Gui和计时器的问题。。。经过大量的研究,我发现没有任何东西可以与我的代码一起工作。。。如果有人能接受我的代码,并以某种方式操纵它工作,那将是惊人的。。。我希望我的代码显示一个框,然后使它与背景颜色相同的框重叠,然后在它旁边延迟显示一个新框 第一个代码:Java Gui和计时器问题,java,swing,user-interface,Java,Swing,User Interface,上周我问了一个关于Gui和计时器的问题。。。经过大量的研究,我发现没有任何东西可以与我的代码一起工作。。。如果有人能接受我的代码,并以某种方式操纵它工作,那将是惊人的。。。我希望我的代码显示一个框,然后使它与背景颜色相同的框重叠,然后在它旁边延迟显示一个新框 第一个代码: import java.awt.Graphics; import javax.swing.JPanel; import java.awt.Color; public class MovingSomething extends
import java.awt.Graphics;
import javax.swing.JPanel;
import java.awt.Color;
public class MovingSomething extends JPanel
{
public void paintComponent (final Graphics g)
{
int i = 20;
int cons = 50;
int red = 40;
int green = 50;
g.setColor(Color.GREEN);
g.fillRect(50, 50, 100, 100);
while (i >= 0)
{
i -= 1;
g.setColor(Color.RED);
g.fillRect(red, cons, 100, 100);
red += 10;
g.setColor(Color.GREEN);
g.fillRect(green, cons, 100, 100);
green += 10;
}
}
}
只是为了你的一点帮助开始,我张贴这个代码。尽管请尝试从中学习,并提出有效的问题,这可能会出现,以获得整个事情的味道。如果你再努力一点,毫无疑问,你可以找到这个很棒的医生,这正好解释了你在这个例子中的需求 最新编辑: 请尝试此修改的代码,CustomPanel类与以前相同:
import java.awt.*;
import java.awt.event.*;
import java.util.Random;
import javax.swing.*;
public class MovingSquare
{
private int x = 0;
private int y = 100;
private final int WIDTH = 100;
private final int HEIGHT = 100;
private Random random;
private CustomPanel canvas;
private Timer drawingTimer;
private ActionListener timerAction =
new ActionListener()
{
@Override
public void actionPerformed(ActionEvent ae)
{
/*if ((x + WIDTH > 500) && (y + HEIGHT > 500))
{
x = random.nextInt(500 - WIDTH);
canvas.setValues(x, y, Color.BLUE);
}
else
{
x += WIDTH;
canvas.setValues(x, y, Color.BLUE);
}*/
x = random.nextInt(500 - WIDTH);
y = random.nextInt(500 - HEIGHT);
canvas.setValues(x, y, new Color(
random.nextFloat(), random.nextFloat()
, random.nextFloat(), random.nextFloat()));
}
};
public MovingSquare()
{
random = new Random();
}
private void displayGUI()
{
JFrame frame = new JFrame("Moving Sqaure");
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
canvas = new CustomPanel();
frame.setContentPane(canvas);
frame.pack();
frame.setLocationByPlatform(true);
frame.setVisible(true);
drawingTimer = new Timer(1000, timerAction);
drawingTimer.start();
}
public static void main(String... args)
{
SwingUtilities.invokeLater(new Runnable()
{
@Override
public void run()
{
new MovingSquare().displayGUI();
}
});
}
}
最大的错误来自未经测试发布的代码,没有调用super.paintcomponent;它应该是重写的paintComponent方法中的第一个调用。不要忘记@Override注释,以确保覆盖了正确的方法。另外,请发布一个SSCCE,该SSCCE可通过复制和粘贴运行/编译。没有多少人喜欢每次都要重新创建JFrame,有时一天几次,如果有人能把我的代码用某种方式处理好,那就太棒了。。。我希望我的代码…:这看起来更像是一个代码转储,而不是一个实际问题。请不要简单地转储您的代码并让其他人为您修复它,而是展示您在解决方案方面的尝试,并询问有关此尝试的问题。投票结束是因为太本地化了。另外,在你的网站上你也得到了很好的建议。在上面的代码中,我看不到您尝试遵循此建议的结果。你在哪里尝试编码计时器?非常感谢你。。。我知道我可能看起来像个试图欺骗自己的混蛋,但老实说,我已经四处寻找并尝试了好几个星期了。。。再加上在我的课程中,老师现在不是在教gui。。。我选择使用GUI,而我最大的问题是,没有太多的模板供我使用。。我会把这个代码,并掌握在我自己的写作。。。你是一个救生员,安德烈,非常欢迎你,保持微笑。如果你真的想学习Swing,也想了解一下,对于富互联网应用程序,Java Swing IMHO的未来就在这里。。。当您呼叫公用电话铃时。。args为什么需要添加?在这段代码中,x组件在什么时候发生变化。。。比如说哪行代码决定了它的移动距离?嗯,字符串。。。是写字符串[]的另一种方式,或者您也可以写字符串\u005B\u005D,它们都是相同的东西,尽管在这里给出了两者的一个区别。关于第二个问题,请注意Moving Square类中ActionListener类的actionPerformed方法,在if else块中x发生了变化,表示x+=WIDTH或x=0:-
import java.awt.*;
import java.awt.event.*;
import java.util.Random;
import javax.swing.*;
public class MovingSquare
{
private int x = 0;
private int y = 100;
private final int WIDTH = 100;
private final int HEIGHT = 100;
private Random random;
private CustomPanel canvas;
private Timer drawingTimer;
private ActionListener timerAction =
new ActionListener()
{
@Override
public void actionPerformed(ActionEvent ae)
{
/*if ((x + WIDTH > 500) && (y + HEIGHT > 500))
{
x = random.nextInt(500 - WIDTH);
canvas.setValues(x, y, Color.BLUE);
}
else
{
x += WIDTH;
canvas.setValues(x, y, Color.BLUE);
}*/
x = random.nextInt(500 - WIDTH);
y = random.nextInt(500 - HEIGHT);
canvas.setValues(x, y, new Color(
random.nextFloat(), random.nextFloat()
, random.nextFloat(), random.nextFloat()));
}
};
public MovingSquare()
{
random = new Random();
}
private void displayGUI()
{
JFrame frame = new JFrame("Moving Sqaure");
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
canvas = new CustomPanel();
frame.setContentPane(canvas);
frame.pack();
frame.setLocationByPlatform(true);
frame.setVisible(true);
drawingTimer = new Timer(1000, timerAction);
drawingTimer.start();
}
public static void main(String... args)
{
SwingUtilities.invokeLater(new Runnable()
{
@Override
public void run()
{
new MovingSquare().displayGUI();
}
});
}
}