質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.40%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Swing

SwingはJavaに標準で付属するグラフィック関連のクラスライブラリを指します。

Eclipse

Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

Q&A

解決済

2回答

267閲覧

java swingのエラーが解決できない

ikigamikita

総合スコア20

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Swing

SwingはJavaに標準で付属するグラフィック関連のクラスライブラリを指します。

Eclipse

Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

0グッド

0クリップ

投稿2024/05/21 02:46

実現したいこと

エラーを解決したいです。よろしくお願いします。
イメージ説明

前提

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 がまだ初期化されていないのではないか?というとこまでは突き止めましたが、初期化の順序変えたりしてもエラーが増えるだけで解決できませんでした。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

エラーメッセージの通りですが、JLabel#getIcon() の戻り値の型は Icon で、setImageLabelBounds() の引数の型は ImageIcon です。ImageIconIcon の一種ですが、コンパイラには getIcon() の戻り値が本当に ImageIcon かどうかはわからないのでエラーになります。

この場合、setImageLabelBounds() の引数を Icon に変更すればコンパイルできるんじゃないでしょうか。または getIcon() が返すものが常に ImageIcon であると確証があるならキャストしてしまってもいいでしょう。

投稿2024/05/21 02:59

int32_t

総合スコア21421

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ikigamikita

2024/05/21 03:06

ありがとうございます。仰る通りキャストしたら解決いたしました。
guest

0

imageLabel.getIcon() の戻り値を ImageIcon 型にキャストしたら解決失しました

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((ImageIcon) imageLabel.getIcon()); // IconをImageIconにキャスト 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

投稿2024/05/21 03:04

ikigamikita

総合スコア20

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.40%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問