前提・実現したいこと
360°回転する背景のPanelの上に、画像のみのボタン(以下ボタン)Panelを設置し、ボタンを押されるたびに定型文を
出力するプログラムを実装しています。
単体で2つとも完成したので、今は結合を実施しています。
発生している問題・エラーメッセージ
背景はうまく動いていますが、ボタンの方がうまく動いていません。
具体的には、背景側で1°回転するごとにrepaintが行われているのですが、そのたびにボタンの画像が
消えてしまいます。クリックすると一瞬画像が出力されますが、すぐに消えてしまいます。
このボタンの画像の消失を解決したいです。
該当のソースコード
基盤となるPanelです。ここに下記panelを追加していきます。
java
1import javax.swing.JButton; 2import javax.swing.JLayeredPane; 3import javax.swing.JPanel; 4 5public class GameScreen extends JLayeredPane{ 6 public static final int GAMEPANEL_HEIGHT=mainFoundationFrame.FRAME_HEIGHT; 7 public static final int GAMEPANEL_WEIGHT=430; 8 public GameScreen() { 9 JPanel panelGame =new JPanel(); 10 panelGame.setBounds(0, 0, 11 gamePanel_WEIGHT,gamePanel_HEIGHT); 12 panelGame.setLayout(null); 13 14 RotationBackground rotationBackground =new RotationBackground(); 15 panelGame.add(rotationBackground);//回る背景 16 this.setLayer(rotationBackground,DEFAULT_LAYER, 0); 17 18 KookieButton kookieButton =new KookieButton(); 19 panelGame.add(kookieButton); 20 this.setLayer(kookieButton, DEFAULT_LAYER,100); 21 22 JButton jp =new JButton(); 23 panelGame.add(jp); 24 this.setLayout(null); 25 this.setBounds(0, 0,DriverTest12TitlePanel.FRAME_WIDTH,DriverTest12TitlePanel.FRAME_HEIGHT); 26 this.add(panelGame); 27 this.add(panelItemAndScore); 28 this.setLayout(null); 29 this.setBounds(0, 0,640,480); 30 this.add(panelGame); 31 this.add(panelItemAndScore); 32 33
360°回転するpanelのコードです
java
1import java.awt.AlphaComposite; 2import java.awt.Graphics; 3import java.awt.Graphics2D; 4import java.awt.Image; 5import java.awt.Toolkit; 6import java.awt.event.ActionEvent; 7import java.awt.event.ActionListener; 8import java.awt.geom.AffineTransform; 9 10import javax.swing.JPanel; 11import javax.swing.Timer; 12 13public class RotationBackground extends JPanel { 14 Image puhaImg = Toolkit.getDefaultToolkit().getImage("src/photo/puha.png"); 15 public RotationBackground() { 16 // TODO 自動生成されたコンストラクター・スタブ 17 this.setBounds(0, 0,GameScreen.gamePanel_WEIGHT,GameScreen.gamePanel_HEIGHT); 18 Timer t = new Timer(4000, new TimerListener()); 19 t.start(); 20 } 21 int count = 0; 22 public void paintComponent(Graphics g) { 23 super.paintComponent(g); 24 Graphics2D g2 = (Graphics2D) g; 25 AffineTransform at = g2.getTransform(); 26 // count度回転させます。 27 at.setToRotation(Math.toRadians(count), 200, 150); 28 g2.setTransform(at); 29 //a 透明度を50%に設定する 30 AlphaComposite ac = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.5f); 31 g2.setComposite(ac); 32 g2.drawImage(puhaImg, 0, 150, this); 33 } 34 class TimerListener implements ActionListener { 35 @Override 36 public void actionPerformed(ActionEvent e) { 37 // TODO 自動生成されたメソッド・スタブ 38 if (count > 360) 39 count = 0; 40 count++; 41 repaint();// 20ms毎にrepaint→paint→paintComponent呼ばれる 42 } 43 }
画像のみのボタンのコードです。
java
1 2import java.awt.event.ActionEvent; 3import java.awt.event.ActionListener; 4 5import javax.swing.ImageIcon; 6import javax.swing.JButton; 7import javax.swing.JPanel; 8 9public class KookieButton extends JPanel implements ActionListener { 10 public KookieButton() { 11 // TODO 自動生成されたコンストラクター・スタブ 12 this.setBounds(0,0,GameScreen.gamePanel_WEIGHT,GameScreen.gamePanel_HEIGHT); 13 this.setLayout(null); 14 this.add(button()); 15 System.out.println(this); 16 } 17 public JButton button() { 18 ImageIcon icon=new ImageIcon("src/photo/1r.png"); 19 JButton jButton = new JButton(icon); 20 jButton.setLayout(null); 21 jButton.setBounds(100, 100, 230,280); 22 jButton.addActionListener(this); 23 jButton.setContentAreaFilled(false);//ボタンの背景を透明化 24 jButton.setBorderPainted(false);//枠線を透明化 25 return jButton; 26 } 27 @Override 28 public void actionPerformed(ActionEvent e) { 29 // TODO 自動生成されたメソッド・スタブ 30 System.out.println("イクヨー");//aキャラをクリックされたらイクヨー 31 } 32
試したこと
http://www.kisse-logs.com/2017/06/11/swing-jlayeredpane/
URLのLayeredPaneを試しました。
JLayeredPaneを、基盤となるPanel(プログラム一つ目)で継承し、背景及びボタンをsetLayerで順位付け、ボタンが優先的に前の
Layerに出力されるようにしましたが、効果がありませんでした。
補足情報(FW/ツールのバージョンなど)
実装環境はEclipseです。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/08/25 13:49