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

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

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

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

Q&A

解決済

1回答

446閲覧

javaにて、同じJButtonを使いまわしたい

Kamoshika

総合スコア12

Java

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

0グッド

0クリップ

投稿2018/05/19 04:23

編集2018/05/19 04:37

前提・実現したいこと

Javaを使って画面遷移を行うプログラムを作っている初心者です。
パネル1からパネル2へと移動するボタンを、パネル3からパネル2へと移動するボタンとして使い回すことはできないだろうか?と思ったのですが、不具合が発生します。大人しくもう一つ同じようなボタンを作るしかないのでしょうか?

おそらく基本的なことの理解が足りていないのだろうと思ったのですが、どこのどういった理解が足りていないのかがわからないといった状況です。

###不具合の内容
エラーは発生しません。そのかわり、実行するとgoPanel2ボタンはパネル1には表示されず、パネル3のみに表示されるようになります。

java

1import java.awt.BorderLayout; 2import java.awt.CardLayout; 3import java.awt.event.ActionEvent; 4import java.awt.event.ActionListener; 5 6import javax.swing.JButton; 7import javax.swing.JFrame; 8import javax.swing.JPanel; 9 10public class Sample extends JFrame implements ActionListener{ 11 CardLayout cLayout = new CardLayout(); 12 13 JPanel mainCP; 14 15 public static void main(String args[]) { 16 Sample frame = new Sample("画面遷移テスト"); 17 frame.setVisible(true); 18 } 19 20 public Sample(String title) { 21 22 setTitle(title); 23 setSize(1200, 800); 24 setLocationRelativeTo(null); 25 setDefaultCloseOperation(EXIT_ON_CLOSE); 26 27 mainCP = new JPanel(); 28 getContentPane().add(mainCP, BorderLayout.CENTER); 29 mainCP.setLayout(cLayout); 30 add(mainCP); 31 32 JPanel panel1 = new JPanel(); 33 34 JButton goPanel2 = new JButton("Panel2へ"); 35 goPanel2.addActionListener(this); 36 goPanel2.setActionCommand("GoToPanel2"); 37 panel1.add(goPanel2); 38 39 JPanel panel2 = new JPanel(); 40 JButton goPanel1 = new JButton("Panel1へ"); 41 goPanel1.addActionListener(this); 42 goPanel1.setActionCommand("GoToPanel1"); 43 panel2.add(goPanel1); 44 45 JButton goPanel3 = new JButton("Panel3へ"); 46 goPanel3.addActionListener(this); 47 goPanel3.setActionCommand("GoToPanel3"); 48 panel2.add(goPanel3); 49 50 JPanel panel3 = new JPanel(); 51 52 //panel3.add(goPanel2); //問題の部分      53 54 mainCP.add(panel1, "panel1"); 55 mainCP.add(panel2, "panel2"); 56 mainCP.add(panel3, "panel3"); 57 } 58 59 public void actionPerformed(ActionEvent e) { 60 String cmd = e.getActionCommand(); 61 62 switch (cmd) { 63 case "GoToPanel1": 64 cLayout.show(mainCP, "panel1"); 65 break; 66 67 case "GoToPanel2": 68 cLayout.show(mainCP, "panel2"); 69 break; 70 71 case "GoToPanel3": 72 cLayout.show(mainCP, "panel3"); 73 break; 74 } 75 } 76 77}

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

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

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

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

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

m.ts10806

2018/05/19 04:25

「不具合」部分はコード内ではなく別でサブタイトルなどをつけて表記してください。エラーなど出ていましたら「起きていること」として追記してください。
Kamoshika

2018/05/19 04:39

失礼致しました。これでよろしいでしょうか?
m.ts10806

2018/05/19 04:40

はい。なるべくコードは実際のコードそのままでないと再現確認の際にノイズとなりえますので。
guest

回答1

0

ベストアンサー

ボタンに限らずswing/awt(他にJavaFXやおそらく他の多くのGUIシステムでも)画面を構成する部品(swing/awtではコンポーネントと呼びますね?)のインスタンスは一か所にしか置けません。

つまりpanel1の下にもpanel2の下にもおくというような配置はできないのです。なぜかといえばコンポーネントのインスタンスは

  • 自分がどの親(JPanel)インスタンスの下にいるか
  • 自分は親に対してどういう相対位置にあるか

といった画面階層に依存する情報を持っているからです。

大人しくもう一つ同じようなボタンを作るしかないのでしょうか?

そうするのが一番よいと思います。ある時はpanel1の下に置いて、またある時はpanel3の下に置くなんていう動的配置も不可能ではないですが、それはアクロバットに属するような設計方法でありややこしくなってバグが出やすくなるだけだと思います。

投稿2018/05/19 04:55

KSwordOfHaste

総合スコア18394

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

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

Kamoshika

2018/05/19 10:41

回答ありがとうございます。ご指摘の通り、大人しくもう一つボタンを作り足すことにします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問