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

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

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

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

Q&A

1回答

979閲覧

グリッドレイアウトでパネルを複数表示する方法について

IceBear

総合スコア0

Java

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

0グッド

0クリップ

投稿2023/06/16 17:18

編集2023/06/16 17:31

実現したいこと

グリッドレイアウトでカウンタを作りたい。
パネルを2つウィンドウに表示したい。

前提

javaでカウンタのプログラムを作っています。
以下に問題文と実行したい結果を載せます。
グリッドレイアウト を用いて,実行例のように表示用の 1 つのラベルと制御用の 4 つのボタンを表示するプログラムを作成しなさい.ただし,ウィンドウサイズは横 640 画素,縦 240 画素とし,ウィンドウのタイトルに「基本課題 4」と表示すること.また,ウィンドウはプログラムの起動時にディスプレイの中央に表示されるようにすること.さらに,ActionLister を用いて,以下の機能を実装しなさい.
・ 「+1 ボタン」「+10 ボタン」「+100 ボタン」はそれぞれラベルの数字を 1,10,100 だけ増加させる.
・ 「リセットボタン」はラベルの数字を 1 に初期化する.(起動時のラベルの数字も 1 にすること.)
イメージ説明

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

カウンタの数値のラベルと数値を増やすボタンのパネルを別々に表示したいが、最後に追加したボタンのパネルだけ表示されてしまいます。

該当のソースコード

java

