简体   繁体   中英

Moving JLabel's on a JLayeredPane

I need to move a number of JLabels around on top of a JLayeredPane dynamically. the problem is that they do not refresh properly. Sometimes they move correctly, sometimes they don't appear at all.

My code looks like this:

Building the Panel

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 );

Adding the 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();

The positioning is correct when it does show the JLabel, but it doesn't always show it... What is going wrong here...

I've glanced through Hovercraft's previous answer and I'm pretty sure it will fulfill you're needs, but I couldn't resist having a play.

This is only meant as an example. The animation engine is crap (there are better frameworks available on the Internet), but it's a little fun ;)

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();
        }
    }
}

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM