Существует несколько способов сделать это, но пусть это будет проще.
В основном, это означает, что изображение 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
или длинные/бесконечные петли.
Все взаимодействия с пользовательским интерфейсом должны выполняться в контексте EDT, и все длительные или потенциально блокирующие задачи должны выполняться в отдельном потоке.
Взгляните на Concurrency in Swing для более подробной информации
Обновлено
Если я пытаюсь запустить пример, никогда не появится заставка, потому что Thread.sleep
является препятствование от того, показать на экране. Тот факт, что вы «можете» заставить его работать, на самом деле является случайностью, поскольку вы, вероятно, называете метод showSplash
«основным» потоком, а не EDT.
Вместо этого, если я заменяю Thread.sleep
на SwingWorker
, я не только получаю всплывающий экран, но и получаю дополнительное преимущество в том, что вы можете контролировать такие вещи, как обновления хода выполнения и планирование для удаления заставки ...
Например ...
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);
}
}
}
Если вы хотите, я использовал следующие изображения ...
Pee! Человек, у вас должны быть мои сообщения, показывающие быстроту lol – Opjeezzeey
Я не совсем уверен, как добавить таймер качания. Экран заставки компилируется и работает отлично. То, что я хочу сделать, полностью косметическое. – Opjeezzeey
@Opjeezzeey «Кажется», чтобы нормально работать, но поверьте нам, это не так. – MadProgrammer