Java Make Objects立即出现

时间:2014-05-04 14:31:21

标签: java image swing graphics repaint

我的装载栏有问题。我希望加载栏在开始加载图像之前出现在我的面板上。但是,加载图像后会出现加载条。这是我的代码。

private void initializeProgram(Dimension size){

    screenSize = size;

    //load class
    frame = new JFrame();
    homePanel = new HomePanel(size);
    loadingBar = new LoadingBar(new Dimension(500, 30));

    //initialize class
    frame.getContentPane().setLayout(null);
    frame.setSize(600, 600);
    frame.setVisible(true);
    frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    frame.getContentPane().add(loadingBar);
    loadingBar.setLocation(50, 50);

    int objectCount;
    objectCount = homePanel.getImageCount(); //i have 15 images
    loadingBar.setMaxValue(objectCount);     //maximum value set to 15
    loadingBar.repaint();                    //i tried to repaint hoping to appear
    frame.getContentPane().repaint();        //here too

    for(int i = 0; i<objectCount; i++){
        homePanel.loadImage();
        loadingBar.setValue(i+1);            //moves the loading bar as a sign of 
        loadingBar.repaint();                //progress, and i want it to repaint
    }
    System.out.println("DONE!");

    //load fonts

    //load sounds


}
我的homePanel.loadImage()里面是这样的:

public void loadImage(){
    try{
        image[imageLoadedCount] = ImageIO.read(new File(imagePath[imageLoadedCount]));
    }
    catch(IOException ex){
        ex.printStackTrace();
    }

    imageLoadedCount++;
}

当我尝试运行它时,JFrame是空白的,几秒钟后加载条将与&#34; DONE一起出现!&#34;在输出上打印。

2 个答案:

答案 0 :(得分:1)

  1. 不要使用空布局。 Swing旨在与Layout Managers一起使用。

  2. 应执行frame.setVisible(true)语句AFTER所有组件都已添加到框架及其子面板中。

答案 1 :(得分:1)

您的问题可能是因为EDT (event dispatch thread)上的图片加载造成的。这会阻止GUI的其余部分。

对于需要时间的任务,例如加载图片,请使用SwingWorker。这创建了一个执行任务的新线程,您还可以在运行时查询线程(例如,进度)。在后台线程上运行长任务使EDT可以快速更新。

注意:确保在initial thread中初始化GUI。