以下是一个简单的Java Swing启动画面,带有进度条: ```java import javax.swing.*; import java.awt.*; public class SplashScreen extends JWindow { private JProgressBar progressBar; private int progress; public SplashScreen() { JPanel panel = new JPanel(new BorderLayout()); JLabel label = new JLabel(new ImageIcon("splash.png")); panel.add(label, BorderLayout.CENTER); progressBar = new JProgressBar(); progressBar.setStringPainted(true); panel.add(progressBar, BorderLayout.SOUTH); setContentPane(panel); pack(); setLocationRelativeTo(null); setVisible(true); startProgressBar(); } private void startProgressBar() { Thread thread = new Thread(() -> { while (progress < 100) { try { Thread.sleep(50); } catch (InterruptedException e) { e.printStackTrace(); } progress++; progressBar.setValue(progress); } dispose(); }); thread.start(); } public static void main(String[] args) { new SplashScreen(); // do some initialization here // ... // show main window SwingUtilities.invokeLater(() -> { JFrame frame = new JFrame("Main Window"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setSize(400, 300); frame.setLocationRelativeTo(null); frame.setVisible(true); }); } } ``` 在这个例子中,我们创建了一个`JWindow`,并在其中添加了一个带有进度条的面板。我们使用`Thread`来模拟初始化过程,并在进度条上更新进度。一旦进度达到100%,我们就关闭启动画面并显示主窗口。 请注意,我们使用`SwingUtilities.invokeLater()`来确保在事件分派线程上创建和显示主窗口。这是因为Swing是单线程的,必须在事件分派线程上执行所有UI操作。