我的面板只有在完成循环后才重新绘制,因此不会显示我想要看到的过渡效果。
以下是仅使用Swing Timer
成功移动组件的示例。我得出结论,问题出现在上面没有显示的代码中。

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);
}
}
'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
'我的面板只重画一次循环完成,因此不显示我想看到的过渡效果' 尝试多线程! – 2015-02-08 10:48:33
我想避免尽可能多的线程 – meatno 2015-02-08 10:50:17