我需要以编程方式创建SplashScreen并向其添加文本(并更改它)。 大多数示例使用命令行参数。 有没有解决方案?
答案 0 :(得分:7)
在SwingWorker
中加载内容时,您可以使用带有背景图像和进度条的未修饰对话框。完成后,隐藏对话框并像往常一样启动UI。添加到对话框/闪屏中的组件必须是非不透明的,才能“看到”背景图像。
这是一个有效的例子:
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Frame;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.List;
import javax.swing.BorderFactory;
import javax.swing.ImageIcon;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JProgressBar;
import javax.swing.SwingUtilities;
import javax.swing.SwingWorker;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
public class TestSplashScreen {
private JDialog dialog;
private JFrame frame;
private JProgressBar progress;
protected void initUI() throws MalformedURLException {
showSplashScreen();
SwingWorker<Void, Integer> worker = new SwingWorker<Void, Integer>() {
@Override
protected Void doInBackground() throws Exception {
for (int i = 0; i < 100; i++) {
Thread.sleep(100);// Simulate loading
publish(i);// Notify progress
}
return null;
}
@Override
protected void process(List<Integer> chunks) {
progress.setValue(chunks.get(chunks.size() - 1));
}
@Override
protected void done() {
showFrame();
hideSplashScreen();
}
};
worker.execute();
}
protected void hideSplashScreen() {
dialog.setVisible(false);
dialog.dispose();
}
protected void showSplashScreen() throws MalformedURLException {
dialog = new JDialog((Frame) null);
dialog.setModal(false);
dialog.setUndecorated(true);
JLabel background = new JLabel(new ImageIcon(new URL("http://blogs.dirteam.com/photos/sanderberkouwer/images/2157/original.aspx")));
background.setLayout(new BorderLayout());
dialog.add(background);
JLabel text = new JLabel("Loading, please wait...");
text.setForeground(Color.WHITE);
text.setBorder(BorderFactory.createEmptyBorder(100, 50, 100, 50));
background.add(text);
progress = new JProgressBar();
background.add(progress, BorderLayout.SOUTH);
dialog.pack();
dialog.setLocationRelativeTo(null);
dialog.setVisible(true);
}
protected void showFrame() {
frame = new JFrame(TestSplashScreen.class.getSimpleName());
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JLabel ui = new JLabel("UI loaded and ready");
ui.setBorder(BorderFactory.createEmptyBorder(300, 300, 300, 300));
frame.add(ui);
frame.pack();
frame.setVisible(true);
}
public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException,
UnsupportedLookAndFeelException {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
try {
new TestSplashScreen().initUI();
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
}
}
答案 1 :(得分:4)
另一种方法是使用SplashScreen
API。有关详细信息,请参阅How to Create a Splash Screen。
我需要以编程方式创建SplashScreen并向其添加文本(并更改它)。
调用SplashScreen.createGraphics()
并根据需要进行绘画。