我正在尝试实现一个简单的启动画面。因此,我有两个班级,Loader
是JFrame
和Background
的孩子(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");
}
}
答案 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
使用BorderLayout
,JLabel
将ImageIcon
的图片放入BorderLayout.CENTER
},并将JProgressBar
放在BorderLayout.SOUTH
中作为一个更简单的选项。