• 締切済み

画像が表示されません。

画像のRGBヒストグラムを表示するプログラムを以下のように作りました。 import java.awt.*; import java.awt.event.*; import java.awt.image.*; import javax.swing.*; import javax.swing.ImageIcon; import java.io.*; class RGBMain{ public static void main(String argv[]){ JFrame f=new JFrame("画像とそのヒストグラム"); JPanel p1=new JPanel(); JPanel p2=new JPanel(); JPanel p3=new JPanel(); JLabel l1=new JLabel("input photo"); JLabel l2=new JLabel(); JTextField tf=new JTextField(15); JButton b1=new JButton("open"); JButton b2=new JButton("start"); LoadFile lf=new LoadFile(tf, l2, p2); ShowHist sh=new ShowHist(tf, p3); tf.addKeyListener(lf); b1.addActionListener(lf); b2.addActionListener(sh); p1.add(l1); p1.add(tf); p1.add(b1); p1.add(b2); p2.add(l2); f.setDefaultCloseOperation(f.EXIT_ON_CLOSE); f.getContentPane().add(p1,BorderLayout.NORTH); f.getContentPane().add(p2,BorderLayout.WEST); f.getContentPane().add(p3,BorderLayout.EAST); f.setSize(800, 500); f.setVisible(true); } } class LoadFile implements ActionListener, KeyListener{ JTextField textField; JLabel label; JPanel panel; public LoadFile(JTextField Textfield, JLabel lbl, JPanel pnl){ textField=Textfield; label=lbl; panel=pnl; } public void actionPerformed(ActionEvent e){ if(getClass().getResource(textField.getText())==null) label.setText("ファイルが見つかりません。"); else{ ImageIcon imgicon=new ImageIcon(getClass().getResource(textField.getText())); label.setIcon(imgicon); } label.repaint(); panel.repaint(); } public void keyTyped(KeyEvent e){ if(e.getKeyCode()==e.VK_ENTER){ if(getClass().getResource(textField.getText())==null) label.setText("ファイルが見つかりません。"); else{ ImageIcon imgicon=new ImageIcon(getClass().getResource(textField.getText())); label.setIcon(imgicon); } label.repaint(); panel.repaint(); } } public void keyPressed(KeyEvent e){ } public void keyReleased(KeyEvent e){ } } class ShowHist implements ActionListener{ JTextField textField; JPanel p; public ShowHist(JTextField Textfield, JPanel pnl){ textField=Textfield; p=pnl; } public void actionPerformed(ActionEvent e){ try{ File f=new File(textField.getText()); BufferedImage bi=javax.imageio.ImageIO.read(f); int rgb; int[] rhist=new int[16]; int[] ghist=new int[16]; int[] bhist=new int[16]; int re, gr, bl; int width=bi.getWidth()/3*2/16; for(int y=0;y<=bi.getHeight();y++){ for(int x=0;x<=bi.getWidth();x++){ rgb=bi.getRGB(x, y); bl=rgb%256; gr=bl%256; re=gr%256; rhist[re/16]++; ghist[gr/16]++; bhist[bl/16]++; } } Graphics g=p.getGraphics(); g.setColor(Color.red); int i; int xx=0; for(i=0;i<16;i++){ g.fillRect(xx, bi.getHeight()/3, width, bi.getHeight()/3*(rhist[i]/(bi.getWidth()*bi.getHeight()))); xx+=width; } g.setColor(Color.green); xx=0; for(i=0;i<16;i++){ g.fillRect(xx, bi.getHeight()/3*2, width, bi.getHeight()/3*(ghist[i]/(bi.getWidth()*bi.getHeight()))); xx+=width; } g.setColor(Color.green); xx=0; for(i=0;i<16;i++){ g.fillRect(xx, bi.getHeight()/3*3, width, bi.getHeight()/3*(bhist[i]/(bi.getWidth()*bi.getHeight()))); xx+=width; } p.repaint(); }catch(IOException ex){ ex.printStackTrace(); } } } コンパイルは問題なく通り、 実行すると、ウィンドウは表示されるのですが、ファイル名を入力して openボタンをクリックしてもなにも反応がありません。特に例外も発生していないようなのですが、なぜでしょうか。 ちなみに、画像ファイル名はtrain.jpgで、javaソースファイル、各classファイルと同じディレクトリに置いています。 どなたかよろしくお願いします。

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

みんなの回答

  • komi1341
  • ベストアンサー率65% (25/38)