1package kadai; 2 3import java.awt.GridLayout; 4import java.awt.event.ActionEvent; 5import java.awt.event.ActionListener; 6 7import javax.swing.JButton; 8import javax.swing.JFrame; 9import javax.swing.JLabel; 10import javax.swing.JPanel; 11import javax.swing.SwingUtilities; 12 13public class Kihon4 { 14 15 private JFrame jf = null; 16 private JPanel cp = null; 17 private JPanel cp2 = null; 18 private JLabel jl = null; 19 private JButton jb = null, jb2 = null, jb3 = null, jb4 = null; 20 private int i = 1; 21 22 private JFrame getJFrame() { 23 if (jf == null) { 24 jf = new JFrame(); 25 jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 26 jf.setSize(640, 240); 27 jf.setLocationRelativeTo(null); 28 jf.setContentPane(getJContentPane()); 29 jf.setContentPane(getJContentPane2()); 30 jf.setTitle("基本課題4"); 31 } 32 return jf; 33 } 34 35 private JPanel getJContentPane() { 36 if (cp == null) { 37 cp = new JPanel(); 38 cp.setLayout(new GridLayout(1, 1)); 39 cp.add(getJLabel()); 40 } 41 return cp; 42 } 43 44 private JPanel getJContentPane2() { 45 if (cp2 == null) { 46 cp2 = new JPanel(); 47 cp2.setLayout(new GridLayout(1, 4)); 48 cp2.add(getJButton()); 49 cp2.add(getJButton2()); 50 cp2.add(getJButton3()); 51 cp2.add(getJButton4()); 52 } 53 return cp2; 54 } 55 56 private JLabel getJLabel() { 57 if (jl == null) { 58 jl = new JLabel(); 59 jl.setText(Integer.toString(i)); 60 } 61 return jl; 62 } 63 64 private JButton getJButton() { 65 if (jb == null) { 66 jb = new JButton(); 67 jb.setText("+1ボタン"); 68 jb.addActionListener(new MyActionListener()); 69 } 70 return jb; 71 } 72 73 private JButton getJButton2() { 74 if (jb2 == null) { 75 jb2 = new JButton(); 76 jb2.setText("+10ボタン"); 77 jb2.addActionListener(new MyActionListener2()); 78 } 79 return jb2; 80 } 81 82 private JButton getJButton3() { 83 if (jb3 == null) { 84 jb3 = new JButton(); 85 jb3.setText("+100ボタン"); 86 jb3.addActionListener(new MyActionListener3()); 87 } 88 return jb3; 89 } 90 91 private JButton getJButton4() { 92 if (jb4 == null) { 93 jb4 = new JButton(); 94 jb4.setText("リセットボタン"); 95 jb4.addActionListener(new MyActionListener4()); 96 } 97 return jb4; 98 } 99 100 class MyActionListener implements ActionListener { 101 public void actionPerformed(ActionEvent e) { 102 i++; 103 jl.setText(Integer.toString(i)); 104 } 105 } 106 107 class MyActionListener2 implements ActionListener { 108 public void actionPerformed(ActionEvent e) { 109 i += 10; 110 jl.setText(Integer.toString(i)); 111 } 112 } 113 114 class MyActionListener3 implements ActionListener { 115 public void actionPerformed(ActionEvent e) { 116 i += 100; 117 jl.setText(Integer.toString(i)); 118 } 119 } 120 121 class MyActionListener4 implements ActionListener { 122 public void actionPerformed(ActionEvent e) { 123 i = 1; 124 jl.setText(Integer.toString(i)); 125 } 126 } 127 128 public static void main(String[] args) { 129 // TODO 自動生成されたメソッド・スタブ 130 SwingUtilities.invokeLater(new Runnable() { 131 public void run() { 132 Kihon4 application = new Kihon4(); 133 application.getJFrame().setVisible(true); 134 } 135 }); 136 } 137} 138 139 140 141### 試したこと 142パネルに2つを用意するためにをコンテントペーンを2つ設定せる処理を試しました。しかし、後から追加したボタンしか設定できませんでした 143 144### 補足情報(FW/ツールのバージョンなど) 145開発環境:Eclipse 2022 146OS: Windows 10 147

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

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

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

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

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

jimbe

2023/06/16 18:03 編集

質問のタグに Swing も入れた方が良いと思います。 また、ソースコードのマークダウン内に「試したこと」等が入ってしまっています。 マークダウンから出してください。
guest

回答1

0

java

1jf.setContentPane(getJContentPane()); 2jf.setContentPane(getJContentPane2());

コンテントペインとして設定できるのは一つだけです。 (set~ というメソッドは大抵は一つだけです。)

作るべき画面のようにするにはどのような構造にすれば良いのかを考えることも課題の一つなのでは無いでしょうか。

JPanel に add 出来るのは Component です。 JButton も JLabel も JPanel も Component です。
ボタンのパネルに『ボタンを横に4つ並べられている』のですから、パネルに『ラベルとパネルを縦に2つ並べる』ことも出来るはずです。


他にも色々(クセのある)書き方を整理すると、以下のようなコードにもなります。

java

1import java.awt.GridLayout; 2import java.awt.event.ActionListener; 3 4import javax.swing.*; //import は * で纏めることができる 5 6public class Kihon4Frame extends JFrame { //クラスをただの箱にするくらいなら役割を持たせる 7 public static void main(String[] args) { 8 SwingUtilities.invokeLater(() -> new Kihon4Frame().setVisible(true)); //Runnable は lamda 式で書ける 9 } 10 11 private static final String INIT_VALUE = "1"; //ラベル初期値 12 13 Kihon4Frame() { 14 super("基本課題4"); //ウィンドウのタイトルに「基本課題 4」と表示 → タイトルは JFrame のコンストラクトパラメータで設定できる 15 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 16 setSize(640, 240); //ウィンドウサイズは横 640 画素,縦 240 画素 17 setLocationRelativeTo(null); //プログラムの起動時にディスプレイの中央に表示 18 19 //コンストラクタ内でオブジェクトの利用記述が完結してしまえば変数をフィールドにする必要は無いし、コンポーネントをキャッシュするような処理も要らない 20 JLabel label = new JLabel(INIT_VALUE); //起動時のラベルの数字も 1 → 初期表示はコンストラクトパラメータで設定できる 21 22 int[] addends = new int[]{ 1, 10, 100 }; //加算数. この配列を修正するとボタンも変わる 23 JPanel buttonPanel = new JPanel(new GridLayout(1, addends.length + 1)); //JPanel のレイアウトはコンストラクトパラメータで設定できる 24 //「+1 ボタン」「+10 ボタン」「+100 ボタン」はそれぞれラベルの数字を 1,10,100 だけ増加させる. 25 for(int addend : addends) buttonPanel.add(createAdditionButton(label, addend)); 26 //「リセットボタン」はラベルの数字を 1 に初期化 27 buttonPanel.add(createButton("リセットボタン", e -> label.setText(INIT_VALUE))); //ActionListener は lamda 式で書ける 28 29 JPanel contentPane = new JPanel(new GridLayout(2, 1)); 30 contentPane.add(label); 31 contentPane.add(buttonPanel); 32 33 setContentPane(contentPane); 34 } 35 /** 36 * ラベル加算ボタンの生成 37 * @param label ラベル 38 * @param addend 増加させる数 39 */ 40 private JButton createAdditionButton(JLabel label, int addend) { 41 return createButton(String.format("%+dボタン", addend), e -> addTo(label, addend)); //addend をラベルとアクションの両方に使用することで、ラベルと動作を一致させる(バグ防止) 42 } 43 /** 44 * ボタンの生成 45 * @param text ボタンテキスト 46 * @param l アクションリスナ 47 */ 48 private JButton createButton(String text, ActionListener l) { 49 JButton button = new JButton(text); //ボタンの表示テキストはコンストラクトパラメータで設定できる 50 button.addActionListener(l); 51 return button; 52 } 53 /** 54 * ラベルの数字を増加させる 55 * @param label ラベル 56 * @param addend 増加させる数 57 */ 58 private void addTo(JLabel label, int addend) { 59 label.setText("" + (Integer.parseInt(label.getText()) + addend)); //ラベルの表示を数値化→増加→文字列してラベルに設定すれば、別途「値」を変数として持つ必要は無い 60 } 61}

投稿2023/06/16 18:08

編集2023/06/19 17:53
jimbe

総合スコア13327

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.31%

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

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

質問する

関連した質問