Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/394.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 无法使用计时器重新绘制窗口_Java - Fatal编程技术网

Java 无法使用计时器重新绘制窗口

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

我有一个按钮,有初始的起始位置。按钮的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.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非常感谢,这很有帮助,而且很有效。