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

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

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

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

Q&A

3回答

5043閲覧

ボタンが押されると画像が上書きされるプログラムを作りたい

tanukichikisugi

総合スコア8

Java

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

1グッド

0クリップ

投稿2018/08/16 18:57

ボタンが押されると画像が上書きされるプログラムを作りたいイメージ説明

経済学のプログラムを作っています。右上のボタンを押すと左の画面に今ある画像が切り替わって、新しい画像が上書き表示されるプログラムを作りたいのですが、方法がわかりません。いろいろ試してみましたが、自分の力では解決できないと思いましたため、質問させて頂きます。GUIの枠組みはできているので、具体的な方法を教えていただければと思います。よろしくお願いします。

発生している問題・エラーメッセージ

エラーは特にございません

該当のソースコード

package keizaiapps;

import java.awt.Font;
import java.awt.GridLayout;

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

public class Haikei extends JFrame {

public static void main (String args [])
{
Haikei frame = new Haikei();

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setBounds(300, 100, 2000, 1000); frame.setTitle("kaizaiapps"); frame.setVisible(true); } Haikei(){ /*定義*/ JPanel p1 = new JPanel(); JPanel p2 = new JPanel(); JPanel p3 = new JPanel(); JPanel p4 = new JPanel(); JPanel p5 = new JPanel(); JPanel p6 = new JPanel(); JPanel p7 = new JPanel(); JPanel p8 = new JPanel(); JPanel p9 = new JPanel(); JPanel p10 = new JPanel(); JPanel p11 = new JPanel(); JPanel p12 = new JPanel(); JPanel p13 = new JPanel(); JPanel p14 = new JPanel(); JPanel p15 = new JPanel(); JPanel p16 = new JPanel(); JPanel p17 = new JPanel(); JPanel p18 = new JPanel(); JPanel p19 = new JPanel(); JPanel p20 = new JPanel(); JPanel p21 = new JPanel(); JPanel p22 = new JPanel(); JPanel p23 = new JPanel(); JPanel p24 = new JPanel(); JPanel p25 = new JPanel(); JPanel p26 = new JPanel(); JPanel p27 = new JPanel(); JPanel p28 = new JPanel(); JPanel p29 = new JPanel(); JPanel p30 = new JPanel(); JLabel l1 = new JLabel("ミクロ経済学"); l1.setFont(new Font("MS ゴシック", Font.BOLD, 30)); l1.setHorizontalTextPosition(JLabel.CENTER); l1.setVerticalTextPosition(JLabel.CENTER); JLabel l2 = new JLabel("マクロ経済学"); l2.setFont(new Font("MS ゴシック", Font.BOLD, 30)); l2.setHorizontalTextPosition(JLabel.CENTER); l2.setVerticalTextPosition(JLabel.CENTER); JLabel l3 = new JLabel("取引量"); l3.setFont(new Font("MS ゴシック", Font.BOLD, 30)); l3.setHorizontalTextPosition(JLabel.CENTER); l3.setVerticalTextPosition(JLabel.CENTER); JLabel l4 = new JLabel("価格"); l4.setFont(new Font("MS ゴシック", Font.BOLD, 30)); l4.setHorizontalTextPosition(JLabel.CENTER); l4.setVerticalTextPosition(JLabel.CENTER); JLabel l5 = new JLabel("失業者"); l5.setFont(new Font("MS ゴシック", Font.BOLD, 30)); l5.setHorizontalTextPosition(JLabel.CENTER); l5.setVerticalTextPosition(JLabel.CENTER); JLabel l6 = new JLabel("賃金"); l6.setFont(new Font("MS ゴシック", Font.BOLD, 30)); l6.setHorizontalTextPosition(JLabel.RIGHT); l6.setVerticalTextPosition(JLabel.CENTER); JLabel l7 = new JLabel(""); JLabel l8 = new JLabel(""); JLabel l9 = new JLabel(""); JLabel l10 = new JLabel(""); JButton b1 = new JButton("好況"); JButton b2 = new JButton("不況"); JButton b3 = new JButton("正の外部性"); JButton b4 = new JButton("負の外部性"); JButton b5 = new JButton("好 況"); JButton b6 = new JButton("不 況"); JButton b7 = new JButton("大不況"); JButton b8 = new JButton("成長戦略"); BevelBorder border = new BevelBorder(BevelBorder.RAISED); ImageIcon icon1 = new ImageIcon("図1.png"); JLabel label1 = new JLabel(icon1); ImageIcon icon3 = new ImageIcon("図3.png"); JLabel label3 = new JLabel(icon3); ImageIcon icon4 = new ImageIcon("図4.png"); JLabel label4 = new JLabel(icon4); /* 定義終了 パネル貼付 */ setLayout(new GridLayout(1, 2)); add(p1); add(p2); p1.setLayout(new GridLayout(3, 1)); p1.setBorder(border); p1.add(p28); p28.add(label1); p1.add(p29); p29.add(label3); p1.add(p30); p30.add(label4); p2.setLayout(new GridLayout(3, 1)); p2.add(p25); p2.add(p26); p2.add(p27); p25.setLayout(new GridLayout(2, 1)); p25.add(p3); p25.add(p4); p25.setBorder(border); p26.setLayout(new GridLayout(2, 1)); p26.add(p5); p26.add(p6); p26.setBorder(border); p27.setLayout(new GridLayout(2, 1)); p27.add(p7); p27.add(p8); p27.setBorder(border); p3.add(l1); p4.setLayout(new GridLayout(1, 4)); p4.add(p9); p9.add(b1); p4.add(p10); p10.add(b2); p4.add(p11); p11.add(b3); p4.add(p12); p12.add(b4); p5.add(l2); p6.setLayout(new GridLayout(1, 4)); p6.add(p13); p13.add(b5); p6.add(p14); p14.add(b6); p6.add(p15); p15.add(b7); p6.add(p16); p16.add(b8); p7.setLayout(new GridLayout(1, 4)); p7.add(p17); p17.add(l3); p17.setBorder(border); p7.add(p18); p18.add(l4); p18.setBorder(border); p7.add(p19); p19.add(l5); p19.setBorder(border); p7.add(p20); p20.add(l6); p20.setBorder(border); p8.setLayout(new GridLayout(1, 4)); p8.add(p21); p21.add(l7); p21.setBorder(border); p8.add(p22); p22.add(l8); p22.setBorder(border); p8.add(p23); p23.add(l9); p23.setBorder(border); p8.add(p24); p24.add(l10); p24.setBorder(border); setSize(300, 200); show(); } ![イメージ説明](41aa318474372c34449faa883467a72d.png)

}

