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

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

新規登録して質問してみよう
ただいま回答率
85.35%
ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

Java

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

コンパイル

コンパイルとは、プログラミング言語のテキストソース(ソースコード)をコンピュータ上で実行可能な形式(オブジェクトコード)に変換することをいいます

コンパイルエラー

コンパイルのフェーズで生成されるエラーです。よく無効なシンタックスやタイプが含まれているとき発生します。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

2回答

1387閲覧

GridLayoutで指定した配列と異なった。どうしてなのか?

june0327

総合スコア4

ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

Java

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

コンパイル

コンパイルとは、プログラミング言語のテキストソース(ソースコード)をコンピュータ上で実行可能な形式(オブジェクトコード)に変換することをいいます

コンパイルエラー

コンパイルのフェーズで生成されるエラーです。よく無効なシンタックスやタイプが含まれているとき発生します。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2021/07/01 10:05

前提・実現したいこと

課題作成中に予想外の実行結果が出たので原因が知りたいです

発生している問題

プログラムソース内でGridLayout(3,6)と指定したはずなのに(4,6)になってしまった。コンパイルにはエラーがないのですが、実行ができなかったため、ソースファイル内のJpanel[]を増やしました。すると実行はできたのですが下の画像のようになりました。
完成理想図のようにしたいのですが、現状の問題点と改善案が欲しいです。

該当のソースコード

java

1import java.awt.*; 2import javax.swing.*; 3 4class kadai { 5 public static void main(String[] args){ 6 JFrame frame = new JFrame("kadai"); 7 frame.getContentPane().setPreferredSize(new Dimension(600,150)); 8 frame.pack(); 9 frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 10 MyPanel panel = new MyPanel(); 11 frame.add(panel); 12 frame.setVisible(true); 13 } 14} 15 16class MyPanel extends JPanel { 17 JButton[] btn; 18 JPanel[] pnl; 19 MyPanel(){ 20 setBackground(Color.lightGray); 21 setLayout(new GridLayout(6,3)); 22 this.btn = new JButton[3]; 23 for (int i = 0; i < 3; i++){ 24 this.btn[i] = new JButton("ボタン"+(i+1)); 25 } 26 this.pnl = new JPanel[18]; 27 for (int i = 0; i < 18; i++){ 28 this.pnl[i] = new JPanel(); 29 this.pnl[i].setOpaque(false); 30 } 31 int btnPtr = 0, pnlPtr = 0; 32 for (int i = 0; i < 18; i++){ 33 if ( i == 0 ){ 34 add(this.btn[btnPtr]); 35 btnPtr++; 36 } 37 if ( i == 12 ){ 38 add(this.btn[btnPtr]); 39 btnPtr++; 40 } 41 if ( i == 17 ){ 42 add(this.btn[btnPtr]); 43 btnPtr++; 44 } 45 else { 46 add(this.pnl[pnlPtr]); 47 pnlPtr++; 48 } 49 } 50 51 } 52} 53

コンパイル結果

イメージ説明

完成理想図

イメージ説明

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

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

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

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

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

guest

回答2

0

ベストアンサー

Java

1 else if ( i == 12 ){ 2 else if ( i == 17 ){

このように else if にしないと、panel は i が 17 以外の時すべて、
すなわち 17枚貼り付けるので、3つのボタンと合わせて、20個の要素を add します。
グリッドの個数を超えてしまうので、6 x 3 を 6 x 4 に勝手に変更してしまうのでしょう。

次のように書けばいいでしょう。

Java

1class MyPanel extends JPanel { 2 JButton[] btn; 3 JPanel[] pnl; 4 MyPanel(){ 5 setBackground(Color.lightGray); 6 setLayout(new GridLayout(6, 3)); 7 this.btn = new JButton[3]; 8 this.pnl = new JPanel[15]; 9 int btnPtr = 0, pnlPtr = 0; 10 for (int i = 0; i < 18; i++) { 11 if (i == 0 || i == 10 || i == 17) { 12 this.btn[btnPtr] = new JButton("ボタン"+(btnPtr+1)); 13 add(this.btn[btnPtr++]); 14 } 15 else { 16 this.pnl[pnlPtr] = new JPanel(); 17 this.pnl[pnlPtr].setOpaque(false); 18 add(this.pnl[pnlPtr++]); 19 } 20 } 21 } 22}

投稿2021/07/01 12:54

編集2021/07/01 13:59
kazuma-s

総合スコア8224

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

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

june0327

2021/07/01 19:38

回答ありがとうございます。 具体的でより、理解が深まりました。初心者なのですごくわかりやすいです。 とても参考になりました。
guest

0

https://docs.oracle.com/javase/jp/8/docs/api/java/awt/GridLayout.html

コンストラクタによって、またはsetRowsメソッドおよびsetColumnsメソッドによって、行数と列数のどちらもゼロ以外の値に設定されている場合、指定された列数は無視されます。代わりに、指定された行数およびレイアウトのコンポーネントの総数から、列数が決定されます。したがって、たとえば、3行と2列が指定されていて9つのコンポーネントをレイアウトに追加する場合、コンポーネントは3列の3行に表示されます。列数の指定がレイアウトに影響するのは、行数がゼロに設定された場合だけです。

とどのつまり、setLayout(new GridLayout(6, 3));と指定しても、6,3の数字は参考程度で、最終的にはいくつのコンポーネントを追加するかでレイアウトが決まる、と。

ということなので、次のロジックで何度add()メソッドが実行されるのかを考えてみるいい。
あなたの想定では18回かもしれませんが、本当にそうですか? わたしにはそれ以上に見えます。

java

1 2 for (int i = 0; i < 18; i++){ 3 if ( i == 0 ){ 4 add(this.btn[btnPtr]); 5 btnPtr++; 6 } 7 if ( i == 12 ){ 8 add(this.btn[btnPtr]); 9 btnPtr++; 10 } 11 if ( i == 17 ){ 12 add(this.btn[btnPtr]); 13 btnPtr++; 14 } 15 else { 16 add(this.pnl[pnlPtr]); 17 pnlPtr++; 18 } 19 }

投稿2021/07/01 12:45

shiketa

総合スコア4061

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

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

june0327

2021/07/01 12:54

解答いただきありがとうございます。 そもそもソースが完成理想を叶えられるようなソースではなく、また、このプログラムが実際にどういう仕組みなのか一つ一つ確認できていなかったです。java初心者で申し訳ないです。丁寧に解説してくださりありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問