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

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

ただいまの
回答率

90.32%

  • Java

    14433questions

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

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

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 181

Kamoshika

score 3

 前提・実現したいこと

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

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

不具合の内容

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

import java.awt.BorderLayout;
import java.awt.CardLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

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

public class Sample extends JFrame implements ActionListener{
    CardLayout cLayout = new CardLayout();

    JPanel mainCP;

    public static void main(String args[]) {
        Sample frame = new Sample("画面遷移テスト");
        frame.setVisible(true);
    }

    public Sample(String title) {

        setTitle(title);
        setSize(1200, 800);
        setLocationRelativeTo(null);
        setDefaultCloseOperation(EXIT_ON_CLOSE);

        mainCP = new JPanel();
        getContentPane().add(mainCP, BorderLayout.CENTER);
        mainCP.setLayout(cLayout);
        add(mainCP);

        JPanel panel1 = new JPanel();

        JButton goPanel2 = new JButton("Panel2へ");
        goPanel2.addActionListener(this);
        goPanel2.setActionCommand("GoToPanel2");
        panel1.add(goPanel2);

        JPanel panel2 = new JPanel();
        JButton goPanel1 = new JButton("Panel1へ");
        goPanel1.addActionListener(this);
        goPanel1.setActionCommand("GoToPanel1");
        panel2.add(goPanel1);

        JButton goPanel3 = new JButton("Panel3へ");
        goPanel3.addActionListener(this);
        goPanel3.setActionCommand("GoToPanel3");
        panel2.add(goPanel3);

        JPanel  panel3 = new JPanel();

        //panel3.add(goPanel2); //問題の部分            

        mainCP.add(panel1, "panel1");
        mainCP.add(panel2, "panel2");
        mainCP.add(panel3, "panel3");
    }

    public void actionPerformed(ActionEvent e) {
        String cmd = e.getActionCommand();

        switch (cmd) {
            case "GoToPanel1":
                cLayout.show(mainCP, "panel1");
                break;

            case "GoToPanel2":
                cLayout.show(mainCP, "panel2");
                break;

            case "GoToPanel3":
                cLayout.show(mainCP, "panel3");
                break;
        }
    }

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • mts10806

    2018/05/19 13:25

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

    キャンセル

  • Kamoshika

    2018/05/19 13:39

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

    キャンセル

  • mts10806

    2018/05/19 13:40

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

    キャンセル

回答 1

checkベストアンサー

+1

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

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

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

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/05/19 19:41

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

    キャンセル

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

  • ただいまの回答率 90.32%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • Java

    14433questions

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