2012-08-25 41 views
0

我需要动态地在JLayeredPane上移动一些JLabel。 问题是它们不能正确刷新。有时他们正确地移动,有时他们根本不出现。在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,但它不” t总是显示它... 这里怎么回事...

+2

我在[这个答案](http://stackoverflow.com/a/4687759/522444)中处理过类似的问题。它可能会帮助你。 –

+0

但是,如果您需要更多帮助,请考虑创建并发布[sscce](http://sscce.org),因为根据您的不可运行代码片段,可能无法猜测出您可能会做错什么已经发布到目前为止。 –

回答

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

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