Java 无法使用计时器重新绘制窗口
我有一个按钮,有初始的起始位置。按钮的Y轴应始终保持不变,但x轴应每秒改变一次。计时器每秒将x的值增加10,然后重新绘制窗口。x的值似乎增加得很好,但即使调用了repaint和validate方法,组件也不会更新Java 无法使用计时器重新绘制窗口,java,Java,我有一个按钮,有初始的起始位置。按钮的Y轴应始终保持不变,但x轴应每秒改变一次。计时器每秒将x的值增加10,然后重新绘制窗口。x的值似乎增加得很好,但即使调用了repaint和validate方法,组件也不会更新 import java.awt.Container; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.ImageIcon; import javax
import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JWindow;
import javax.swing.Timer;
public class TedmadLogo {
JWindow myWindow = new JWindow();
Container container = myWindow.getContentPane();
JPanel panel = new JPanel();
ImageIcon image = new ImageIcon("bg.jpg");
ImageIcon image2 = new ImageIcon("bg2.jpg");
JButton button1 = new JButton("Button");
JLabel bg = new JLabel(image);
JLabel bg2 = new JLabel(image2);
int x = 50;
ActionListener taskPerformer = new ActionListener() {
public void actionPerformed(ActionEvent evt) {
x += 10;
myWindow.getContentPane().validate();
myWindow.getContentPane().repaint();
System.out.println(x);
timer.restart();
}
};
Timer timer = new Timer(1000, taskPerformer);
public TedmadLogo() {
myWindow.setLayout(null);
panel.setLayout(null);
myWindow.setSize(600, 300);
myWindow.setVisible(true);
myWindow.setLocationRelativeTo(null);
container.add(panel);
panel.setBounds(0, 0, 600, 300);
panel.add(button1);
panel.add(bg2);
panel.add(bg);
button1.setBounds(x, 150, 30, 30);
bg2.setBounds(150, 0, 600, 300);
bg.setBounds(-150, 0, 600, 300);
}
public static void main(String[] args) {
TedmadLogo logo = new TedmadLogo();
logo.timer.start();
}
}
呃,仅仅更改
x
变量的值并不能神奇地重新初始化构造函数中最初设置的所有组件。此外,如果内存正常,就不能保证仅仅因为调用了该方法就可以重新绘制。我相信它的工作原理和试图强制GC一样…这是一个建议(现在是做XXX的好时机),而不是命令(现在做XXX!!!)。我更像是一个web开发人员,所以我根本不处理Swing,所以我可能错了。看起来您需要在Listener方法中重新调用button1.setBounds(…)。但是,请参见CodeChimp的comment.ohh my bad,我不应该调用repaint和validate方法,而是应该添加这行按钮1.setBounds(x,150,30,30);现在它起作用了@感悟谢谢你的评论帮助了我。@AaronKurtzhals非常感谢,这很有帮助,而且很有效。