回答No.2

#1です。 すいません、ヒストグラムの表示はStartボタンで行うんですね。見逃していました。 Openボタンで画像を読み込んでからStartボタンを押したところ、ArrayIndexOutOfBoundsExceptionが出ました。発生位置は > rhist[re/16]++; この行です。インデックス値が-15になっていました。 BufferedImageクラスのgetRGB()をAPIリファレンスで調べてみると、 http://java.sun.com./javase/ja/6/docs/ja/api/index.html 「デフォルト RGB カラーモデル (TYPE_INT_ARGB) 」で値を返すとあるので、アルファ成分も数値に含まれるのでしょう。下記のようにして上位16ビット分(アルファ値の領域)を削ってしまえば、argbではなくrgbの値を取得できます。 rgb=bi.getRGB(x, y); ↓ rgb=(bi.getRGB(x, y) & 0x00ffffff); あと、forループのx、yの上限がおかしいです。インデックスは0から始まる数値なので、<=だと1ずつ多く参照してしまいます。 for(int y=0;y<=bi.getHeight();y++){ for(int x=0;x<=bi.getWidth();x++){ ↓ for(int y=0;y<bi.getHeight();y++){ for(int x=0;x<bi.getWidth();x++){ これでエラーは発生しなくなりますが、ヒストグラムは表示されませんでした。これは画像によるのかもしれません。ただパネルp3のサイズ指定がないと、p3はコンテンツを含まないため小さいサイズで初期化されるようです(p3.setBackground(Color.BLACK);として頂ければ起動時に確認できると思います)ので、パネルのサイズについて検討する必要はありそうです。 あとENTERキー入力については、KeyTyped()ではなくKeyPressed()内で処理するように変更してみてください。getKeyCode()の値が異なるようです。 対症療法的な回答のみですみませんが、とりあえずエラーが出なくなるということで、いったん回答を終わらせて頂きます。

takau710
質問者

補足

回答ありがとうございます。 komi1341さんの言うとおりに直して、さらに手を加えて次のようにしました。 import java.awt.*; import java.awt.event.*; import java.awt.image.*; import javax.swing.*; import javax.swing.ImageIcon; import java.io.*; public class RGBMain { public static void main(String[] args) { JFrame f=new JFrame("画像とそのヒストグラム"); BTPanel p1=new BTPanel(); JPanel p2=new JPanel(); HistPanel p3=new HistPanel(); JLabel l2=new JLabel(); Dimension dm=new Dimension(650, 800); p3.setPreferredSize(dm); LoadFileorShowHist lfsh=new LoadFileorShowHist(p1.tf, l2, p1, p2, p3); p1.tf.addKeyListener(lfsh); p1.b1.addActionListener(lfsh); p1.b2.addActionListener(lfsh); p1.add(p1.l1); p1.add(p1.tf); p1.add(p1.b1); p1.add(p1.b2); p2.add(l2); f.setDefaultCloseOperation(f.EXIT_ON_CLOSE); f.getContentPane().add(p1,BorderLayout.NORTH); f.getContentPane().add(p2,BorderLayout.WEST); f.getContentPane().add(p3,BorderLayout.EAST); f.setSize(1300, 800); f.setVisible(true); } } public class BTPanel extends JPanel { public JLabel l1; public JTextField tf; public JButton b1, b2; public BTPanel(){ l1=new JLabel("input photo"); tf=new JTextField(15); b1=new JButton("open"); b2=new JButton("start"); } } public class HistPanel extends JPanel { private int[] rhist; private int[] ghist; private int[] bhist; private int n; private int width; private int w; private int h; public void setData(int[] rhist, int[] ghist, int[] bhist, int n, int width, int w, int h){ this.rhist=rhist; this.ghist=ghist; this.bhist=bhist; this.n=n; this.width=width; this.w=w; this.h=h; } public void paintComponent(Graphics g){ super.paintComponent(g); g.setColor(Color.red); int i; int xx=0; for(i=0;i<n;i++){ g.fillRect(xx, h/3, width, h/3*(rhist[i]/(w*h))); xx+=width; } g.setColor(Color.green); xx=0; for(i=0;i<n;i++){ g.fillRect(xx, h/3*2, width, h/3*(ghist[i]/(w*h))); xx+=width; } g.setColor(Color.blue); xx=0; for(i=0;i<n;i++){ g.fillRect(xx, h/3*3, width, h/3*(bhist[i]/(w*h))); xx+=width; } } } public class LoadFileorShowHist implements ActionListener, KeyListener { public JTextField textField; public JLabel label; public JPanel panel1; public HistPanel panel2; public BTPanel btpanel; public LoadFileorShowHist(JTextField Textfield, JLabel lbl, BTPanel btp, JPanel pnl1, HistPanel pnl2){ textField=Textfield; label=lbl; panel1=pnl1; panel2=pnl2; btpanel=btp; } public void actionPerformed(ActionEvent e) { if(e.getSource()==btpanel.b1){ String filename = textField.getText(); ImageIcon imgicon=new ImageIcon(filename); label.setIcon(imgicon); label.repaint(); panel1.repaint(); }else if(e.getSource()==btpanel.b2){ try{ File f=new File(textField.getText()); BufferedImage bi=javax.imageio.ImageIO.read(f); int rgb; int[] rhist=new int[16]; int[] ghist=new int[16]; int[] bhist=new int[16]; int re, gr, bl; int width=bi.getWidth()/3*2/16; for(int y=0;y<bi.getHeight();y++){ for(int x=0;x<bi.getWidth();x++){ rgb=(bi.getRGB(x, y)&0x00ffffff); bl=rgb%256; gr=bl%256; re=gr%256; rhist[re/16]++; ghist[gr/16]++; bhist[bl/16]++; } } int w=bi.getWidth(); int h=bi.getHeight(); Graphics g=panel2.getGraphics(); panel2.setData(rhist, ghist, bhist, 16, width, w, h); (HistPanelクラスpaintComponentメソッドからsuper.paintComponent(g)をのぞいた一連の動作) panel2.repaint(); }catch(IOException ex){ ex.printStackTrace(); } } } public void keyPressed(KeyEvent e) { if(e.getKeyCode()==e.VK_ENTER){ String filename = textField.getText(); ImageIcon imgicon=new ImageIcon(filename); label.setIcon(imgicon); label.repaint(); panel1.repaint(); } } public void keyReleased(KeyEvent arg0) { } public void keyTyped(KeyEvent arg0) { } } エラーは出なくなり、エンターキーも正しく動作するようになりましたが、startボタンを押すと、ヒストグラムを表示する位置が真っ白になって表示されます。なぜこうなるのかどうしてもわかりません。 よろしくお願いします。

  • komi1341
  • ベストアンサー率65% (25/38)
