這可能有幾種方法,但讓我們保持簡單。
基本上,這樣做是將label
(背景)圖像添加到內容窗格的中心位置。然後,它適用於一個BorderLayout
到label
,並增加了對copyrt
的label
中心位置...
public void showSplash() {
JPanel content = (JPanel) getContentPane();
content.setBackground(Color.blue);
// Set the window's bounds, centering the window
int width = 700;
int height = 450;
Dimension screen = Toolkit.getDefaultToolkit().getScreenSize();
int x = (screen.width - width)/2;
int y = (screen.height - height)/2;
setBounds(x, y, width, height);
// Build the splash screen
JLabel label = new JLabel(new ImageIcon("java-tip.gif"));
JLabel copyrt = new JLabel("Splash Screen!!!", JLabel.CENTER);
content.add(label, BorderLayout.CENTER);
// Fun starts here...
// copyrt.setFont(new Font("Sans-Serif", Font.BOLD, 12));
// content.add(copyrt, BorderLayout.SOUTH);
label.setLayout(new BorderLayout());
Font font = copyrt.getFont();
copyrt.setFont(font.deriveFont(Font.BOLD, 24f));
label.add(copyrt);
Color oraRed = new Color(200, 50, 20, 255);
content.setBorder(BorderFactory.createLineBorder(oraRed, 10));
// Display it
setVisible(true);
// Don't do this, as it will cause the EDT to be stopped. Instead
// setup some kind of callback that can tell when the resources are
// loaded and start the rest of the application from there...
// Wait a little while, maybe while loading resources
//try {
// Thread.sleep(duration);
//} catch (Exception e) {
//}
//setVisible(false);
}
這也是一個不錯的主意做EDT範圍內任何可能阻止其進一步處理事件,像使用sleep
或長時間運行/無限循環。
所有UI交互都應該在EDT的上下文中執行,所有長時間運行或潛在阻塞的任務應該在單獨的線程上運行。
看看Concurrency in Swing更多細節
更新
如果我嘗試運行你的榜樣,啓動畫面永遠不會出現,因爲Thread.sleep
是防止被顯示在屏幕上。事實上,你「可能」得到它的工作實際上是一種僥倖,因爲你可能從「主」線程調用showSplash
方法,而不是EDT。
相反,如果我用SwingWorker
替換Thread.sleep
,我不僅可以看到啓動畫面,還可以控制進度更新和處理啓動畫面的時間安排等額外好處...
例如...
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Toolkit;
import javax.swing.BorderFactory;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JWindow;
import javax.swing.SwingWorker;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
public class SplashDemo extends JWindow {
public static void main(String[] args) {
new SplashDemo();
}
public SplashDemo() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
ex.printStackTrace();
}
showSplash();
}
});
}
public void showSplash() {
JPanel content = (JPanel) getContentPane();
content.setBackground(Color.blue);
// Set the window's bounds, centering the window
int width = 700;
int height = 450;
Dimension screen = Toolkit.getDefaultToolkit().getScreenSize();
int x = (screen.width - width)/2;
int y = (screen.height - height)/2;
setBounds(x, y, width, height);
// Build the splash screen
JLabel label = new JLabel(new ImageIcon(getClass().getResource("/java_animated.gif")));
JLabel copyrt = new JLabel("Splash Screen!!!", JLabel.CENTER);
content.add(label, BorderLayout.CENTER);
label.setLayout(new GridBagLayout());
Font font = copyrt.getFont();
copyrt.setFont(font.deriveFont(Font.BOLD, 24f));
GridBagConstraints gbc = new GridBagConstraints();
gbc.gridwidth = GridBagConstraints.REMAINDER;
label.add(copyrt, gbc);
ImageIcon wait = new ImageIcon(getClass().getResource("/wait.gif"));
label.add(new JLabel(wait), gbc);
Color oraRed = new Color(200, 50, 20, 255);
content.setBorder(BorderFactory.createLineBorder(oraRed, 10));
// Display it
setVisible(true);
toFront();
new ResourceLoader().execute();
}
public class ResourceLoader extends SwingWorker<Object, Object> {
@Override
protected Object doInBackground() throws Exception {
// Wait a little while, maybe while loading resources
try {
Thread.sleep(5000);
} catch (Exception e) {
}
return null;
}
@Override
protected void done() {
setVisible(false);
}
}
}
如果你願意,我用下面的圖片...
小便!男人你必須有我的帖子出現與速度大聲笑 – Opjeezzeey
我不完全確定如何添加一個搖擺計時器。啓動畫面編譯並運行得非常好。我期待的是完全美容。 – Opjeezzeey
@Opjeezzeey它「出現」運行良好,但相信我們,它不.. – MadProgrammer