【问题标题】:Why is my Panel's repaint not being called?为什么我的面板的重绘没有被调用?
【发布时间】:2009-03-06 17:19:56
【问题描述】:

我遇到了一个问题,我似乎无法解决涉及一个小动画的问题。对于一个项目,我们正在设计一个在 PDA (DELL Axim X51) 上运行的 J9 应用程序。有问题的代码(如下所示)是检测到鼠标单击以在嵌套面板中运行小动画时。如果动画独立于鼠标单击运行,则它可以正常工作并且可以完美地重新绘制。当识别到鼠标单击时调用该方法时,我们忽略了每个动画间隔的重绘,只有在动画完成后才会重绘面板。

认为这可能与当识别到鼠标单击时应用程序与自身同步停止任何内部方法调用以进行绘制或绘制操作没有足够高的优先级有关鼠标点击。

My code:

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.Panel;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
 
public class StatusLoader extends Panel implements Runnable{
 
        int progress;
       
        public static void main(String[] args) {
                Frame f = new Frame();
                StatusLoader  mp = new StatusLoader();
                mp.setBackground(Color.yellow);
                f.add(mp);
               
                f.setSize(300,300);
                f.show();       
                f.addWindowListener(new WindowAdapter() {            
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });
                mp.start();
        }
       
        public void start(){
                Thread t = new Thread(this);
                t.run();
               
        }
       
        public void run(){
                for (int i = 0; i < 10; i++) {
                        progress+=10;
                        this.repaint(0);
                        System.out.println(i);
                        try{
                                Thread.sleep(100);
                        }catch(InterruptedException ex){}
                }
        }
       
        public void paint(Graphics g){
                System.out.println("called repaint");
                g.setColor(Color.red);
                g.setFont(new Font("Sansserif",2,24));
                FontMetrics fm = g.getFontMetrics();
                int stringWidth = fm.stringWidth("Loading");
                g.drawString("Loading", getWidth()/2-stringWidth/2, getHeight()/2);
                g.setFont(new Font("Sansserif",2,12));
                fm = g.getFontMetrics();
                stringWidth = fm.stringWidth("Map ziles for the new zoom level");
                g.drawString("Map tiles for the new zoom level", getWidth()/2-stringWidth/2, getHeight()/2+30);
                g.drawRect(getWidth()/2-100, getHeight()/2+60, 200, 10);
                g.setColor(Color.blue);
                g.fillRect(getWidth()/2-100, getHeight()/2+60, progress*2, 10);
        }
       
}

【问题讨论】:

    标签: java multithreading repaint


    【解决方案1】:

    StatusLoader.start 中,您使用Thread.run 而不是Thread.start。这意味着StatusLoader.run 在事件线程上执行,这是一件非常糟糕的事情。将其更改为t.start()

    【讨论】:

      猜你喜欢
      • 2018-07-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-22
      • 1970-01-01
      • 2022-10-15
      • 2011-04-11
      • 2023-03-07
      相关资源
      最近更新 更多