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

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

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

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

Swing

SwingはJavaに標準で付属するグラフィック関連のクラスライブラリを指します。

Q&A

解決済

1回答

600閲覧

GridLayoutで配置されたコンポーネントを置き換える

CreeperSaviour

総合スコア129

Java

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

Swing

SwingはJavaに標準で付属するグラフィック関連のクラスライブラリを指します。

0グッド

0クリップ

投稿2019/05/06 06:49

前提・実現したいこと

4*4のGridLayoutを作成し、それぞれの場所にJButtonを配置した後に、ImageIconを下の写真のようにJButtonがある任意の場所に置き換え(または上乗せ)が出来るようにしたいです。

発生している問題

下の写真のように4*5に拡張され、一番最後にImageIconが追加されています。

該当のソースコード

Main.java

Java

1public class Main { 2 3 public static void main(String[] args) { 4 Window window = new Window(4, 4); 5 window.setVisible(true); 6 } 7} 8

Window.java

Java

1import java.awt.Container; 2import java.awt.GridLayout; 3import java.awt.event.ActionEvent; 4import java.awt.event.ActionListener; 5import java.util.stream.IntStream; 6 7import javax.swing.ImageIcon; 8import javax.swing.JButton; 9import javax.swing.JFrame; 10import javax.swing.JLabel; 11import javax.swing.JPanel; 12 13public class Window extends JFrame { 14 15 private final GridLayout grid = new GridLayout(); 16 private final JButton[][] field; 17 18 public Window(int rows, int columns) { 19 if(rows < 0 || columns < 0) throw new IllegalArgumentException("(rows, columns) = (" + rows + ", " + columns + ")"); 20 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 21 Container container = getContentPane(); 22 setBounds(0, 0, columns * 80, rows * 80); 23 grid.setRows(rows); 24 grid.setColumns(columns); 25 container.setLayout(grid); 26 setContentPane(container); 27 field = new JButton[rows][columns]; 28 IntStream.range(0, rows).forEach(row -> IntStream.range(0, columns).forEach(column -> { 29 field[column][row] = new JButton(); 30 field[column][row].addActionListener(new ActionListener() { 31 @Override 32 public void actionPerformed(ActionEvent e) { 33 System.out.println("(" + row + ", " + column + ")"); 34 } 35 }); 36 add(field[column][row]); 37 })); 38 ImageIcon image = new ImageIcon("flag.png"); 39 JPanel panel = new JPanel(); 40 JLabel label = new JLabel(image); 41 panel.add(label); 42 container.add(panel); 43 } 44 45} 46 47 48 49

試したこと

Java APIのGridLayoutの項目を見たり、Google検索を使ってみましたが、置き換えることが出来そうなメソッドは見つけることができませんでした。

補足情報

Java SE 1.8
Eclipse 2019-03

よろしくお願いします。

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2019/05/06 11:11

GridBagLayout で座標指定とか CardLayoutでON/OFFとかだろうけど そういうのに向かないんだよなぁ swing
CreeperSaviour

2019/05/06 15:31

なるほど、考えてみます。Swingを使わないのであれば何を使うべきでしょうか?
guest

回答1

0

ベストアンサー

子コンポーネントを直接入れ替えるようなメソッドはなかったと思いますので、

親コンポーネントに対し、

削除 remove(int index)
追加 add(Component comp, int index)

を行えばよいと思います。

java

1 2Container container = getContentPane(); 3. 4. 5. 6//i番目を入れ替える 7container.remove(i); 8container.add(new JPanel(), i); 9

ですね。

投稿2019/05/06 08:52

ngsvx

総合スコア287

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

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

CreeperSaviour

2019/05/06 09:49

回答ありがとうございます。 以下のように書いてみましたがどうも追加の処理がうまくいってないように見えます。 おかしいところがあればご指摘ください。 import java.awt.Container; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.stream.IntStream; import javax.swing.ImageIcon; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; public class Window extends JFrame { private final GridLayout grid = new GridLayout(); private final JButton[][] field; public Window(int rows, int columns) { if(rows < 0 || columns < 0) throw new IllegalArgumentException("(rows, columns) = (" + rows + ", " + columns + ")"); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); Container container = getContentPane(); setBounds(0, 0, columns * 80, rows * 80); grid.setRows(rows); grid.setColumns(columns); container.setLayout(grid); setContentPane(container); field = new JButton[rows][columns]; IntStream.range(0, rows).forEach(row -> IntStream.range(0, columns).forEach(column -> { field[column][row] = new JButton(); field[column][row].addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { JPanel panel = new JPanel(); panel.add(new JLabel(new ImageIcon("flag.png"))); System.out.println("(" + row + ", " + column + ")"); getContentPane().remove(row * rows + column); getContentPane().add(panel, row* rows + column); repaint(); } }); add(field[column][row]); })); } }
ngsvx

2019/05/06 12:30

「うまくいかない」とは、どのような状態のことを言っているのか明確に書いて下さい。 これは悪い質問のしかたです。
CreeperSaviour

2019/05/06 15:24

申し訳ありません。追って質問しましたが自己解決してしまいました。 先ほどはremove()が正常に動作するのにadd()が出来ていないのか、JButtonが消されるだけで、写真が追加されないので困っていました。 ただ、add(Component comp, int index)で(compに)渡すべきなのはJPanelではなく、JLabelであることに気づき、 - JPanel panel = new JPanel(); - panel.add(new JLabel(new ImageIcon("flag.png"))); - getContentPane().add(panel, row* rows + column); + getContentPane().add(new JLabel(new ImageIcon("flag.png")), row* rows + column); とすると想定していたように動作になりました。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問