画像が表示されません。
画像の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ファイルと同じディレクトリに置いています。
どなたかよろしくお願いします。
お礼
なるほど! 確かにその方法でできました。 ありがとうございました。