图像显示不正确

时间:2013-04-24 17:30:39

标签: java

我正在尝试实现一个简单的启动画面。因此,我有两个班级,LoaderJFrameBackground的孩子(JComponent的孩子,用作GlassPane)来保持实际图片。在这张图片下面应该有一个小的进度条。

我在加载图像后立即显示窗口。这很好用。但它不会显示图像。滚动条占据了整个框架。如果我手动缩小窗口并将其恢复到前面,则会显示图像。

为什么图像不会立即显示?

以下是代码:

装载机

public class Loader extends JFrame{

    private static final int _WIDTH  = 500;
    private static final int _HEIGHT = 300;

    private JProgressBar bar;
    private Background bg;

    public Loader (){
        super("Risiko Loader");
        this.setAlwaysOnTop(true);
        Dimension window = Toolkit.getDefaultToolkit().getScreenSize();
        this.setBounds(window.width / 2 - _WIDTH / 2, window.height / 2 - _HEIGHT / 2, _WIDTH, _HEIGHT);
        this.setUndecorated(true);
        this.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
        this.setResizable(false);
        this.setFocusable(true);
        this.setBackground(new Color(1.0f,0.0f,1.0f,1.0f));
        this.setFocusableWindowState(true);

        this.setIcons();

        bar = new JProgressBar();

        bar.setSize(_WIDTH, 20);
        bar.setLocation(0, _HEIGHT - 20);
        bar.setValue(0);
        bar.setMinimum(0);
        bar.setMaximum(100);

        this.add(bar);

        bg = new Background();
        this.setGlassPane(this.bg);
        this.bgIsReady();
    }

    private void bgIsReady(){
        do {
            try {
                Thread.sleep(100);
            }catch(Exception e){}
        }while(this.bg.tracker.statusID(1, false) == MediaTracker.COMPLETE);

        this.setVisible(true);
        this.getGlassPane().setVisible(true);
        this.getGlassPane().repaint();
        bar.setValue(50);
    }

    private void setIcons(){
        ArrayList<Image> icons = new ArrayList<>();
        icons.add(Toolkit.getDefaultToolkit().getImage(System.getProperty("user.dir") + File.separator + "images" + File.separator + "icon16.png"));
        icons.add(Toolkit.getDefaultToolkit().getImage(System.getProperty("user.dir") + File.separator + "images" + File.separator + "icon32.png"));
        this.setIconImages(icons);
    }

    public static void main(String [] args){

        Loader l = new Loader();
    }
}

背景

public class Background extends JComponent{
    private Image img;

    public MediaTracker tracker;

    public Background(){
        this.tracker =  new MediaTracker(this);
        String imgPath = System.getProperty("user.dir") + File.separator + "images" + File.separator + "splash.png";
        this.img = Toolkit.getDefaultToolkit().getImage(imgPath);
        this.tracker.addImage(this.img, 1);
    }

    @Override
    public void paintComponent(Graphics g) {
        if(this.tracker.statusID(1, false) == MediaTracker.LOADING) {//not loaded
            return;
        }
        // Draw the background image
        g.drawImage(this.img, 1, 1, null);
        System.out.println("p");
    }
}

1 个答案:

答案 0 :(得分:2)

可能是这部分 -

do {
    try {
        Thread.sleep(100);
    }catch(Exception e){}
}while(this.bg.tracker.statusID(1, false) == MediaTracker.COMPLETE);

您应该检查MediaTracker.LOADING中的while而不是MediaTracker.COMPLETE。现在可能发生的是代码睡眠时间为100毫秒,检查MediaTracker状态,它仍然是MediaTracker.LOADING,这不是COMPLETE,所以代码继续进行并设置你的框架,glassPane等,而不会首先加载图像。加载图片的时间必须超过100毫秒 - 否则你的问题就是你的画面永远不会出现。

另一方面 - 如果您正试图制作一个简单的闪屏&#34; - 这是复杂的。

Java 1.6+中有一个内置的SplashScreen类。

即使您想自己重新创建,也可以JFrame使用BorderLayoutJLabelImageIcon的图片放入BorderLayout.CENTER },并将JProgressBar放在BorderLayout.SOUTH中作为一个更简单的选项。