Swing/ProgressSplashScreen のバックアップの現在との差分(No.6)
- category: swing folder: ProgressSplashScreen title: JDialogでモーダルなJProgressBar付きSplash Screenを表示する tags: [JDialog, JProgressBar, SwingWorker, ModalityType] author: aterai pubdate: 2009-11-09T14:54:41+09:00 description: JDialogでモーダルなJProgressBar付きSplash Screenを表示します。 image:
概要
概要
JDialog
でモーダルなJProgressBar
付きSplash Screen
を表示します。
Screenshot
Advertisement
サンプルコード
サンプルコード
#spandel
final JFrame frame = new JFrame();
#spanend
#spandel
final JDialog splashScreen = new JDialog(frame, Dialog.ModalityType.DOCUMENT_MODAL);
#spanend
#spanadd
final JFrame frame = new JFrame("@title@");
#spanend
#spanadd
final JDialog splashScreen = new JDialog(
#spanend
frame, Dialog.ModalityType.DOCUMENT_MODAL);
final JProgressBar progress = new JProgressBar();
#spanadd
System.out.println(splashScreen.getModalityType());
#spanend
EventQueue.invokeLater(new Runnable() {
@Override public void run() {
splashScreen.setUndecorated(true);
splashScreen.getContentPane().add(
new JLabel(new ImageIcon(getClass().getResource("splash.png"))));
new JLabel(new ImageIcon(getClass().getResource("splash.png"))));
splashScreen.getContentPane().add(progress, BorderLayout.SOUTH);
splashScreen.pack();
splashScreen.setLocationRelativeTo(null);
splashScreen.setVisible(true);
}
});
#spandel
SwingWorker<Void,Void> worker = new SwingWorker<Void,Void>() {
#spanend
#spanadd
SwingWorker<Void, Void> worker = new SwingWorker<Void, Void>() {
#spanend
@Override public Void doInBackground() {
try{
try {
int current = 0;
int lengthOfTask = 120;
while(current<lengthOfTask && !isCancelled()) {
while (current < lengthOfTask && !isCancelled()) {
try {
Thread.sleep(50);
}catch(InterruptedException ie) {
} catch (InterruptedException ie) {
ie.printStackTrace();
return null;
}
setProgress(100 * current++ / lengthOfTask);
}
}catch(Exception ex) {
} catch (Exception ex) {
ex.printStackTrace();
}
return null;
}
#spanadd
#spanend
@Override public void done() {
splashScreen.dispose();
}
};
#spandel
worker.addPropertyChangeListener(new java.beans.PropertyChangeListener() {
#spanend
@Override public void propertyChange(java.beans.PropertyChangeEvent e) {
if("progress".equals(e.getPropertyName())) {
progress.setValue((Integer)e.getNewValue());
#spanadd
worker.addPropertyChangeListener(new PropertyChangeListener() {
#spanend
@Override public void propertyChange(PropertyChangeEvent e) {
if ("progress".equals(e.getPropertyName())) {
progress.setValue((Integer) e.getNewValue());
}
}
});
worker.execute();
#spandel
#spanend
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
frame.getContentPane().add(new MainPanel());
frame.pack();
frame.setLocationRelativeTo(null);
EventQueue.invokeLater(new Runnable() {
@Override public void run() {
frame.setVisible(true);
}
});
View in GitHub: Java, Kotlin解説
上記のサンプルでは、以下のようなスプラッシュスクリーンを表示しています。解説
上記のサンプルでは、以下のようなスプラッシュスクリーンを作成して表示しています。- モーダルな
JDialog
に、画像とJProgressBar
を追加 -
Dialog#setUndecorated(true)
として、タイトルバーを非表示 -
SwingWorker
を使って、進捗状態を表示 - モーダルな
JDialog
に画像とJProgressBar
を追加 -
Dialog#setUndecorated(true)
としてタイトルバーを非表示 -
SwingWorker
を使って進捗状態を表示
JTabbedPane
に順次タブを追加していくテスト
-
JTabbedPane
にタブを順次追加するSwingWorker
のテスト
#spandel
//package example;
#spanend
#spandel
//-*- mode:java; encoding:utf8n; coding:utf-8 -*-
#spanend
#spandel
// vim:set fileencoding=utf-8:
#spanend
#spandel
//@homepage@
#spanend
import java.awt.*;
import java.beans.*;
import java.util.List;
import javax.swing.*;
public class ProgressSplashScreenTest {
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override public void run() {
createAndShowGUI();
}
EventQueue.invokeLater(() -> {
createAndShowGUI();
});
}
#spanadd
#spanend
public static void createAndShowGUI() {
final JFrame frame = new JFrame();
final JDialog splashScreen = new JDialog(
JFrame frame = new JFrame();
JDialog splashScreen = new JDialog(
frame, Dialog.ModalityType.DOCUMENT_MODAL);
final JProgressBar progress = new JProgressBar();
final JTabbedPane tabbedPane = new JTabbedPane();
JProgressBar progress = new JProgressBar();
JTabbedPane tabbedPane = new JTabbedPane();
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
frame.getContentPane().add(tabbedPane);
progress.setStringPainted(true);
EventQueue.invokeLater(new Runnable() {
@Override public void run() {
splashScreen.setUndecorated(true);
splashScreen.getContentPane().add(
new JLabel(new SplashScreenIcon()));
splashScreen.getContentPane().add(progress, BorderLayout.SOUTH);
splashScreen.pack();
splashScreen.setLocationRelativeTo(null);
splashScreen.setVisible(true);
}
EventQueue.invokeLater(() -> {
splashScreen.setUndecorated(true);
splashScreen.getContentPane().add(
new JLabel(new SplashScreenIcon()));
splashScreen.getContentPane().add(progress, BorderLayout.SOUTH);
splashScreen.pack();
splashScreen.setLocationRelativeTo(null);
splashScreen.setVisible(true);
});
SwingWorker<Void,String> worker = new SwingWorker<Void,String>() {
SwingWorker<Void, String> worker = new SwingWorker<Void, String>() {
@Override public Void doInBackground() {
try {
int current = 0;
int lengthOfTask = 120;
while(current<=lengthOfTask && !isCancelled()) {
while (current <= lengthOfTask && !isCancelled()) {
try {
Thread.sleep(50); //dummy
} catch(InterruptedException ie) {
Thread.sleep(50);
} catch (InterruptedException ie) {
ie.printStackTrace();
return null;
}
if(current == 20) {
if (current == 20) {
publish("showFrame");
} else if(current%24==0) {
publish("title: "+current);
} else if (current % 24 == 0) {
publish("title: " + current);
}
setProgress(100 * current++ / lengthOfTask);
}
} catch(Exception ex) {
} catch (Exception ex) {
ex.printStackTrace();
}
return null;
}
#spanadd
#spanend
@Override protected void process(List<String> chunks) {
for(String cmd : chunks) {
if(cmd.equals("showFrame")) {
for (String cmd: chunks) {
if (cmd.equals("showFrame")) {
frame.setSize(512, 320);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
} else {
tabbedPane.addTab(cmd, new JLabel(cmd));
tabbedPane.setSelectedIndex(tabbedPane.getTabCount()-1);
progress.setString("Loading: "+cmd);
tabbedPane.setSelectedIndex(tabbedPane.getTabCount() - 1);
progress.setString("Loading: " + cmd);
}
}
}
#spanadd
#spanend
@Override public void done() {
splashScreen.dispose();
}
};
worker.addPropertyChangeListener(new PropertyChangeListener() {
@Override public void propertyChange(PropertyChangeEvent e) {
if("progress".equals(e.getPropertyName())) {
progress.setValue((Integer)e.getNewValue());
}
worker.addPropertyChangeListener(e -> {
if ("progress".equals(e.getPropertyName())) {
progress.setValue((Integer) e.getNewValue());
}
});
worker.execute();
}
}
#spanadd
#spanend
class SplashScreenIcon implements Icon {
@Override public void paintIcon(Component c, Graphics g, int x, int y) {
Graphics2D g2 = (Graphics2D)g.create();
Graphics2D g2 = (Graphics2D) g.create();
g2.translate(x, y);
g2.setPaint(Color.GREEN);
g2.fillRect(10,10,180,80);
g2.translate(-x,-y);
g2.fillRect(10, 10, 180, 80);
g2.translate(-x, -y);
g2.dispose();
}
#spanadd
#spanend
@Override public int getIconWidth() {
return 200;
}
#spanadd
#spanend
@Override public int getIconHeight() {
return 100;
}
}