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

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

ただいまの
回答率

89.20%

パネルを切り替えたい

解決済

回答 2

投稿

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

maikel

score 37

パネルを切り替えるプログラムを作りたいです。

私が作ったプログラムではパネルが切り替わりません。エラーは出ていないです。
ネットに合ったものを参考にして作ったのですが、どこが間違っているのでしょうか。
ご教授願えないでしょうか。

問題の自作プログラムです。

package app;

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class MainFrame extends JFrame implements ActionListener{
JPanel panel;
CardLayout layer;

public static void main(String args[]){
    MainFrame frame = new MainFrame();
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setBounds(100,20,1000,700);
    frame.setTitle("直観力トレーニング");
    frame.setVisible(true);
}

MainFrame(){

//scene1
JPanel scene1 = new JPanel();
JPanel titlesPanel = new JPanel();
JLabel title = new JLabel("直観力テスト");
title.setFont(new Font(Font.SERIF,Font.BOLD,50));
titlesPanel.setPreferredSize(new Dimension(100,300));


titlesPanel.add(title);
scene1.add(titlesPanel);

getContentPane().add(titlesPanel,BorderLayout.PAGE_START);



//scene2
JPanel scene2 = new JPanel();
scene2.setBackground(Color.BLUE);

//matomeru
this.panel = new JPanel();
this.layer = new CardLayout();
this.panel.setLayout(this.layer);

this.panel.add(scene1,"menue");
this.panel.add(scene2,"view");


JPanel buttonsPanel = new JPanel();
JButton jb = new JButton("直観力テストスタート");
jb.setPreferredSize(new Dimension(200,50));
jb.addActionListener(this);
jb.setActionCommand("view");

buttonsPanel.add(jb);
scene1.add(buttonsPanel);
getContentPane().add(buttonsPanel,BorderLayout.CENTER);
this.panel.add(scene2);

}
public void actionPerformed(ActionEvent e){
    String cmd = e.getActionCommand();
    layer.show(this.panel,cmd);
}
}

参考にしたプログラム

package test;

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class a7 extends JFrame implements ActionListener{
JPanel panel;
CardLayout layer;
    public static void main(String[] args) {
        a7 frame = new a7();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setBounds(100,100,500,500);
        frame.setTitle("sakusei");
        frame.setVisible(true);
    }
    a7(){
        //page1
        JPanel scene1 = new JPanel();
        scene1.setBackground(Color.BLUE);
        scene1.add(new JButton("butoon"));

        //page2
        JPanel scene2 = new JPanel();
        scene2.setBackground(Color.RED);
        scene2.add(new JLabel("page2"));

        //matomeru
        this.panel = new JPanel();
        this.layer = new CardLayout();
        this.panel.setLayout(this.layer);

        this.panel.add(scene1, "menue");
        this.panel.add(scene2, "view");

        JButton button2 = new JButton("mmenue");
        button2.addActionListener(this);
        button2.setActionCommand("menue");

        JButton button3 = new JButton("view");
        button3.addActionListener(this);
        button3.setActionCommand("view");

        //button's Panel
        JPanel kotei = new JPanel();
        kotei.add(button2);
        kotei.add(button3);

        getContentPane().add(this.panel,BorderLayout.CENTER);
        getContentPane().add(kotei,BorderLayout.PAGE_END);
    }

public void actionPerformed(ActionEvent e){
    String cmd = e.getActionCommand();
    layer.show(this.panel,cmd);
}
}
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 2

checkベストアンサー

+2

// 原因は2箇所

getContentPane().add(buttonsPanel, BorderLayout.CENTER);

this.panel.add(scene2);

1,getContentPane()に追加している対象が、CardLayoutを使用しているthis.panelではなく、
その子である、buttonsPanelです。
2,this.panel.add(scene2);と上で既にthis.panel.add(scene2,"view");を行っているのに再度追加しています。

this.panel.add(scene1,"menue");
this.panel.add(scene2,"view");

this.panel.add(scene2);

Swing画面をデバックする時は、Swingの画面をクリックしCtrl+Shift+F1を押すと標準出力にコンポーネントツリーが出力されます。デバックする時に参考になるかと。
デバックする時に見るべきポイントはcontentPane以降の情報です。以下は抜粋です。

