画像の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ファイルと同じディレクトリに置いています。 どなたかよろしくお願いします。
↧