Перемещение JLabel на JLayeredPane

Мне нужно динамически перемещать несколько JLabels поверх JLayeredPane. проблема в том, что они не обновляются должным образом. Иногда они двигаются правильно, иногда вообще не появляются.

Мой код выглядит так:

Создание панели

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, но оно не всегда показывает его... Что здесь происходит не так...


person LosTheRed    schedule 25.08.2012    source источник
comment
Я имел дело с аналогичной проблемой в этом ответе. Это может помочь вам.   -  person Hovercraft Full Of Eels    schedule 26.08.2012
comment
Но если вам нужна дополнительная помощь, рассмотрите возможность создания и публикации sscce, так как может быть невозможно догадаться, что вы делаете. неправильно, основываясь на фрагментах невыполнимого кода, которые вы опубликовали до сих пор.   -  person Hovercraft Full Of Eels    schedule 26.08.2012


Ответы (2)


Я просмотрел предыдущий ответ 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();
        }
    }
}
person MadProgrammer    schedule 26.08.2012

Проблема была на самом деле в моем алгоритме позиционирования.

person LosTheRed    schedule 04.09.2012