Javaで指定した配列に値が格納されない

このQ&Aのポイント
  • Javaで指定した配列に値(画像)が挿入されずに困っています。
  • パネル上に2次元配列[10][10]のボタンと3つのコンボボックスを作成しました。
  • 行と列に対してどのインデックスを指定しても、必ず[2][2]の値(画像)が変わってしまいます。Javaは経験が浅いため、理由がわかりません。
回答を見る
  • ベストアンサー

Java(指定した配列に値が格納されない)

指定した配列に対して、値(画像)が挿入されずに困っています。 プログラムの概要を説明します。 パネル上に2次元配列[10][10]のボタンと3つのコンボボックスを造りました。 そしてコンボボックスは、行のインデックスを指定するもの、列のインデックスを指定するもの、 指定した場所に対して値(画像)を設定するもの、の3つでこれらが左から並んでいます。 現在の状況では、行と列に対してどのインデックスを指定しても、必ず[2][2]の値(画像)が変わってしまいます。 まだJavaは経験が浅いので、理由がわからず困っています。 よろしくお願いします。 import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; public class GUISwing18 extends JFrame implements ActionListener{ JButton[][] button = new JButton[10][10]; //ボタンに挿入する画像 final ImageIcon black = new ImageIcon("./image/black.gif"); final ImageIcon white = new ImageIcon("./image/white.gif"); final ImageIcon empty = new ImageIcon("./image/empty.gif"); public static void main(String[] args) { new GUISwing18(); } GUISwing18(){ getContentPane(); JPanel mainpanel = new JPanel(); mainpanel.setLayout(new BoxLayout(mainpanel, BoxLayout.Y_AXIS)); JPanel subpanel = new JPanel(); subpanel.setLayout(new GridLayout(10,10)); //ボタンを作る for(int i = 0 ; i < 100 ; i++){ button[i/10][i%10] = new JButton(black); subpanel.add(button[i/10][i%10]); } mainpanel.add(subpanel); //コンボボックスを設定 JPanel cb = new JPanel(new GridLayout(1,0)); JComboBox row = new JComboBox(); JComboBox side = new JComboBox(); JComboBox value = new JComboBox(); row.addItem("0"); side.addItem("0"); value.addItem("empty"); row.addItem("1"); side.addItem("1"); value.addItem("black"); row.addItem("2"); side.addItem("2"); value.addItem("white"); row.addItem("3"); side.addItem("3"); row.addItem("4"); side.addItem("4"); row.addItem("5"); side.addItem("5"); row.addItem("6"); side.addItem("6"); row.addItem("7"); side.addItem("7"); row.addItem("8"); side.addItem("8"); row.addItem("9"); side.addItem("9"); cb.add(side); cb.add(row); cb.add(value); row.addActionListener(this); side.addActionListener(this); value.addActionListener(this); mainpanel.add(cb); getContentPane().add(mainpanel); setSize(350,500); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setVisible(true); } public void actionPerformed(ActionEvent e) { JComboBox row = (JComboBox)e.getSource(); JComboBox side = (JComboBox)e.getSource(); JComboBox value = (JComboBox)e.getSource(); int x = row.getSelectedIndex(); int y = side.getSelectedIndex(); int z = value.getSelectedIndex(); switch(z){ case 0: button[x][y].setIcon(empty);break; case 1: button[x][y].setIcon(black);break; case 2: button[x][y].setIcon(white); break; } } }

  • Java
  • 回答数1
  • ありがとう数2

質問者が選んだベストアンサー

  • ベストアンサー
  • PecoPlus
  • ベストアンサー率76% (144/188)
回答No.1

 こんにちは。  actionPerformed メソッドにある JComboBox row = (JComboBox) e.getSource(); JComboBox side = (JComboBox) e.getSource(); JComboBox value = (JComboBox) e.getSource();  これらのコードでは、row, side, value は、常に全く同じ一つの JComboBox のインスタンスを指すことになります。  右辺が全く同じなので、当然です。  これらが同じと言うことは、x, y, z の値も常に同じと言うことになります。  ここに問題があります。

m5ni840j
質問者

お礼

ありがとうございます。 うまくいくように、試行錯誤してみます。

関連するQ&A

  • JavaのSwingのレイアウト

    Swingを学習中ですが、うまくレイアウトできません。 添付した画像のようなレイアウトにしたいです。 作ってみたものは以下です。 import java.awt.BorderLayout; import java.awt.Color; import javax.swing.*; public class LayoutTest { public static void main(String[] args) { JFrame frame = new JFrame(); JPanel panel = new JPanel(); JTextField searchFiled = new JTextField("テキスト"); String[] comboboxString = {"C", "C++", "Java"}; JComboBox comboBox = new JComboBox(comboboxString); JButton button = new JButton("ボタン"); panel.add(comboBox, BorderLayout.EAST); panel.add(searchFiled, BorderLayout.CENTER); panel.add(button, BorderLayout.WEST); frame.add(panel, BorderLayout.PAGE_START); JPanel redPanel = new JPanel(); redPanel.setBackground(Color.RED); frame.add(redPanel); frame.setSize(700, 500); frame.setLocationRelativeTo(null); frame.setVisible(true); } }

    • ベストアンサー
    • Java
  • テキストエリアの大きさをドラッグで調節したい

    _____________________________ || | | | etc | | | ============================= | | | JTextArea | | | | | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 上の図の=の部分を上下にドラッグすると、 JTextAreaの大きさを調節できるようにした いのですが、どうしたら良いのでしょうか? ソースは次のようにしています。 JPanel mainPanel = new JPanel(new GridLayout(2,1)); JPanel panel_1 = new JPanel(); panel_1.add(...); : etc部の追加 : mainPanel.add(panel_1); JPanel panel_2 = new JPanel(); panel_2.add(textArea); mainPanel.add(panel_2); getContentPane().add(mainPanel);

  • JAVAでの背景画像表示

    現在javaでゲームのメニュー画面を作っているのですが、ボタンを配置する所まではできたんですが、背景に画像を表示することができなくて困っています! import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JLabel; import javax.swing.ImageIcon; import java.awt.Container; import java.awt.BorderLayout; import javax.swing.border.LineBorder; import javax.swing.border.EtchedBorder; import java.awt.Color; import java.awt.Container; public class Mati extends JFrame{ public static void main(String[] args){ Mati frame = new Mati(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setBounds(10, 10,650,650); frame.setTitle("街"); frame.setVisible(true); JPanel h = new JPanel(); h.setOpaque(false); ImageIcon icon1 = new ImageIcon("Mati.jpg"); JLabel label1 = new JLabel(icon1); JLabel label2 = new JLabel(); h.add(label1); } Mati(){ JButton button1 = new JButton("宿屋"); button1.setFont(new Font("Mairyo", Font.PLAIN, 30)); JButton button2 = new JButton("道具屋"); button2.setFont(new Font("Mairyo", Font.PLAIN, 30)); JButton button3 = new JButton("武器屋"); button3.setFont(new Font("Mairyo", Font.PLAIN, 30)); JButton button4 = new JButton("街を出る"); button4.setFont(new Font("Mairyo", Font.PLAIN, 30)); JPanel p = new JPanel(); p.setLayout(new BoxLayout(p, BoxLayout.Y_AXIS)); p.add(Box.createRigidArea(new Dimension(10,30))); p.add(button1); p.add(Box.createRigidArea(new Dimension(5,8))); p.add(button2); p.add(Box.createRigidArea(new Dimension(5,8))); p.add(button3); p.add(Box.createRigidArea(new Dimension(5,8))); p.add(button4); getContentPane().add(p, BorderLayout.CENTER); } } ソースはこのようになっています。これからどうすれば背景画像が表示されるか教えていただきたいです。 よろしくお願いします。

  • コミュニケーション支援用の画面を作っております

    コミュニケーション画面を作っています。記号絵の表示です。絵で書いた紙を使っていましたが、かける絵が少なく、小さい表示しかできず不便を感じております。自分で次の紙をめくるのも手足が不自由で苦労しております。タブを付け、画面を表示したり、数個のボタンで絵記号を選ぶようにしたいです。(1)画面の北面に記号が意味する説明を表示し、中面には絵記号を並べ、南面には画面を押すたびに絵記号と説明が切り替わるようにしようとしています。(2)また、動作や物、人など分野別にインデックスを付け、そのインデックスも南面にのボタンで切り替わるようにしたいです。(1)間ではできたのですが、タブ(インデックス)上に(1)を置く方法がどうしても解りません。またタブをボタンで切り替える事もできません。コードは以下です。お詳しい方がおられましたら教えてください。 import javax.swing.*; import java.awt.CardLayout; import java.awt.BorderLayout; import java.awt.event.*; public class ekigou2 extends JFrame implements ActionListener{ JPanel cardPanel; JPanel cardPanel2; CardLayout layout; public static void main(String[] args){ ekigou2 frame = new ekigou2(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setBounds(10, 10, 300, 200); frame.setTitle("タイトル"); frame.setVisible(true); } ekigou2(){ JTabbedPane tabbedpane = new JTabbedPane(); //tubb_on_panel JPanel tabPanel1 = new JPanel(); JPanel tabPanel2 = new JPanel(); //tabb_image ImageIcon tbicon1 = new ImageIcon("./img/post.gif"); ImageIcon tbicon2 = new ImageIcon("./img/mail.gif"); //tab_set tabbedpane.addTab("tab1", tbicon1, tabPanel1); tabbedpane.addTab("tab2", tbicon2, tabPanel2); tabbedpane.setIconAt(1, tbicon1); tabbedpane.setIconAt(1, tbicon2); //card_icon_image ImageIcon cardicon1 = new ImageIcon("./img/dousa/203025行く.jpg"); ImageIcon cardicon2 = new ImageIcon("./img/dousa/203026来る.jpg"); //smol_icon_image ImageIcon icon1s = new ImageIcon("./img/dousa/203025行くs.jpg"); ImageIcon icon2s = new ImageIcon("./img/dousa/203026来るs.jpg"); // card_icon_roop JPanel card1 = new JPanel(); card1.add(new JButton("行く",cardicon1)); JPanel card2 = new JPanel(); card2.add(new JButton("来る",cardicon2)); cardPanel = new JPanel(); layout = new CardLayout(); cardPanel.setLayout(layout); cardPanel.add(card1, "button1"); cardPanel.add(card2, "button2"); // smol_icon_switch JButton button1 = new JButton("行く",icon1s); button1.addActionListener(this); button1.setActionCommand("button1"); JButton button2 = new JButton("来る",icon2s); button2.addActionListener(this); button2.setActionCommand("button2"); //小さいボタンを乗せる JPanel btnPanel = new JPanel(); btnPanel.add(button1); btnPanel.add(button2); JButton nextButton = new JButton("Next"); nextButton.addActionListener(this); nextButton.setActionCommand("Next"); JPanel btnPanel2 = new JPanel(); btnPanel2.add(nextButton); getContentPane().add(cardPanel, BorderLayout.NORTH);//card_button getContentPane().add(btnPanel, BorderLayout.WEST);//smol_button getContentPane().add(btnPanel2, BorderLayout.PAGE_END);//next_button getContentPane().add(tabbedpane);//tub_panel } public void actionPerformed(ActionEvent e){ String cmd = e.getActionCommand(); if (cmd.equals("Next")){ layout.next(cardPanel); } String cmd2 = e.getActionCommand(); layout.show(cardPanel, cmd2); } }

    • ベストアンサー
    • Java
  • getSelectedIndexでコンパイルエラー

    コンボボックスのインデックス値を取得したいのですが、System.out.println(cb.getSelectedIndex());でコンパイルエラーが出ます。 いろいろ調べてやってみましたが、どこが間違っているのかよく分かりません。 全くの初心者ですので、よろしくお願いします。 import java.awt.*; import java.awt.event.*; import javax.swing.*; public class cbx{ private JFrame frame; private JPanel panel; private JComboBox cb; public cbx(){ frame = new JFrame("題名"); //コンテンツ区画の取得 Container cont = frame.getContentPane(); //レイアウトマネージャーを使わない cont.setLayout(null); //パネルを作成してレイアウトをセット panel = new JPanel(); panel.setBackground(Color.WHITE); //コンボボックスを作成 JComboBox cb = new JComboBox(); cb.addItem("選択"); cb.addItem("レベル1"); cb.addItem("レベル2"); cb.addItem("レベル3"); cb.addItem("レベル4"); cb.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent ae) { System.out.println(cb.getSelectedIndex()); } }); //コンテンツ区画に追加 cont.add(panel); cont.add(cb); // setBounds(左上X座標,Y座標,幅,高さ) cb.setBounds(20,280,200,30); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setBounds(100, 100, 600, 400); frame.setVisible(true); } // main メソッドの定義 public static void main(String args[]){ cbx application = new cbx(); } }

    • ベストアンサー
    • Java
  • JPanelの重ね方/OverlayLayout他

    添付した画像のような「ピラミッドのように大きいコンポーネントの上にだんだん小さなコンポーネントを重ねていく」のではないコンポーネントの重ね方がしたいです。そのようなことは可能なのでしょうか? やりたいこととしては、メインとなるパネルのその上で別のレイアウトをしたパネルを重ねたいです。 普通のレイアウトマネージャでaddで重ねるのでは、どうやってもうまくいきません。 OverlayLayoutも試してみましたが、以下の二つのパターンではうまくいきませんでした。 注:TopPanel,MainPanel,StringPanelはJPanelを継承した自作のクラスです 理想はMainPanel < StringPanel < TopPanelなのですが・・ JPanel basePanel = new JPanel(); basePanel.setLayout(new OverlayLayout(basePanel)); topPanel = new TopPanel(); topPanel.setOpaque(false); basePanel.add(topPanel); mainPanel = new MainPanel(); mainPanel.setLayout(new BorderLayout()); stringPanel = new StringPanel(); stringPanel.setPrintSpeed(50); stringPanel.setBorder(new BevelBorder(BevelBorder.RAISED)); mainPanel.add("South", stringPanel); basePanel.add(mainPanel); add(basePanel); この場合だと、MainPanel < TopPanel < StringPanelの関係になってしまいます JPanel basePanel = new JPanel(); basePanel.setLayout(new OverlayLayout(basePanel)); mainPanel = new MainPanel(); mainPanel.setLayout(new BorderLayout()); stringPanel = new StringPanel(); stringPanel.setPrintSpeed(50); stringPanel.setBorder(new BevelBorder(BevelBorder.RAISED)); mainPanel.add("South", stringPanel); basePanel.add(mainPanel); topPanel = new TopPanel(); topPanel.setOpaque(false); basePanel.add(topPanel); add(basePanel); こうするとTopPanelの描画が見えなかったのでおそらくTopPanel < MainPanel < StringPanelとなってます。 ご教示願います・・!

  • Javaのプログラミング手伝ってください

    以下のソースコードを応用して、添付画像のような数字のかかれた画像を3つ並べてそれを回して7を揃えるというゲームを作りたいのですが全く進みません。どなたか完成させてくださいm(__)m使用する画像のファイル名は「slot1.jpeg」~「slot7.jpeg」です。 import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.ImageIcon; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.Timer; public class OneSlot extends JFrame implements ActionListener { private static final long serialVersionUID = 1L; final int MAX = 7; Timer timer = new Timer(150 , this); JLabel label= new JLabel("スタートで始まるよ",JLabel.CENTER); JButton[] bt = {new JButton("スタート"),new JButton("ストップ")}; JLabel slot= new JLabel(new ImageIcon("Slot1.jpg"),JLabel.CENTER); ImageIcon[] slot_icon = new ImageIcon[MAX]; int iCount = 0; OneSlot(String title) { super(title); timer.setActionCommand("timer"); setBounds(200, 200, 230, 150); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); for(int i = 0;i < slot_icon.length; i++) slot_icon[i] = new ImageIcon("Slot" + (i+1) + ".jpg"); add("North",label); add("Center",slot); JPanel p = new JPanel(); for (int i = 0; i < bt.length;i++) { bt[i].addActionListener(this); p.add(bt[i]); } add("South",p); setVisible(true); } public static void main(String[] args) { new OneSlot("スロットマシン"); } public void actionPerformed(ActionEvent e) { String cmd = e.getActionCommand(); if(cmd.equals("timer")) { if(++iCount == slot_icon.length) iCount = 0; slot.setIcon(slot_icon[iCount]); } if(e.getSource() == bt[0] && !timer.isRunning()) { label.setText("7が当たりだよ"); timer.start(); } else if(e.getSource() == bt[1] && timer.isRunning()) { if(iCount+1 == MAX) label.setText("やった!!おめでとう"); else label.setText("残念でした"); timer.stop(); } } }

  • javaでスタート画面を作っていて困っています。

    現在javaでゲームのスタート画面を作っているのですが、パネルが透過されずに困っています。 プログラムソースは import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JLabel; import javax.swing.ImageIcon; import java.awt.Container; import java.awt.BorderLayout; import javax.swing.*; import java.awt.Font; import java.awt.BorderLayout; import java.awt.Dimension; import java.awt.*; import java.awt.event.*; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JLabel; import javax.swing.ImageIcon; import java.awt.Container; import java.awt.BorderLayout; import javax.swing.border.LineBorder; import javax.swing.border.EtchedBorder; import java.awt.Color; import java.awt.Container; class Start最新版 extends JFrame{ public static void main(String args[]){ Start最新版 frame = new Start最新版("タイトル"); frame.setVisible(true); } Start最新版(String title){ setTitle(title); setBounds(10, 10, 1024, 768); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JPanel p = new JPanel(); p.setOpaque( false ); ImageIcon icon1 = new ImageIcon("Start.jpg"); JLabel label1 = new JLabel(icon1); JLabel label2 = new JLabel(); p.add(label1); Container contentPane = getContentPane(); contentPane.add(p, BorderLayout.CENTER); JButton button1 = new JButton("ゲームを始める"); button1.setFont(new Font("Mairyo", Font.PLAIN, 30)); JPanel n = new JPanel(); n.setOpaque(false); n.setLayout(new BoxLayout(n, BoxLayout.Y_AXIS)); n.add(Box.createRigidArea(new Dimension(290,30))); n.add(button1); となっています。「ゲームを始める」ボタンだけを残して、周りのパネルを透過して画像を表示させたいのですが、うまくいきません!解決方法をご存知の方どうか教えていただきたいです!よろしくお願いします。

  • JComboBoxの配列の作り方について

    class PdMenu extends JPanel implements ActionListener { private static final long serialVersionUID = 5962740427029989204L; /*-------------------------* * Variables. * *-------------------------*/ /*----- Pull-down menu -----*/ JComboBox[] pd=new JComboBox[10]; String[] arrDate={"00", "01", "02", "03"}; List<String> date=new ArrayList<String>(); static String[] result; /*-------------------------* * Cons. * *-------------------------*/ /*----- Creation -----*/ PdMenu() { date=Arrays.asList(arrDate); result=date.subList(0, 3).toArray(new String[]{}); for(int i=0; i<pd.length; i++){ pd[i]=new JComboBox<String>(); } pd[0]=new JComboBox<String>(result); } public void actionPerformed(ActionEvent e) { /*------*/ } } Eclipseを使用しています。 JComboBox[] pd=new JComboBox[10];の部分において、ジェネリックタイプを付けるようにと の警告が表示されている状態です。 JComboBoxの配列を作りたいのですが、ジェネリックタイプを付けると配列が作れません。 JComboBoxの配列を作る場合は、ジェネリックタイプを付ける事ができません。 警告の表示されない良い方法はありませんでしょうか? みなさま、よろしくお願いいたします。

    • ベストアンサー
    • Java
  • javaのBoxlayoutについて

    下記はBoxLayout用ののコードです。 Q1)Buttonのサイズを設定する方法がありますか? Q2)Buttonの配置を設定する方法がありますか? //===================================== import java.awt.BorderLayout; import java.awt.Dimension; import java.awt.LayoutManager; import javax.swing.BoxLayout; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JPanel; public class AlignmentX extends JFrame{ JButton button1; JButton button2; JButton button3; public static void main(String[] args){ AlignmentX frame = new AlignmentX(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setTitle("タイトル"); frame.setVisible(true); } AlignmentX(){ button1 = new JButton("AAAAA"); button1.setAlignmentY(0.5f); button1.setPreferredSize(new Dimension(80,20)); button2 = new JButton("BBB"); button2.setAlignmentY(0.5f); button2.setPreferredSize(new Dimension(80,20)); button3 = new JButton("CC"); button3.setAlignmentY(0.5f); button3.setPreferredSize(new Dimension(80,20)); JPanel p = new JPanel(); p.setLayout((LayoutManager) new BoxLayout(p, BoxLayout.Y_AXIS)); p.add(button1); p.add(button2); p.add(button3); getContentPane().add(p, BorderLayout.CENTER); setBounds(10, 10, 300, 200); } } //以上,宜しくお願いします。

    • ベストアンサー
    • Java

専門家に質問してみよう