回答No.1

私の環境(XP、JDK6)では、openボタンを押すと画像が表示されました。ヒストグラムは表示されません。 ソースを見る限り、画像を読み込んでアイコンとしてラベルに貼り付けているので、書いてあるとおりの挙動に見えます。ヒストグラムを表示するにはShowHistクラスのactionPerformed()を呼ぶ必要がありそうですが、どこでも呼ばれていませんね。そのあたりが解決の鍵ではないかと。

takau710
質問者

補足

回答ありがとうございます。 調べたところ、表示しようとした画像ファイルが壊れていました。 別の正常な画像で実行したところ、表示されました。 初歩的なミスですみませんでした。 ShowHistクラスのactionPerformed()が呼ばれていないというのがよくわからないんですが…。 見た限りLoadFileクラスと特に違いはないのですが…。 あとEnterキーを押した時も反応しません。 Enterキーを押した時もopenボタンと同じ動作をするようにしたのですが…。

関連するQ&A

  • 画像がうまく切り替わらない

    画像がうまく切り替わらない 初心者なため、上記の通りうまく画像を切り替えることができません。 わかる方、申し訳ありませんがご協力お願いいたします。 QUIZフォルダにあるQ1.jpg~Q80.jpgまでの画像を問題文として使った、4択のクイズ形式のプログラムを作成しています。 このプログラムなのですが、1問目と2問目はうまく表示されますが、3問目から画像が切り替わらなくなってしまっています。 swingを使い、以下のような内容でJPanel pにQ80.jpgまで切り替えていこうとしていました。 p.remove(5); ImageIcon icon1 = new ImageIcon("./QUIZ/Q2.jpg"); JLabel label1 = new JLabel(icon1); p.add(label1); new ImageIconを使いすぎなのが原因かとも思っているのですが、どのように直していいものかわからないため、ご指導お願いします。

    • ベストアンサー
    • Java
  • 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); } } ソースはこのようになっています。これからどうすれば背景画像が表示されるか教えていただきたいです。 よろしくお願いします。

  • Eclipseから実行すると画像が読み込まれない

    下記のコードをEclipseから実行すると画像が読み込まれないのですが、コマンドプロンプトから実行すると画像が読み込まれます。 コードが同じなのに不思議です…。 原因はどんなことが考えられるのでしょうか? class test extends JFrame{ public static void main(String args[]){ test frame = new test("タイトル"); frame.setVisible(true); } test(String title){ setTitle(title); setBounds(100, 100, 500, 500); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JPanel p = new JPanel(); ImageIcon icon1 = new ImageIcon("img.jpg"); JLabel label1 = new JLabel(icon1); p.add(label1); Container contentPane = getContentPane(); contentPane.add(p, BorderLayout.CENTER); } }

    • ベストアンサー
    • Java
  • Jave Swing 画像表示わからない

    java swingでGUIをプログラミングしている者です。 JLabelにImageIconの画像を貼り付けるプログラムです。↓ //画像を表示するプログラム //インポート import javax.swing.*; import java.awt.*; import java.awt.event.*; class gazopro extends JFrame{ JLabel l1; JButton b1; JPanel p; public static void main(String args[]) { //ウィンドウを作成また設定 gazopro frame = new gazopro(); frame.setBounds(300,200,700,400); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true); } gazopro(){ //コンポーネントを作成 p = new JPanel(); add(p); b1 = new JButton("画像を表示"); p.add(b1); ImageIcon icon = new ImageIcon("image.jpg"); l1 = new JLabel(icon); p.add(l1); } }   わからないところは、ImageIcon icon = new ImageIcon("image.jpg");のところです。 ImageIconの引数は、プログラミングを行っているパソコン(OS は Windows)のマイコンピューター→ Cドライブ→ MyJava→ image.jpgを指定しましたがこれで合ってますか? このプログラムでは、画像が表示されませんでした。 どうすればいいでしょうか? 解説と、ご指導宜しくお願いします。

    • ベストアンサー
    • Java
  • 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(); } } }

  • 画像からヒストグラムを作りたいのですが

    画像からヒストグラムを計算し、それをグラフにしてあらわしたいと思っています。プログラムは以下のようなところまでできており、TextFieldにファイル名を入力し、EnterkeyもしくはOpenを押すと左下にその画像が表示されるところまでできています。 Startを押すと、その画像のRGBヒストグラムを計算し、赤、緑、青各色のグラフを三つ右下に表示したいのですがGraphicsの使い方や、BufferedImageの使い方がわからず四苦八苦しております。ヒストグラムをしては横区間を16としてやりたいと思っております。自分なりにはヒストグラム値を16で割り、その数値をもとにGraphicsオブジェクトに与えてそれをもとに描写するという方向で作成していましたがわたくしには難しく頓挫してしまいました。どうぞよろしくお願いいたします。 /*ここからソース*/ import javax.swing.*; import java.awt.*; import java.awt.event.*; import java.awt.image.BufferedImage; import javax.imageio.*; import java.io.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; public class Main { public static class ActionB1 implements ActionListener { JTextField input; JLabel pict1; JFrame frame2; public ActionB1(JTextField input0,JLabel pict10,JFrame A0){ input =input0; pict1=pict10; frame2 = A0; } public void actionPerformed(ActionEvent e){ if(getClass().getResource(input.getText())==null){ pict1.setText("file not found!!!"); } else { ImageIcon temp =new ImageIcon(getClass().getResource(input.getText())); pict1.setIcon(temp); } pict1.repaint(); } } public static class ActionB2 implements ActionListener{ JLabel pict2; JTextField input; JFrame frame3; public ActionB2(JTextField input0,JLabel pict20,JFrame A0){ input =input0; pict2=pict20; frame3=A0; } public void actionPerformed(ActionEvent e){ File filename = new File(input.getText()); BufferedImage Image = null; try { Image = ImageIO.read(filename); } catch (IOException e1) { // TODO 自動生成された catch ブロック e1.printStackTrace(); } //ここからわかりません } public static void main(String[] args){ JFrame frame =new JFrame("タイトル"); frame.setSize(600,400); JPanel p1 = new JPanel(); JPanel p2 = new JPanel(); JButton b1 =new JButton("OPEN"),b2=new JButton("START"); JTextField t1 = new JTextField(30); p1.add(t1); p1.add(b1); p1.add(b2); b1.setBounds(350,10,100,20); b2.setBounds(460,10,100,20); t1.setBounds(110,10,230,20); p1.setBounds(20,10,80,20); frame.getContentPane().add(b1); frame.getContentPane().add(b2); frame.getContentPane().add(t1); frame.getContentPane().add(p1); p2.setLayout(new GridLayout(1,2)); JLabel pict1= new JLabel(),pict2= new JLabel(); p2.add(pict1); p2.add(pict2); ActionB1 actB1 = new ActionB1(t1,pict1,frame); ActionB2 actB2 = new ActionB2(t1,pict2,frame); b1.addActionListener(actB1); b2.addActionListener(actB2); t1.addActionListener(actB1); frame.getContentPane().add(p1,BorderLayout.NORTH); frame.getContentPane().add(p2,BorderLayout.CENTER); frame.setVisible(true); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } }

    • ベストアンサー
    • Java
  • Java JPanelを使ったコードについての質問です

    Java JPanelを使ったコードについての質問です 4つのTextFieldに数値を入力し、エンターキーが押されたときに円グラフが表示されるプログラムについての質問です。 下記のコードなのですが、何故かエラーが出てしまいます… public class PieCharts extends JPanel implements ActionListener { private JLabel l1, l2, l3, l4; private JTextField t1, t2, t3, t4; private JButton bt; private JPanel pn1,pn2; int h, m, l, n, w, x, y, z; private DrawOvalPane dop; public static void main(String args[]) { JFrame frame = new JFrame("Applet"); frame.setContentPane(new PieCharts()); frame.addWindowListener(new WindowAdapter() { @Override public void windowClosing(WindowEvent e) { System.exit(0); } }); frame.pack(); frame.setVisible(true); } public PieCharts() { dop = new DrawOvalPane(); l1 = new JLabel("High Risk", JLabel.RIGHT); l2 = new JLabel("Medium Risk", JLabel.RIGHT); l3 = new JLabel("Low Risk", JLabel.RIGHT); l4 = new JLabel("No Risk", JLabel.RIGHT); t1 = new JTextField(); t1.addActionListener(this); t2 = new JTextField(); t2.addActionListener(this); t3 = new JTextField(); t3.addActionListener(this); t4 = new JTextField(); t4.addActionListener(this); bt = new JButton("Enter"); pn1 = new JPanel(); pn2 = new JPanel(); pn1.setLayout(new GridLayout(2,4)); pn1.add(l1); pn1.add(t1); pn1.add(l2); pn1.add(t2); pn1.add(l3); pn1.add(t3); pn1.add(l4); pn1.add(t4); pn2.add(bt); setLayout(new BorderLayout()); add("North", pn1); add("Center", dop); add("South", pn2); bt.addActionListener(new SampleActionListener()); }

  • Jlabel?の上に2つ画像を載せクリックを識別

    JLabelを使えばいいのかよくわからないのですが掲示した 画面のように背景色に薄い赤を指定して2つの矢印画像を 表示します。その矢印の中央に年月を表示したいと思っています。 また、右の矢印をクリックしたら翌月の年月が表示され 左の矢印をクリックしたら前月の年月が表示したいです。 これをswingで完成したいと思っています。 また各コンポーネントは setBounds(int x,int y,int width,int height)で出来ると助かります。 ImageIcon leftIcon = new ImageIcon("./img/left.gif"); ImageIcon rightIcon = new ImageIcon("./img/right.gif"); JLabel label = new JLabel(); label.setText("2010年10月"); label.setIcon(leftIcon); label.setLocation(20,0); label.setSize(170, 20); label.setBackground(Color.white); label.setOpaque(true); ここから先がわかりません どうしても1つの画像と1つのテキストしか表示できません。

    • ベストアンサー
    • Java
  • javaのボタン表示等に関する質問

    下記のコードはフォームをNORTH、CENTER、SOUTHEに分割して、それぞれのpaneに ラベルとボタンを表示するものです。 Q1)myFrame.setBounds(350,0, total_x, total_y)をコンストラクターの最初に記述しますと  フォームの表示が正常でなく、コンストラクターの最後では、正常に行なわれます。  この理由等について、コメント頂けますと有り難いです。 Q2)mainに記述してある、下記のコードは無くても、Xでクロースできますが,このコード  の記述は正しいでしょうか GridLayout_new frame = new GridLayout_new(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 以上お手数ですが、コメント頂けますと大変助かります。 //============================================= import java.awt.BorderLayout; import java.awt.Color; import java.awt.Dimension; import java.awt.GridLayout; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.border.LineBorder; public class GridLayout_new extends JFrame{ int panelA_x=200, panelA_y=50; int panelB_x=200, panelB_y=200; int panelC_x=200, panelC_y=50; int total_x=panelA_x; int total_y=panelA_y+panelB_y+panelC_y; public static void main(String[] args){ GridLayout_new frame = new GridLayout_new(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } GridLayout_new(){ JFrame myFrame=new JFrame(); myFrame.setTitle("panelA"); // myFrame.setBounds(350,0, total_x, total_y); //正常なformの表示が出来ない myFrame.setVisible(true); LineBorder border = new LineBorder(Color.BLACK, 1, true); //======================== JLabel button1=new JLabel("Label1"); GLabel_Layout(button1, border); JButton button2 = new JButton("button2"); button_Layout(button2, border); //======================== JLabel button3=new JLabel("Label3"); GLabel_Layout(button3, border); JButton button4 = new JButton("button4"); button_Layout(button4, border); //======================== JLabel button5=new JLabel("Label5"); GLabel_Layout(button5, border); JButton button6 = new JButton("button6"); //======================== JLabel button7=new JLabel("Label7"); GLabel_Layout(button7, border); JButton button8 = new JButton("button8"); //======================== JLabel button9=new JLabel("Label9"); GLabel_Layout(button9, border); JButton button10 = new JButton("button10"); button_Layout(button10, border); //======================== JLabel button11=new JLabel("Label11"); GLabel_Layout(button11, border); JButton button12 = new JButton("button12"); button_Layout(button12, border); //================================== JPanel p1 = new JPanel(); GridLayout layout1 = new GridLayout(2,2); //2行、2列の設定 layout1.setHgap(2); layout1.setVgap(10); p1.setLayout(layout1); p1.setBackground(Color.GREEN); p1.add(button1); p1.add(button2); p1.add(button3); p1.add(button4); myFrame.setSize(panelA_x, panelA_y); myFrame.getContentPane().add(p1, BorderLayout.NORTH); //============================== JPanel p2 = new JPanel(); GridLayout layout2 = new GridLayout(2,2); //2行、2列の設定 layout2.setHgap(2); layout2.setVgap(10); p2.setLayout(layout2); p2.setBackground(Color.GREEN); p2.add(button5); p2.add(button6); p2.add(button7); p2.add(button8); myFrame.setSize(panelB_x, panelB_y); myFrame.getContentPane().add(p2, BorderLayout.CENTER); //================================== JPanel p3 = new JPanel(); GridLayout layout3 = new GridLayout(2,2); //2行、2列の設定 layout3.setHgap(2); layout3.setVgap(10); p3.setLayout(layout3); p3.setBackground(Color.GREEN); p3.add(button9); p3.add(button10); p3.add(button11); p3.add(button12); myFrame.setSize(panelC_x, panelC_y); myFrame.getContentPane().add(p3, BorderLayout.SOUTH); myFrame.setBounds(350,0, total_x, total_y); //正常なformの表示 } //constructor void GLabel_Layout(JLabel label, LineBorder border){ label.setPreferredSize(new Dimension(80,20)); label.setBorder(border); label.setBackground(Color.lightGray); label.setOpaque(true); } void button_Layout(JButton button, LineBorder border){ button.setPreferredSize(new Dimension(80,20)); button.setBorder(border); } } //main class....GridLayout_new

    • ベストアンサー
    • Java
  • 配列に対してsetText()は使えないんでしょうか?

    こんにちは、いつもお世話になっております。 3つのラベルの配列に文字列を表示したいのですが 下記のコードをコンパイルし実行すると、 Exception in thread "main" java.lang.NullPointerException at txtest.main(txtest.java:16) というエラーが出てしまいます。(コンパイルはできる。) 「setText()」を「=new JLabel(right1)」という風に書き変えると 正しく、表示されるのですが、この方法は使いたくないのです。 何かよい方法ご存知でしたら、是非教えていただけますか? どうかよろしくお願いいたします。 import java.awt.*; import javax.swing.*; class txtest { public static void main(String[] args) { JFrame f=new JFrame(); JPanel p=new JPanel(); JLabel label[]=new JLabel[3]; label[0].setText("right1"); label[1].setText("right2"); label[2].setText("right3"); for(int i=0;i<=2;i++) { p.add(l[i]); } Container ct=f.getContentPane(); ct.add(p); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); f.pack(); f.setVisible(true); } }

    • ベストアンサー
    • Java