为什么我的while循环不能在paintComponent中工作?

时间:2015-08-23 23:29:43

标签: java swing jpanel paintcomponent

当我运行此代码时,我只看到一个空白(白色)面板,我想知道原因。

这是我的代码:

Graph.java

public class Graph extends JPanel {
    private static final long serialVersionUID = -397959590385297067L;
    int screen=-1;
    int x=10;
    int y=10;
    int dx=1;
    int dy=1;       
    boolean shouldrun=true;
    imageStream imget=new imageStream();

        protected void Loader(Graphics g){

            g.setColor(Color.black);
            g.fillRect(0,0,x,y);
            x=x+1;
            y=y+2;

        }


        @Override
        protected void paintComponent(Graphics g){
            super.paintComponent(g);
                while(shouldrun){
                    Loader(g);   
                    try {
                        Thread.sleep(200);
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }    
                }   
        }
}

3 个答案:

答案 0 :(得分:10)

不要在Event Dispatch Thread !!!

上拨打@property (nonatomic, weak) IBOutlet NSLayoutConstraints *viewWidthConstraint; - (void)viewDidLoad { super.viewDidLoad(); self.viewWidthConstraint.constant = [self buttonWidth]; } - (CGFloat)buttonWidth { return 100.f; (calculate width of button) }

这会导致实际重绘屏幕并使控件响应停止执行任何事情的线程。

For animations, use a Timer。不要担心自己编写while循环,只需告诉Thread.sleep()每隔一段时间激活一次,并更改该计时器内Timerx的值。类似的东西:

y
// this is an **inner** class of Graph
public class TimerActionListener implements ActionListener {
    @Override
    public void actionPerformed(ActionEvent e) {
        x += dx;
        y += dy;
    }
}

// snip
 
private final Timer yourTimer;

public Graph() {
    yourTimer = new Timer(2000, new TimerActionListener());
    timer.start();
}

答案 1 :(得分:4)

你永远不会在循环中改变应该运行的状态 - 所以它永远不会结束。

此外,永远不要在绘画方法中调用var s = "The <[yellow]> cat is <[not]> mine"; s = s.replace(/\s*<\[[^\]\>]*\]>/g, ""); console.log( s ); // "The cat is mine" 。这个方法用于绘画,永远不会入睡,否则GUI将被置于睡眠状态,将被冻结。

答案 2 :(得分:0)

首先,paintComponent方法应该只处理所有绘画而不处理任何其他内容(如果可能)。你不应该在paintComponent中实现你的程序循环。

空白屏幕可能由多种原因引起。您可以通过注释掉代码的某些部分并运行它来轻松地手动调试它。看它是否仍然是空白。

至少从我在这里看到的,你的paintComponent会给出你的问题。

如果你想要一个动画,你可以:

  1. 使用摇摆计时器

  2. 在新线程中创建一个循环(而不是事件调度线程)。你的循环看起来像这样:

  3. 如下:

    while(running){
        update();
        render();
        try(
            Thread.sleep(1000/fps);
        )catch(InterruptedException ie){
            ie.printStackTrace();
        }
    }
    

    注意:要为动画制作一个合适的循环,你需要更多。