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

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

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

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

Swing

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

URL

URL(ユニフォームリソースロケータ)とは、インターネット上のリソース(Webページや電子メールの宛先等)を特定するための形式的な記号の並びの事を言う。

Q&A

解決済

1回答

4059閲覧

URLで画像オブジェクトを指定、それをGUIで表示させる方法

nemurisann

総合スコア12

Java

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

Swing

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

URL

URL(ユニフォームリソースロケータ)とは、インターネット上のリソース(Webページや電子メールの宛先等)を特定するための形式的な記号の並びの事を言う。

0グッド

0クリップ

投稿2016/01/12 07:41

javaを用いてGUIの開発をしています。
現在はプログラム起動時にURLで指定した画像を1枚貼ることが出来ています。
その画像をボタンを押すことで別のURLで指定された画像に書き換える、ということをしたいのですがそこでつまづいています。

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;

import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class Main extends JFrame implements ActionListener{
ImageIcon icon;
URL url = null;
JPanel p;
JButton b;
int length,iconHeight,iconWidth;
JLabel label;
public static void main(String[] args) throws IOException{
Main frame = new Main();
frame.setTitle("sample");
frame.setBounds(100, 100, 1100, 800);
frame.setVisible(true);
}

Main() throws IOException{

p = new JPanel(); //画像が貼れるか検証 try{ url = new URL("http://pbs.twimg.com/media/CYeZi7TVAAAqpoy.png"); }catch(MalformedURLException E){ E.printStackTrace(); } icon = new ImageIcon(url); iconHeight = icon.getIconHeight(); iconWidth = icon.getIconWidth(); label = new JLabel(icon); label.setBounds(20,200,iconWidth,iconHeight); p.add(label); //ボタン作成 b = new JButton("b"); b.setBounds(400, 20, 100, 50); b.addActionListener(this); p.add(b); p.setLayout(null); getContentPane().add(p); } public void actionPerformed(ActionEvent e) { //ここの処理がわからないです //例としてhttp://www.javadrive.jp/tutorial/imageicon/hasami.pngに書き換えたいです }

}

この問題が解決したら次に複数枚の画像を貼り、それをボタンを押すことでまた別の複数枚の画像に変える事を考えています。そのことを考慮したうえでどうしたらよいか教えていただけますでしょうか。よろしくお願いします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

import java.awt.image.BufferedImage;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;

import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.imageio.ImageIO;
import java.nio.charset.*;

public class Main extends JFrame implements ActionListener{
ImageIcon icon;
URL url = null;
JPanel p;
JButton b;
int length,iconHeight,iconWidth;
JLabel label;
public static void main(String[] args) throws IOException{
Main frame = new Main();
frame.setTitle("sample");
frame.setBounds(100, 100, 1100, 800);
frame.setVisible(true);
}

Main() throws IOException{

p = new JPanel(); //画像が貼れるか検証 try{ url = new URL("http://pbs.twimg.com/media/CYeZi7TVAAAqpoy.png"); }catch(MalformedURLException E){ E.printStackTrace(); } icon = new ImageIcon(url); iconHeight = icon.getIconHeight(); iconWidth = icon.getIconWidth(); label = new JLabel(icon); label.setBounds(20,200,iconWidth,iconHeight); p.add(label); //ボタン作成 b = new JButton("b"); b.setBounds(400, 20, 100, 50); b.addActionListener(this); p.add(b); p.setLayout(null); getContentPane().add(p);

}

public void actionPerformed(ActionEvent e) { try { //Load another image from internet. url = new URL("http://www.javadrive.jp/tutorial/imageicon/hasami.png"); BufferedImage img = ImageIO.read(url); icon.setImage(img); repaint(); } catch (MalformedInputException E) { E.printStackTrace(); } catch (IOException E) { E.printStackTrace(); } }

}

このような感じで,actionPerformed内で別のURLをリロードし,
それをBufferedImageに変換することでiconにsetImageをするのはどうでしょうか?

ボタンをおすことで複数枚の画像を切り替えていくのは,
ボタンを押された回数または,現在のステートを表すカウンターのような変数を
インスタンス変数として持っておき,actionPerformed内で適切に更新するというのはどうでしょうか.

その際に,もし画像が予め決まっているのならば,カウンターの値と表示する画像の対応関係を予め
定数なりにもっておいて,actionPerformed無いでは,
カウンターの更新,新しいカウンターに合わせた画像の設定という二段階で更新するのが良いと思います.

もしカウンターに合わせた画像の設定が複雑ならば,その部分だけ別途privateメソッドにするのも
良いかもしれません.

投稿2016/01/12 15:49

Pocket7878

総合スコア19

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

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

nemurisann

2016/01/13 02:39

教えていただいたやり方で動作させてみたところうまくいきました。助かりました。 こちらを参考に引き続きプログラムを組もうと思います。的確な回答ありがとうございす。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問