只有两帧,for循环转义后才会重新绘制

时间:2016-09-27 13:40:10

标签: java animation jcomponent

我正在尝试做一些基本的Java,并且我的框架中有一个形状。它使用JComponent类绘制形状,动画在顶部的按钮单击时触发。

组件代码就是这个添加到jpanel

public void paintComponent(Graphics g){     
    Dimension dim = getSize();      
    g.setColor(Color.GREEN);
    g.fillOval(margin, 150, 100, 100);  
    super.paintComponent(g);
}

动画刚刚在for循环中完成,只是编辑左边距,使圆圈向右移动;

int getMarg = cc.getMargin();
            for(int i = 1;i < 20;i++){  
                getMarg = cc.getMargin();
                cc.setMargin(getMarg + 1);              
                reValidate();
                System.out.println(i);

但它似乎没有移动直到循环结束,一次移动20个像素。我以前有一个睡眠功能,但它没有动画时似乎毫无意义。

有什么见解?欢呼声。

对于任何感兴趣的人来说,整个代码都是混乱的,而且主要是为了获得造型:

class Main extends JFrame{

public JPanel panel = new JPanel();
JButton button1 = new JButton("Move Right");

CreateComps cc = new CreateComps();

Main(){
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    initUI();
}

void initUI(){
    setSize(800,800);
    setBackground(Color.GRAY);
    setLayout(new BoxLayout(this.getContentPane(), BoxLayout.Y_AXIS));

    JPanel topBar = new JPanel();
    topBar.setPreferredSize(new Dimension(800,30));
    topBar.setMaximumSize(new Dimension(800,30));
    topBar.setLayout(new BorderLayout());
    topBar.add(button1, BorderLayout.WEST);
    topBar.setBackground(Color.GRAY);

    JPanel container = new JPanel();
    container.setLayout(new GridBagLayout());
    container.setBackground(Color.DARK_GRAY);

    panel.setPreferredSize(new Dimension(600,500));
    panel.setMinimumSize(new Dimension(600,500));
    panel.setBackground(Color.WHITE);
    panel.setLayout(new BorderLayout());
    panel.add(cc, BorderLayout.CENTER);

    add(topBar);
    add(container);
    container.add(panel);

    Listener listen = new Listener();
    button1.addActionListener(listen);

    setVisible(true);
}

public void reValidate(){
    panel.revalidate();
    panel.repaint();
}

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

class Listener implements ActionListener{
    @Override
    public void actionPerformed(ActionEvent e) {

        System.out.println("Listening..");
        if(e.getSource().equals(button1)){
            int getMarg = cc.getMargin();
            for(int i = 1;i < 20;i++){  
                getMarg = cc.getMargin();
                cc.setMargin(getMarg + 1);              
                reValidate();
                System.out.println(i);
            }
        }                       
    }   
}



}

class CreateComps extends JComponent{

int margin = 10;        
public void setMargin(int marg){
    margin = marg;
}   
public int getMargin(){
    return margin;
}   
@Override
public Dimension getPreferredSize(){
    return new Dimension(new Dimension(200,200));
}   
@Override
public Dimension getMaximumSize(){
    return new Dimension(new Dimension(200,200));
}   
@Override
public Dimension getMinimumSize(){
    return new Dimension(new Dimension(200,200));
}   
public void paintComponent(Graphics g){     
    Dimension dim = getSize();      
    g.setColor(Color.GREEN);
    g.fillOval(margin, 150, 100, 100);  
    super.paintComponent(g);
}

}

1 个答案:

答案 0 :(得分:0)

如果没有暂停,您正在堆叠对revalidate的通话,除了最后一次通话的结果外,您将看到其他内容。

您之前拥有的睡眠功能可能是在Event Dispatch Thread上调用的,这一点并不好,因为您阻止了整个事件调度和GUI更新。

考虑在另一个sleep上使用Thread来电:

@Override
public void actionPerformed(final ActionEvent e) {

    System.out.println("Listening..");
    if (e.getSource().equals(button1)) {
        new Thread() {
            @Override
            public void run() {
                int getMarg = cc.getMargin();
                for (int i = 1; i < 20; i++) {
                    getMarg = cc.getMargin();
                    cc.setMargin(getMarg + 1);
                    reValidate();
                    System.out.println(i);

                    try {
                        Thread.sleep(50);
                    } catch (Throwable e) {
                    }

                }
            }
        }.start();

    }

}

或者你也可以简单地使用Timer,这对这项工作很有帮助。