試したこと

public void actionPerformed(ActionEvent e){ や画像をリセットするためにremoveAllなどを使ってみましたが、うまくいきませんでした。

補足情報(FW/ツールのバージョンなど)

Eclips,java

John_doe_774👍を押しています

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

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

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

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

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

m.ts10806

2018/08/16 21:24

「Swing」もタグに追加してください。プログラムコード(およびエラーメッセージ)は質問内容としては最も重要な部分であるため、見やすくしていただけると助かります。<code>ボタン押下→「コード」部分にコードを貼り付け→「ここに言語を入力」に対象言語名記入(エラーメッセージの場合は不要)の手順で「コードハイライト化」してください。(質問編集画面ではリアルタイムでプレビューが表示されるので見ながら調整してください)
m.ts10806

2018/08/16 21:26

ところでこのコードでは要件はどこまで達成できているのでしょうか?「できているところ」「できていないところ」「わかっていること」「わかっていないこと」を明確にしてください。https://teratail.com/help/question-tips#questionTips2-1
guest

回答3

0

ボタンを押す毎に再描画することが出来たので参考になればと思います。
大まかな動きの流れなどの確認は出来るはずです。

追記:
@umyuさんのご協力ご指導の元無事完成しました。
GUI初実装でしたのでとても勉強になりました。ありがとうございました。

ポイントは
ActionListenerインターフェースを使ってボタンがクリックされた場合のイベントを利用する
・ボタンがクリックされた状態をフラグを使ってボタン制御OnOffする
・paint()は使わずにpaintComponent()を@Overrideして利用する

・描画用パネルgraphなどを作りpaintComponent()内でボタン制御OnOffを判定し再描画させたいものを制御する
・再描画はrepaint()で行う

ActionListenerインターフェース
Swingで描画する
再描画イベント

GUI実装したことが無くやってみたら結構大変でしたので見に来た方のお役に立てればと思います。
(出来る方にしてみればなんのことはないのでしょうが・・・)

動作説明
初期状態は描画無し
各ボタンをOnOfし青と赤の円を描画し両方offで表示無し
青と赤両方Onなら赤だけ表示

イメージ説明

JAVA

1package sample; 2 3import java.awt.BorderLayout; 4import java.awt.Color; 5import java.awt.Graphics; 6import java.awt.Graphics2D; 7import java.awt.event.ActionEvent; 8import java.awt.event.ActionListener; 9import java.awt.geom.Ellipse2D; 10 11import javax.swing.JButton; 12import javax.swing.JFrame; 13import javax.swing.JLabel; 14import javax.swing.JPanel; 15import javax.swing.border.LineBorder; 16 17public class SampleSwing extends JFrame implements ActionListener { 18 19 private JPanel buttonPanel; 20 private JLabel label1; 21 private JLabel label2; 22 23 private boolean paintFlag1 = false; 24 private boolean paintFlag2 = false; 25 26 public static void main(String[] args) { 27 SampleSwing test = new SampleSwing("SampleSwing"); 28 29 test.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 30 test.setVisible(true); 31 } 32 33 SampleSwing(String title) { 34 setTitle(title); 35 setLocationRelativeTo(null); 36 37 setSize(400, 400); 38 39 label1 = new JLabel("ボタン1:青OFF"); 40 label1.setHorizontalAlignment(JLabel.LEFT); 41 label2 = new JLabel("ボタン2:赤OFF"); 42 label2.setHorizontalAlignment(JLabel.RIGHT); 43 44 JButton btn1 = new JButton("Button 1"); 45 btn1.addActionListener(this); 46 btn1.setActionCommand("Button 1"); 47 48 JButton btn2 = new JButton("Button 2"); 49 btn2.addActionListener(this); 50 btn2.setActionCommand("Button 2"); 51 52 //paintComponent()は自動で呼び出されるので 53 //別途ボタン制御OnOffのフラグを判定し 54 //描画させたいものを制御する 55 56 //paint()は使わずに 57 //paintComponent()を@Overrideして利用する 58 59 JPanel graph = new JPanel() { 60 @Override 61 public void paintComponent(Graphics g) { 62 63 super.paintComponent(g); 64 65 if (!paintFlag1 && !paintFlag2) { 66 return; 67 } 68 69 Graphics2D g2 = (Graphics2D) g; 70 if (paintFlag1) { 71 g2.setColor(Color.BLUE); 72 } 73 if (paintFlag2) { 74 g2.setColor(Color.RED); 75 } 76 Ellipse2D ellipse = new Ellipse2D.Double(0, 70, 150, 150); 77 g2.draw(ellipse); 78 } 79 }; 80 81 // JPanelのボーダー色を設定(可視化用) 82 graph.setBorder(new LineBorder(Color.CYAN)); 83 84 JPanel p = new JPanel(); 85 86 p.setLayout(new BorderLayout()); 87 getContentPane().add(p, BorderLayout.CENTER); 88 89 p.add(btn1, BorderLayout.NORTH); 90 p.add(btn2, BorderLayout.SOUTH); 91 92 //図形描画 93 p.add(graph, BorderLayout.CENTER); 94 95 p.add(label1, BorderLayout.WEST); 96 p.add(label2, BorderLayout.EAST); 97 } 98 99 //ボタン制御OnOff 100 @Override 101 public void actionPerformed(ActionEvent e) { 102 String cmd = e.getActionCommand(); 103 if (cmd.equals("Button 1")) { 104 paintFlag1 = !paintFlag1; 105 if (paintFlag1) { 106 label1.setText("ボタン1:青ON"); 107 } else { 108 label1.setText("ボタン1:青OFF"); 109 } 110 } else if (cmd.equals("Button 2")) { 111 paintFlag2 = !paintFlag2; 112 if (paintFlag2) { 113 label2.setText("ボタン2:赤ON"); 114 } else { 115 label2.setText("ボタン2:赤OFF"); 116 } 117 } 118 //再描画 119 repaint(); 120 } 121}

投稿2018/08/17 16:22

編集2018/08/18 09:42
opyon

総合スコア1009

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

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

umyu

2018/08/17 20:12 編集

@opyonさんへ 1, .add(label2, BorderLayout.PAGE_END);としていますが、BorderLayoutを使用していないかと。 参考:https://teratail.com/questions/141212 2, Swingの場合はpaintメソッドをオーバーライドせずに、paintComponentメソッドをオーバーライドしてくださいな。Swing Painting Guidelines https://www.oracle.com/technetwork/java/painting-140037.html#swing_summary ↓からは好みの問題になります。あくまでもこのようにも書けますという話です。 3, boolean変数を反転(Flip)させたい時は、paintFlag1 = !paintFlag1;が使えます。 4,画面に図形を描画したい時は、1個JPanelを作って、paintComponentをオーバライドして、getContentPane().addで登録すると、Ellipse2D.Doubleの座標計算で親コンポーネントの配置を意識しなくてもよくなります。 JPanel graph = new JPanel(){ @Override public void paintComponent(Graphics g) { super.paintComponent(g); } }; graph.setPreferredSize(new Dimension(300, 300)); getContentPane().add(graph);
opyon

2018/08/18 06:00

ありがとうございます順番に確かめながら勉強させていただいています。
opyon

2018/08/18 06:51

>1, BorderLayoutを使用していないかと。 何故動くのかはまだ理解に達してないのですが、コメントアウトすると何も表示されなくなるので、必要なのかなと。PAGE_ENDなども変更するとボタンを押したら表示されるラベルが移動するので機能してると思うのですが、勘違いでしたらすみません。
umyu

2018/08/18 07:05

>opyonさんへ あ、ごめんなさいーー。。JPanelと勘違いしていました。 誤った指摘申し訳ありませんでした。。
umyu

2018/08/18 07:26

>opyonさんへ まず、JFrameの中の要素を分解するとこのような画像になります。(私が作成した画像ではないですが) https://teratail.storage.googleapis.com/uploads/contributed_images/0667cb3276814fecdabf3e295b868dfe.png container == getContentPane()です。 そしてSwingにはもうご存知かと思いますが、レイアウトマネージャという概念があります。 画面項目の配置/表示の方法を決めれます。BorderLayout/FlowLayout/CardLayout etc
umyu

2018/08/18 07:27

>opyonさんへ いい感じの表示になってますねー。
umyu

2018/08/18 07:33

指摘の1で私が勘違いしてた点は container の既定のレイアウトマネージャがFlowLayout (JPanel)と同じと勘違いしていたのです。実際にはBorderLayoutです。 https://docs.oracle.com/javase/jp/10/docs/api/javax/swing/JRootPane.html >注: contentPaneのデフォルトのレイアウト・マネージャはBorderLayoutマネージャです。
opyon

2018/08/18 08:29

すまみません、ここでこのまま続けてよいのかちょっと気になりますが・・・ 1,-4,を実装してみた結果、今度は図形描画がされなくなりました。 回答を差し替えますのでお時間ある時で良いので見ていただけると助かります。
umyu

2018/08/18 08:39

パット見た感じではg2.draw(ellipse);の後のsuper.paintComponent(g);が原因ではー。
opyon

2018/08/18 08:55

基本を理解しないままにあれこれ切り貼りした結果なので仕方ないですね。 うまくいかないのでこの件は保留にして図形描画だけを行う方法の基礎から検索などしてみます。
opyon

2018/08/18 09:06

ありがとうございます。@umyuさんのコードで動くことを確認しました。 何がおかしかったのか写経させていただきながら確認してみます。
guest

0

切り替えるにはCardLayoutとActionListenerがと使えるかと。

Java

1import java.awt.CardLayout; 2import java.awt.event.ActionEvent; 3import java.awt.event.ActionListener; 4 5public class Haikei extends JFrame implements ActionListener { 6 // 間違って代入されないようにfinalで宣言する。 7 private final JPanel graphPanel = new JPanel(new CardLayout()); 8 Haikei(){ 9 // 前略 10 // 変数b1~b8を配列化 11 final JButton[] Buttons = new JButton[] { new JButton("好況"), new JButton("不況"), new JButton("正の外部性"), 12 new JButton("負の外部性"), new JButton("好 況"), new JButton("不 況"), new JButton("大不況"), new JButton("成長戦略") }; 13 final String[] graphs = { "図1", "図2", "図1", "図1", "図1", "図2", "図3", "図4" }; 14 for (int i = 0; i < Buttons.length; i++) { 15 final JButton button = Buttons[i]; 16 button.setActionCommand(graphs[i]); 17 button.addActionListener(this); 18 panel.add(button); 19 } 20 // 第二引数の文字列はJButton#setActionCommandの文字列と一致する必要があります。 21 graphPanel.add(label1, "図1"); 22 // 4ボタンなのに図2が質問文のコードにはないのですが。その点問題ないでしょうか? 23 graphPanel.add(label3, "図3"); 24 graphPanel.add(label4, "図4"); 25 // 親フレームにパネルを追加。 26 // ※この部分は質問のコードを全部読んでないので、違うかもです。 27 add(graphPanel); 28 } 29 // オーバーライドアノテーションを付ける 30 @Override 31 public void actionPerformed(ActionEvent e) { 32 System.out.println(e.getActionCommand()); 33 final CardLayout card = (CardLayout) graphPanel.getLayout(); 34 card.show(graphPanel, e.getActionCommand()); 35 } 36}

プログラムは変数名が重要なので連番の変数名:p1p30はできるだけ避けてくださいな。
■対応案として

  • 変数名を適切な名前に変更。
  • 連番の代わりに配列を使う。
  • JPanelを継承するクラスを作る。

他の人がプログラムを見ても理解しやすくなります。

投稿2018/08/17 17:32

編集2018/08/20 17:42
umyu

総合スコア5846

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

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

opyon

2018/08/18 11:33

CardLayoutとActionListenerでの切り替えがスマートでいいですね。 WindowBuilderも便利そうでした。
yukkuri

2018/08/20 15:55

umyuさん、opyonさん、JPanelの連番のところは、配列なら解決するかも。 ちがったらすいません。
umyu

2018/08/20 17:43

@yukkuriさんへ 指摘ありがとうございました、回答を修正しましたー。
guest

0

よりシンプルにしてみましたのでご参考までに。
カードを切り替えて表示する

java

1 2import java.awt.BorderLayout; 3import java.awt.CardLayout; 4import java.awt.Color; 5import java.awt.Graphics; 6import java.awt.Graphics2D; 7import java.awt.event.ActionEvent; 8import java.awt.event.ActionListener; 9import java.awt.geom.Ellipse2D; 10 11import javax.swing.JButton; 12import javax.swing.JFrame; 13import javax.swing.JPanel; 14/** 15 * 16 * 参考:カードを切り替えて表示する 17 * https://www.javadrive.jp/tutorial/cardlayout/index2.html 18 * 19 */ 20public class SampleCardLayoutTest extends JFrame implements ActionListener { 21 22 JPanel cardPanel; 23 CardLayout layout; 24 25 public static void main(String[] args) { 26 SampleCardLayoutTest frame = new SampleCardLayoutTest(); 27 frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 28 frame.setBackground(Color.WHITE); 29 frame.setLocationRelativeTo(null); 30 frame.setTitle("CardLayout"); 31 frame.setSize(350, 200); 32 frame.setVisible(true); 33 } 34 35 //塗りつぶした円を描画する 36 JPanel makeGraph(Color color,int x,int y,int h,int w) { 37 JPanel newCard = new JPanel() { 38 @Override 39 public void paintComponent(Graphics g) { 40 41 super.paintComponent(g); 42 43 Graphics2D g2 = (Graphics2D) g; 44 Ellipse2D ellipse = new Ellipse2D.Double(x, y, h, w); 45 g2.setColor(color); 46 g2.setPaint(color); 47 g2.fill(ellipse); 48 g2.draw(ellipse); 49 } 50 }; 51 return newCard; 52 } 53 54 //CardLayoutと操作用ボタンの生成 55 SampleCardLayoutTest() { 56 57 /* カード1 */ 58 JPanel card1 = new JPanel(); 59 /* カード2 */ 60 JPanel card2 = makeGraph(Color.BLUE,50,50,50,50); 61 /* カード3 */ 62 JPanel card3 = makeGraph(Color.YELLOW,100,50,50,50); 63 /* カード4 */ 64 JPanel card4 = makeGraph(Color.RED,150,50,50,50); 65 66 cardPanel = new JPanel(); 67 layout = new CardLayout(); 68 cardPanel.setLayout(layout); 69 70 cardPanel.add(card1, "card1"); 71 cardPanel.add(card2, "card2"); 72 cardPanel.add(card3, "card3"); 73 cardPanel.add(card4, "card4"); 74 75 /* カード移動用ボタン */ 76 JButton firstButton = new JButton("First"); 77 firstButton.addActionListener(this); 78 firstButton.setActionCommand("First"); 79 80 JButton prevButton = new JButton("Prev"); 81 prevButton.addActionListener(this); 82 prevButton.setActionCommand("Prev"); 83 84 JButton nextButton = new JButton("Next"); 85 nextButton.addActionListener(this); 86 nextButton.setActionCommand("Next"); 87 88 JButton lastButton = new JButton("Last"); 89 lastButton.addActionListener(this); 90 lastButton.setActionCommand("Last"); 91 92 JPanel btnPanel = new JPanel(); 93 btnPanel.add(firstButton); 94 btnPanel.add(prevButton); 95 btnPanel.add(nextButton); 96 btnPanel.add(lastButton); 97 98 getContentPane().add(cardPanel, BorderLayout.CENTER); 99 getContentPane().add(btnPanel, BorderLayout.PAGE_END); 100 } 101 102 //ボタンでCardLayoutを制御 103 public void actionPerformed(ActionEvent e) { 104 String cmd = e.getActionCommand(); 105 106 if (cmd.equals("First")) { 107 layout.first(cardPanel); 108 } else if (cmd.equals("Last")) { 109 layout.last(cardPanel); 110 } else if (cmd.equals("Next")) { 111 layout.next(cardPanel); 112 } else if (cmd.equals("Prev")) { 113 layout.previous(cardPanel); 114 } 115 } 116}

投稿2018/08/18 20:57

opyon

総合スコア1009

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問