実現したいこと
前提
Eclipseにてswingを使ってアプリを作っています。その中で解決できないエラーがあります。
発生している問題・エラーメッセージ
型 TestFrame.CirclePanel のメソッド setImageLabelBounds(ImageIcon) は引数 (Icon) に適用できません
該当のソースコード
java
1package music2; 2 3import java.awt.Color; 4import java.awt.event.ActionEvent; 5import java.awt.event.ActionListener; 6import java.awt.event.MouseAdapter; 7import java.awt.event.MouseEvent; 8import java.io.IOException; 9import java.net.URL; 10 11import javax.sound.sampled.AudioInputStream; 12import javax.sound.sampled.AudioSystem; 13import javax.sound.sampled.Clip; 14import javax.sound.sampled.FloatControl; 15import javax.sound.sampled.LineEvent; 16import javax.sound.sampled.LineListener; 17import javax.sound.sampled.LineUnavailableException; 18import javax.sound.sampled.UnsupportedAudioFileException; 19import javax.swing.ImageIcon; 20import javax.swing.JFrame; 21import javax.swing.JLabel; 22import javax.swing.JPanel; 23import javax.swing.JSlider; 24import javax.swing.Timer; 25import javax.swing.event.ChangeEvent; 26import javax.swing.event.ChangeListener; 27 28public class TestFrame extends JFrame implements ChangeListener, LineListener { 29 public static void main(String[] args) { 30 new TestFrame().setVisible(true); 31 } 32 33 private JSlider slider; 34 private JLabel label; 35 private CirclePanel circlePanel; 36 private Clip clip; 37 private FloatControl gainControl; 38 39 TestFrame() { 40 super("アプリ"); 41 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 42 setSize(800, 800); 43 44 circlePanel = new CirclePanel(); 45 setContentPane(circlePanel); 46 47 label = new JLabel("test"); 48 label.setBounds(300, 10, 100, 100); 49 add(label); 50 51 JLabel label2 = new JLabel("テスト"); 52 label2.setBounds(300, 500, 100, 100); 53 add(label2); 54 55 slider = new JSlider(50, 150, 100); 56 slider.addChangeListener(this); 57 JPanel p = new JPanel(); 58 p.add(slider); 59 p.setBounds(300, 300, 200, 50); 60 add(p); 61 62 try { 63 loadAudioFile("ogawa.wav"); 64 } catch (UnsupportedAudioFileException | IOException | LineUnavailableException e) { 65 e.printStackTrace(); 66 } 67 } 68 69 private void loadAudioFile(String filePath) throws UnsupportedAudioFileException, IOException, LineUnavailableException { 70 URL url = getClass().getResource(filePath); 71 if (url != null) { 72 AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(url); 73 clip = AudioSystem.getClip(); 74 clip.open(audioInputStream); 75 gainControl = (FloatControl) clip.getControl(FloatControl.Type.MASTER_GAIN); 76 clip.addLineListener(this); 77 System.err.println("音声ファイルが見つかった: " + filePath); 78 } else { 79 System.err.println("音声ファイルが見つかりません: " + filePath); 80 } 81 } 82 83 public void stateChanged(ChangeEvent e) { 84 label.setText("値:" + slider.getValue()); 85 circlePanel.setDiameter(slider.getValue()); 86 float value = (float) slider.getValue() / 100f; // 0.5 ~ 1.5の範囲に正規化 87 gainControl.setValue(20f * (float) Math.log10(value)); // 音量の調整 88 } 89 90 @Override 91 public void update(LineEvent event) { 92 LineEvent.Type type = event.getType(); 93 if (type == LineEvent.Type.STOP) { 94 circlePanel.setStart(false); 95 } 96 } 97 98 private class CirclePanel extends JPanel { 99 private final int X = 350, Y = 250; 100 private int diameterOfCircle = 100; 101 private boolean start = false; 102 private Timer shakeTimer; 103 private int shakeOffset = 0; 104 private ImageIcon gifIcon, tamaIcon; 105 private JLabel imageLabel; 106 107 private class EllipseClickListener extends MouseAdapter { 108 @Override 109 public void mouseClicked(MouseEvent e) { 110 if (imageLabel.getBounds().contains(e.getPoint())) { 111 System.out.println(e.getPoint() + "=図形内"); 112 if (!start) { 113 start = true; 114 clip.start(); 115 startShaking(); 116 showGifAnimation(); 117 System.out.println(start); 118 } else { 119 start = false; 120 clip.stop(); 121 stopShaking(); 122 hideGifAnimation(); 123 System.out.println(start); 124 } 125 } else { 126 System.out.println(e.getPoint() + "=図形外"); 127 } 128 } 129 } 130 131 CirclePanel() { 132 super(null); 133 setBackground(Color.WHITE); 134 addMouseListener(new EllipseClickListener()); 135 initShakeTimer(); 136 137 // Load images 138 try { 139 URL tamaURL = getClass().getResource("tama.png"); 140 if (tamaURL != null) { 141 tamaIcon = new ImageIcon(tamaURL); 142 } else { 143 System.err.println("画像ファイルが見つかりません: tama.png"); 144 } 145 146 URL gifURL = getClass().getResource("purupuru.gif"); 147 if (gifURL != null) { 148 gifIcon = new ImageIcon(gifURL); 149 } else { 150 System.err.println("GIFファイルが見つかりません: purupuru.gif"); 151 } 152 153 imageLabel = new JLabel(tamaIcon); 154 add(imageLabel); 155 setImageLabelBounds(tamaIcon); // imageLabelの追加後に呼び出す 156 } catch (Exception e) { 157 e.printStackTrace(); 158 } 159 } 160 161 void setDiameter(int diameter) { 162 this.diameterOfCircle = diameter; 163 if (imageLabel != null) { 164 setImageLabelBounds(imageLabel.getIcon()); 165 } 166 repaint(); 167 } 168 169 void setStart(boolean start) { 170 this.start = start; 171 } 172 173 private void initShakeTimer() { 174 shakeTimer = new Timer(50, new ActionListener() { 175 @Override 176 public void actionPerformed(ActionEvent e) { 177 shakeOffset = (shakeOffset == 0) ? 5 : 0; 178 imageLabel.setLocation(X - imageLabel.getWidth() / 2 + shakeOffset, Y - imageLabel.getHeight() / 2); 179 } 180 }); 181 } 182 183 private void startShaking() { 184 shakeTimer.start(); 185 } 186 187 private void stopShaking() { 188 shakeTimer.stop(); 189 shakeOffset = 0; 190 imageLabel.setLocation(X - imageLabel.getWidth() / 2, Y - imageLabel.getHeight() / 2); 191 } 192 193 private void showGifAnimation() { 194 if (gifIcon != null && imageLabel != null) { 195 imageLabel.setIcon(gifIcon); 196 setImageLabelBounds(gifIcon); 197 } 198 } 199 200 private void hideGifAnimation() { 201 if (tamaIcon != null && imageLabel != null) { 202 imageLabel.setIcon(tamaIcon); 203 setImageLabelBounds(tamaIcon); 204 } 205 } 206 207 private void setImageLabelBounds(ImageIcon icon) { 208 if (icon != null) { 209 int width = icon.getIconWidth(); 210 int height = icon.getIconHeight(); 211 imageLabel.setBounds(X - width / 2, Y - height / 2, width, height); 212 } 213 } 214 } 215} 216
試したこと
setImageLabelBounds(imageLabel.getIcon()); がエラーになる原因は、imageLabel がまだ初期化されていないのではないか?というとこまでは突き止めましたが、初期化の順序変えたりしてもエラーが増えるだけで解決できませんでした。
![guest](/img/icon/icnUserSample.jpg)
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2024/05/21 03:06