0

我需要在 JLayeredPane 上动态移动一些 JLabels。问题是它们没有正确刷新。有时它们会正确移动,有时它们根本不会出现。

我的代码如下所示:

构建面板

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 时定位是正确的,但它并不总是显示它......这里出了什么问题......

4

2 回答 2

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();
        }
    }
}
于 2012-08-26T20:38:50.920 回答
0

问题实际上出在我的定位算法中。

于 2012-09-04T14:30:06.267 回答