古いサイトからですが → レイヤペイン
↑アプレットをアプリケーションにしたものです↓
MainFrame.java
java
1 import java . util . Random ;
2
3 import javax . swing . * ;
4
5 public class MainFrame extends JFrame {
6 public static void main ( String [ ] args ) {
7 SwingUtilities . invokeLater ( ( ) -> new MainFrame ( ) . setVisible ( true ) ) ;
8 }
9
10 MainFrame ( ) {
11 super ( "test" ) ;
12 setDefaultCloseOperation ( JFrame . EXIT_ON_CLOSE ) ;
13 setSize ( 400 , 400 ) ;
14
15 JLayeredPane layerPane = new JLayeredPane ( ) ;
16 layerPane . setLayout ( null ) ;
17
18 Random random = new Random ( ) ;
19 for ( int i = 0 , x = 0 , y = 0 ; i < 5 ; i ++ , x += 20 , y += 40 ) {
20 int layer = random . nextInt ( 400 ) ;
21 JButton button = new JButton ( "レイヤ : " + layer ) ;
22 button . setBounds ( x , y , 200 , 50 ) ;
23 layerPane . add ( button ) ;
24 layerPane . setLayer ( button , layer ) ;
25 }
26
27 setContentPane ( layerPane ) ;
28 }
29 }
getLayeredPane で得られるオブジェクトは Swing 自身がダイアログ等を管理する為に使っているものでしょうから、アプリで特別に必要で無ければ直接使うのは避けたほうが良いと思います。
またその JLayeredPane は ContentPane の外に有りますので、それだけで作ると ContentPane が空ということになり、 JFrame が最小になります。
全く関係ありませんが、 java の命名規則等は知っておいたほうが良いと思います。
java ではクラス名は大文字で始め、変数名は小文字で始めることが推奨です。
class windows
→ class Window2
window2 W = ~
→ Window2 w = ~
メソッド名は動詞+名詞で小文字始まり、意味が分からなくなる程の過度の省略はしないほうが良いです。
String GP() { ~ }
→ String getPath() { ~ }
強制ではありませんが、開発ツールによっては注意されたり、他人に見せる際に違和感を持たれてそれがコードを読む邪魔になったりします。
時計です。
java
1 import java . awt . * ;
2 import java . text . SimpleDateFormat ;
3 import java . util . Date ;
4 import java . util . concurrent . * ;
5
6 import javax . swing . * ;
7
8 public class MainFrame extends JFrame {
9 public static void main ( String [ ] args ) {
10 SwingUtilities . invokeLater ( ( ) -> new MainFrame ( ) . setVisible ( true ) ) ;
11 }
12
13 MainFrame ( ) {
14 super ( "test" ) ;
15 setDefaultCloseOperation ( JFrame . EXIT_ON_CLOSE ) ;
16
17 String filename = "C:\\Users\\Jimbe\\Desktop\\艦これ画像\\Tuscaloosa.png" ;
18 //String filename = "C:\\Users\\yuu19\\Downloads\\eclipce\\workspace\\pokecchi\\image\\ぽけっち.png";
19 Image image = Toolkit . getDefaultToolkit ( ) . createImage ( filename ) ; //.getScaledInstance(500, 450, Image.SCALE_DEFAULT);
20 JLabel backgroundLabel = new JLabel ( new ImageIcon ( image ) ) ;
21
22 JLabel timeLabel = new JLabel ( "00:00:00" ) ;
23 timeLabel . setOpaque ( false ) ;
24 timeLabel . setFont ( timeLabel . getFont ( ) . deriveFont ( 100f ) ) ;
25 timeLabel . setForeground ( Color . GREEN ) ;
26
27 JLayeredPane layerPane = new JLayeredPane ( ) ;
28 layerPane . setLayout ( new GridBagLayout ( ) ) ;
29
30 GridBagConstraints gbc = new GridBagConstraints ( ) ;
31 gbc . gridx = 0 ;
32 gbc . gridy = 0 ;
33
34 layerPane . add ( backgroundLabel , gbc ) ;
35 layerPane . setLayer ( backgroundLabel , JLayeredPane . DEFAULT_LAYER ) ;
36
37 layerPane . add ( timeLabel , gbc ) ;
38 layerPane . setLayer ( timeLabel , JLayeredPane . DEFAULT_LAYER + 1 ) ;
39
40 setContentPane ( layerPane ) ;
41 pack ( ) ;
42 setLocationRelativeTo ( null ) ;
43
44 SimpleDateFormat formatter = new SimpleDateFormat ( "HH:mm:ss" ) ;
45 ScheduledExecutorService executor = Executors . newSingleThreadScheduledExecutor ( ) ;
46 executor . scheduleAtFixedRate ( ( ) -> {
47 SwingUtilities . invokeLater ( ( ) -> timeLabel . setText ( formatter . format ( new Date ( ) ) ) ) ;
48 } , 0L , 1L , TimeUnit . SECONDS ) ; //1秒毎に実行
49 }
50 }
質問は JLayeredPane ですので以下は余談となりますが。
ただ二つを重ねるだけであれば、 TN8001 さん回答の注意として書かれている「先に追加したものが上 になります」が有効(?)に使えます。
この Z オーダーの動作はレイアウトマネージャの設定 (null かどうか ) には関係ありません。
レイアウトマネージャは各コンポーネントの X, Y, Width, Height を管理して 重ならないような 配置をするのが主な役割だからで、重ならせる為にレイアウトマネージャを null にするという方法があるだけです。
(一部のレイアウトマネージャは重ならせることが出来ます。 GridBagLayout がその 1 つです。)
ですから回答コードの 27~38行目を以下のようにすることで、 JLayeredPane を使わなくても (JPanel で ) 重ねられます。
(timeLabel の add と backgroundLabel の add が回答コードと入れ替わっているので注意.)
java
1 //JLayeredPane layerPane = new JLayeredPane(); //★コメント化
2 //layerPane.setLayout(new GridBagLayout()); //★コメント化
3 JPanel layerPane = new JPanel ( new GridBagLayout ( ) ) ; //☆追加
4
5 GridBagConstraints gbc = new GridBagConstraints ( ) ;
6 gbc . gridx = 0 ;
7 gbc . gridy = 0 ;
8
9 layerPane . add ( timeLabel , gbc ) ; //☆ 上になるものを先に add する
10 //layerPane.setLayer(timeLabel, JLayeredPane.DEFAULT_LAYER + 1); //★コメント化
11
12 layerPane . add ( backgroundLabel , gbc ) ; //☆ 下になるものを後に add する
13 //layerPane.setLayer(backgroundLabel, JLayeredPane.DEFAULT_LAYER); //★コメント化