プログラムのロード中にポップアップするスプラッシュ ウィンドウがあります。このスプラッシュ ウィンドウsetAlwaysOnTop(true)
では、私が保持したいメソッド を使用しています。
この問題は、プログラムの別の部分が JOptionPane をポップアップして、ソフトウェアを更新する必要があることをユーザーに通知するときに発生します。Linux では、これはスプラッシュ ウィンドウの前に表示されますが、Windows では後ろに表示され、ユーザーにはほとんど見えず、30 分間座っていると、まだロードされていない理由がわかるまで 1 時間もかかります。
実装したい修正は、次のいずれかです
- JOptionPane を強制的に画面の別の場所にポップアップさせるか
、 - JOptionPane が表示される場所を変更して、スプラッシュ画面の上部または下部に配置します。
これを行うことができる唯一の関数はsetLocationRelativeTo(Component myComponent)
メソッドです。しかし、これは良いことではありません。なぜなら、相対的なものは何もないからです (そして何も存在しません!)。
このようなことは可能ですか?もしそうなら、どうすればそれを行うことができますか?
これが私のSSCCEです(回答のSeniorJDのコードに基づいています):
public class Main {
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
final Splash splash =new Splash();
try {
Thread.sleep(100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
final Frame frame = new Frame("Frame");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
splash.dispose();
}
});
}
}
@SuppressWarnings("serial")
public class Frame extends JFrame implements ActionListener{
Frame(String title){
super(title);
JButton button = new JButton("Button");
add(button);
setAlwaysOnTop(true);
setSize(500, 500);
setLocationRelativeTo(getParent());
setAlwaysOnTop(true);
button.addActionListener(this);
actionPerformed(null);
}
@Override
public void actionPerformed(ActionEvent e) {
JOptionPane optionPane = new JOptionPane("Option Pane");
optionPane.showMessageDialog(this, "Message: Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas tristique gravida congue.");
}
}
@SuppressWarnings("serial")
public class Splash extends JFrame {
public Splash() throws HeadlessException {
setAlwaysOnTop(true);
setUndecorated(true);
setVisible(true);
setSize(600, 450);
setLocationRelativeTo(getParent());
}
}
これは、ユーザーが見ている動作を多かれ少なかれエミュレートします。JOptionPane をスプラッシュ画面の外に移動するにはどうすればよいですか?