我需要动态地在JLayeredPane之上移动一些JLabel。 问题是他们没有正确刷新。有时它们会正确移动,有时它们根本不会出现。
我的代码如下所示:
构建面板
JLayeredPane gameBoardPane = new JLayeredPane();
gameBoardPane.setLayout( null );
Dimension gameBoardLabelSize = gameBoardLabel.getPreferredSize();
gameBoardLabel.setBounds(30, 30, gameBoardLabelSize.width, gameBoardLabelSize.height);
gameBoardPane.add(gameBoardLabel, new Integer(10));
gameBoardPane.setAlignmentY(Component.TOP_ALIGNMENT);
// ...
JPanel gamePane = new JPanel();
gamePane.setLayout( new BoxLayout(gamePane, BoxLayout.LINE_AXIS) );
gamePane.add(gameBoardPane);
gamePane.add(gameControlPane);
// ...
Container contentPane = getContentPane();
contentPane.add(gamePane, BorderLayout.PAGE_START);
SnLFrame.setSize( 720,600 );
添加JLabel:
Coordinates position = new Coordinates();
position = convertToCoordinates(blockNumber);
position.x = position.x * 50;
position.y = position.y * 50;
Dimension smallPlayer1IconLabelSize = smallPlayer1IconLabel.getPreferredSize();
smallPlayer1IconLabel.setBounds(position.x, position.y, smallPlayer1IconLabelSize.width, smallPlayer1IconLabelSize.height);
gameBoardPane.add(smallPlayer1IconLabel, new Integer(100));
SnLFrame.invalidate();
SnLFrame.validate();
SnLFrame.repaint();
当它显示JLabel时定位是正确的,但它并不总是显示它... 这里出了什么问题......
答案 0 :(得分:1)
我已经浏览了Hovercraft之前的回答,我很确定它会满足你的需求,但我无法抗拒玩耍。
这只是一个例子。动画引擎是垃圾(互联网上有更好的框架),但它有点有趣;)
public class AnimateGlassPane {
public static void main(String[] args) {
new MyFrame();
}
public static class MyFrame extends JFrame {
public MyFrame() {
setTitle("Testing");
setSize(800, 600);
setLocationRelativeTo(null);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setGlassPane(new MyGlassPane());
getGlassPane().setVisible(true);
setVisible(true);
}
}
public static class MyGlassPane extends JPanel {
private JLabel[] labels;
private JLabel random;
private Timer timer;
private float progress = 0f;
private float increment = 0.1f;
public MyGlassPane() {
setOpaque(false);
setLayout(null);
labels = new JLabel[4];
labels[0] = new JLabel("Up/Down");
labels[1] = new JLabel("Down/Up");
labels[2] = new JLabel("Left/Right");
labels[3] = new JLabel("Right/Left");
for (int index = 0; index < labels.length; index++) {
labels[index].setSize(labels[index].getPreferredSize());
add(labels[index]);
}
random = new JLabel("Look at me!");
random.setSize(random.getPreferredSize());
random.setVisible(false);
random.setOpaque(true);
random.setBackground(Color.RED);
random.setForeground(Color.YELLOW);
add(random);
timer = new Timer(125, new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
progress += increment;
if (progress < 0) {
progress = 0;
increment = 0.1f;
} else if (progress > 1) {
progress = 1;
increment = -0.1f;
}
int width = getWidth() - 1;
int height = getHeight() - 1;
int x = (width - labels[0].getWidth()) / 2;
int y = Math.round((height * progress));
if (y + labels[0].getHeight() > height) {
y = height - labels[0].getHeight();
} else if (y < 0) {
y = 0;
}
labels[0].setLocation(x, y);
y = Math.round((height * (1f - progress)));
if (y + labels[1].getHeight() > height) {
y = height - labels[1].getHeight();
} else if (y < 0) {
y = 0;
}
labels[1].setLocation(x, y);
y = (height - labels[2].getHeight()) / 2;
x = Math.round(width * progress);
if (x + labels[2].getWidth() > width) {
x = width - labels[2].getWidth();
} else if (x < 0) {
x = 0;
}
labels[2].setLocation(x, y);
x = Math.round(width * (1f - progress));
if (x + labels[3].getWidth() > width) {
x = width - labels[3].getWidth();
} else if (x < 0) {
x = 0;
}
labels[3].setLocation(x, y);
repaint();
int value = (int)Math.round(Math.random() * 100d);
if (value % 5 == 0) {
random.setVisible(!random.isVisible());
x = (int)Math.round(Math.random() * width);
y = (int)Math.round(Math.random() * height);
if (x + random.getWidth() > width) {
x = width - random.getWidth();
} else if (x < 0) {
x = 0;
}
if (y + random.getHeight() > height) {
y = height - random.getHeight();
} else if (y < 0) {
y = 0;
}
random.setLocation(x, y);
}
}
});
timer.setRepeats(true);
timer.setCoalesce(true);
timer.start();
}
}
}
答案 1 :(得分:0)
问题实际上出在我的定位算法中。