2015-02-08 101 views
0

如何在每次通过Swing计时器更改GUI的坐标时重新绘制图形?使用计时器在新位置处重绘JComponent

这里是我的代码片段:一旦循环完成因此不显示的切换效果,我想看看

t = new Timer(500,new ActionListener() { 
     public void actionPerformed(ActionEvent arg0) { 
      for(int i=0;i<=100;i++) { 
       panel.setBounds(i,100,550,336); 
       panel.repaint(); 
      } 
      t.stop(); 
     } 
    }); 
    t.start(); 

我的键盘仅重绘。

+0

'panel.setBounds(I,100550336);'1)的GUI的Java必须在不同的操作系统工作”,屏幕大小,屏幕分辨率等等。这样,它们不利于像素完美的布局。请使用布局管理器或[它们的组合](http://stackoverflow.com/a/5630271/418556)以及[white space]的布局填充和边框(http://stackoverflow.com/a/17874718/ 418556)。 2)为了更快地获得更好的帮助,请发布[MCVE](http://stackoverflow.com/help/mcve)(最小完整可验证示例)或[SSCCE](http://www.sscce.org/)(简称,自包含,正确的例子)。 – 2015-02-08 10:18:06

+0

'我的面板只重画一次循环完成,因此不显示我想看到的过渡效果' 尝试多线程! – 2015-02-08 10:48:33

+0

我想避免尽可能多的线程 – meatno 2015-02-08 10:50:17

回答

1

我的面板只有在完成循环后才重新绘制,因此不会显示我想要看到的过渡效果。

以下是仅使用Swing Timer成功移动组件的示例。我得出结论,问题出现在上面没有显示的代码中。

enter image description here

import java.awt.*; 
import java.awt.event.*; 
import java.awt.image.BufferedImage; 
import javax.swing.*; 
import javax.swing.border.*; 

public class BouncingLabel { 

    private JComponent ui = null; 
    int xD = 1; 
    int yD = 1; 
    int l = 101; 
    int r = 100; 
    int t = 50; 
    int b = 50; 

    BouncingLabel() { 
     initUI(); 
    } 

    public void initUI() { 
     if (ui != null) { 
      return; 
     } 

     ui = new JPanel(new BorderLayout(4, 4)); 
     ui.setBorder(new CompoundBorder(
       new EmptyBorder(4, 4, 4, 4), 
       new LineBorder(Color.BLACK))); 

     final JLabel label = new JLabel(new ImageIcon(
       new BufferedImage(20, 20, BufferedImage.TYPE_INT_RGB))); 
     ui.add(label); 
     EmptyBorder emptyBorder = new EmptyBorder(t, l, b, r); 
     label.setBorder(emptyBorder); 
     ActionListener listener = new ActionListener() { 

      @Override 
      public void actionPerformed(ActionEvent e) { 
       Border border = label.getBorder(); 
       Insets insets = border.getBorderInsets(label); 
       if (l == 0 | r == 0) { 
        xD = -xD; 
       } 
       if (t == 0 || b == 0) { 
        yD = -yD; 
       } 
       l = l + xD; 
       r = r - xD; 
       t = t + yD; 
       b = b - yD; 
       label.setBorder(new EmptyBorder(t, l, b, r)); 
      } 
     }; 
     Timer timer = new Timer(15, listener); 
     timer.start(); 
    } 

    public JComponent getUI() { 
     return ui; 
    } 

    public static void main(String[] args) { 
     Runnable r = new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(
          UIManager.getSystemLookAndFeelClassName()); 
       } catch (Exception useDefault) { 
       } 
       BouncingLabel o = new BouncingLabel(); 

       JFrame f = new JFrame("Bouncing Square"); 
       f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       f.setLocationByPlatform(true); 

       f.setContentPane(o.getUI()); 
       f.pack(); 
       f.setMinimumSize(f.getSize()); 

       f.setVisible(true); 
      } 
     }; 
     SwingUtilities.invokeLater(r); 
    } 
}