javax.swing.JPanel[null.contentPane,0,0,982x653,layout=javax.swing.JRootPane$1
 javax.swing.JPanel[,0,0,982x300,layout=java.awt.FlowLayout,
  javax.swing.JLabel[,332,5,318x65,alignmentX=0.0,alignmentY=0.0,
 javax.swing.JPanel[,0,300,982x353,layout=java.awt.FlowLayout,
  javax.swing.JButton[,391,5,200x50,alignmentX=0.0,alignmentY=0.5,

contentPane以下にJPanelが2つ有り、どちらもlayout=の属性がjava.awt.FlowLayoutなのでFowLayoutを使用しています。=java.awt.CardLayoutを使用していない事が分かります。そこからcontentPaneaddしている内容は正しいのか?
こんな感じでデバックしてみてくださいな。


最後にeclipseを使用しているなら、ソースコードを右クリック→ソース→フォーマットでインデントが正しくなります。ご参考まで。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/08/14 15:07

    最後にもう少しだけいいですか?
    言われていたところを直したと思われる文章です。これでもパネルが遷移しないのですが
    package app;

    import javax.swing.*;
    import java.awt.*;
    import java.awt.event.*;

    public class SecondPanel extends JFrame implements ActionListener {
    JPanel panel;
    CardLayout layer;

    public static void main(String args[]) {
    MainFrame frame = new MainFrame();
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setBounds(100, 20, 1000, 700);
    frame.setTitle("直観力トレーニング");
    frame.setVisible(true);
    }

    SecondPanel() {

    // scene1
    JPanel scene1 = new JPanel();
    JPanel titlesPanel = new JPanel();
    JLabel title = new JLabel("直観力テスト");
    title.setFont(new Font(Font.SERIF, Font.BOLD, 50));
    titlesPanel.setPreferredSize(new Dimension(100, 300));
    titlesPanel.add(title);
    scene1.add(titlesPanel, BorderLayout.PAGE_START);

    JButton jb = new JButton("直観力テストスタート");
    jb.setPreferredSize(new Dimension(200, 50));
    JPanel buttonsPanel = new JPanel();
    buttonsPanel.add(jb);
    scene1.add(buttonsPanel, BorderLayout.CENTER);

    // scene2
    JPanel scene2 = new JPanel();
    scene2.setBackground(Color.BLUE);

    // matomeru
    this.panel = new JPanel();
    this.layer = new CardLayout();
    this.panel.setLayout(this.layer);

    this.panel.add(scene1, "menue");
    this.panel.add(scene2, "view");

    // ボタン用のパネル
    jb.addActionListener(this);
    jb.setActionCommand("view");

    // カードレイアウトに追加
    getContentPane().add(this.panel);




    }

    public void actionPerformed(ActionEvent e) {
    String cmd = e.getActionCommand();
    layer.show(this.panel, cmd);
    }

    }

    キャンセル

  • 2018/08/14 15:10 編集

    @maikelさんへ
    MainFrame frame = new MainFrame();としているので、SecondPanelクラスはインスタンス化されていません。

    キャンセル

  • 2018/08/14 17:21

    それでした。ありがとうございます。説明分かり易かったです。

    キャンセル

  • 2018/08/14 17:35

    @maikelさんへ
    解決してよかったですー。。

    キャンセル

-1

以前、cardlayoutを勧められましたが、やはり流行ってないのでしょうか

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/08/14 11:19

    cardlayoutも使いやすいと思うけどね。

    キャンセル

  • 2018/08/14 11:26 編集

    @maikelさんへ
    どちらかというと
    1,JavaでGUIアプリを作るのが流行っていない(Swingは苦労の割に労力が合わないのがあるので)
    2,teratailで回答される方が少ない。
    3,情報をアウトプットされる方が少ない。

    この3つでしょうか。
    デスクトップアプリを作りたいなら、C#をお勧め致します。そっちなら資料が大量にあるかと。

    キャンセル

  • 2018/08/14 13:32

    そういわれると、そうかもといったところがありますねぇ。いろいろあるんだなぁ。

    キャンセル

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

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

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