如果填充屏幕,JPanel将不会移动

时间:2013-06-13 17:15:30

标签: java swing animation jpanel

首先,对于模糊的标题,我不知道如何在一个句子中提出问题。

我有一个简单的程序可以将一个JPanel滑入视图,而当另一个按钮被点击时,另一个被推出。

如果第一个JPanel的宽度设置为getWidth(),那么单击按钮时JPanel将不会移动,但是如果我将宽度更改为getWidth() - 1,它的效果非常好!?!

一个简单的例子如下所示

public class SlidingJPanel extends JFrame{

    public JPanel panel = new JPanel();
    public JPanel panel2 = new JPanel();
    public JLabel label = new JLabel(" SUCCESS!!!!!!!");
    public JButton button = new JButton("TESTING"); 

    public class MyJPanel extends JPanel implements ActionListener{
        public int x = 0;
        public int delay = 70;
        final Timer timer = new Timer(delay,this);

        public MyJPanel(){};

        public void paintComponent(Graphics g)
        {
            super.paintComponent(g);

            button.setBounds(10, 20, 100, 50);
            button.addActionListener(this);
            panel.setBorder(BorderFactory.createLineBorder(Color.black));
            panel.setBounds(x, 0, getWidth(), getHeight());
            panel.add(button);
            panel2.setBorder(BorderFactory.createLineBorder(Color.blue));
            panel2.setBounds(x - getWidth(), 0, getWidth(), getHeight());
            panel2.add(label);
            add(panel);
            add(panel2);
        }

        @Override
        public void actionPerformed(ActionEvent arg0) {
            timer.addActionListener(move);
            timer.start();
        }

        ActionListener move = new ActionListener(){
            public void actionPerformed(ActionEvent e){
                repaint();
                x++;
            }
        };

    }

    public static void main(String args [])
    {         
        new SlidingJPanel();        
    }

    SlidingJPanel()
    {
        Container container = getContentPane();
        MyJPanel panel = new MyJPanel();
        container.add(panel);           
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setSize(500,500);
        setTitle("JPanel Draw Rect Animation");
        setVisible(true);
    }       
}

忽略我可能忽略或错过的任何编码约定,这只是草稿。

希望有人可以提供帮助:)

1 个答案:

答案 0 :(得分:2)

paintComponent()方法仅用于绘画!您无需覆盖此方法。

你不应该:

  1. 更新组件的属性(即边界,边界)
  2. 将组件添加到容器
  3. 如果要为组件设置动画,那么当计时器触发时,您可以使用setLocation(...)或setSize()或setBounds()。该组件将自动重新绘制。

    我不知道修复此问题是否可以解决您的问题,但目前的做法是错误的。