Javaに関する様々な情報をご紹介します。

Javaに関する様々な情報をご紹介します。
評価

0

ボタンを押した時にjFileChooserからパスを拾い、画像を表示させたいのですが。

ボタンを押した時、jFileChooserからパスを拾い、画像を表示させる時についての質問です。

その場合の表示は、別フレームではなく、同フレーム内のどこか(jPanelなりjFrameの指定した場所なり)に表示させたいと思っています。

聞きたい事が二点ほど。
一つは
・その画像を表示させるコードが判らない。
コードをいろいろと"java 画像 表示"等で探していたのですが
大体はpublic void paint(Graphics g)の様なクラスの中に記述するパターンでした。
それをボタンでのアクションを拾い(下記コードの場合はevt)
ボタンが押されたときにChooserを開き、そこから選択し、抜き出したパスを使用して描写する方法がわからないので
それを知りたいです。


もう一つは
・それをどこに描写すればよいか、Panel等に描写するべきなのか
その描写できる場所をどうすれば良いのかが判りません。

この二点が判らないのです。
申し訳ありませんが、回答の程宜しくお願いします。


現在のコードが以下になります。
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
String fPath;
Image img = null;
if(evt.getActionCommand().equals("参照")){ // 参照ボタンが押された時
int returnVal = chooser.showOpenDialog(this); // JFileChooserの可視化
// 戻り値=JFileChooserが閉じられたのが、
// 開くボタンによるのかキャンセルボタンによるのかを識別する
try {
if (returnVal == JFileChooser.APPROVE_OPTION) { // OKボタンでJFileChooserが閉じられた場合
File file = chooser.getSelectedFile(); // 選択されたファイルのパスを取得
fPath = file.getAbsolutePath();
FileReader fr
= new FileReader(file);
jTextField2.setText(fPath); // パスの表示

Toolkit toolkit = Toolkit.getDefaultToolkit();
//Imageオブジェクト生成
img = toolkit.getImage(fPath);

setVisible( true ); //Imageオブジェクト表示


fr.close();
}
} catch(Exception ex){}
}




です。 宜しくお願いいたします。

補足
    開発環境を添えておきます。
    JDK:JDK6 ud13
    IDE:Netbeans6.5.1
    です。 宜しくお願い致します。 

説明がなかなかうまく出来ないですが、精一杯説明のほうさせて頂きますので、何かアドバイスをお願いします。
Yahooで質問してみたのですが、回答が付きませんでした。
やはり質問の仕方が悪いのでしょうか・・?

14

回答

9527

閲覧

14件の回答

評価

0

http://www.javaroad.jp/bbs/answer.jsp?q_id=20090203165807228
Toolkitは、非同期の処理が多いらしい。
処理が終わるまで待機すれば取れるんだろうけどね。

イメージは、こんな感じで取れるでしょ。

ByteArrayInputStream bis = がんばってインスタンスを作ってください。
Image image = ImageIO.read(bis);

>・その画像を表示させるコードが判らない。
>コードをいろいろと"java 画像 表示"等で探していたのですが
>大体はpublic void paint(Graphics g)の様なクラスの中に記述するパターンでした。

GUIの使い方はハードルが高いからねえ。

1.基本的な方法は同じ。ただし、オーバーライドするのはpaintComponent(Graphics g)にする。
これが使えない古いバージョンなら仕方ないが。
「paintComponent」で検索をかけるといいよ。

2.イメージ格納用変数は、クラス変数にしておく。
3.そして、paintComponent(Graphics g)の中で、
イメージをgに描画する。

プログラムの動作は、
1.イメージを取得したら、それをクラス変数に格納する。
2.画像を表示するComponentの、repaint()を呼ぶ。

こんなところか。

>・それをどこに描写すればよいか、Panel等に描写するべきなのか

これはスレ主さんが決めること。
最初は教科書通りでいいでしょ。

評価

0

不良社員殿
>Toolkitは、非同期の処理が多いらしい。
>処理が終わるまで待機すれば取れるんだろうけどね。
ふむ・・。処理が終わるまで・・ですか。

>ByteArrayInputStream bis = がんばってインスタンスを作ってください。
>Image image = ImageIO.read(bis);
あ〜なるほど ByteArrayInputStreamですか・・・


>GUIの使い方はハードルが高いからねえ。
ハードルが高い方が燃えます笑


>プログラムの動作は、
>1.イメージを取得したら、それをクラス変数に格納する。
>2.画像を表示するComponentの、repaint()を呼ぶ。
repaintか・・・。 ちょこちょこ細かいことを間違えてたっぽいです。


>これはスレ主さんが決めること。
>最初は教科書通りでいいでしょ。
教科書もあればいいんですが・・・笑
行き当たりばったりで、少しずつやっていくのも楽しいです。
それもまた、自分で成長していけるところかな?と思うので。
有難うございます。 早速ちょっと試してきます!

評価

0

先週ぶりです
金曜日につかみかけてたものが何処かへ吹っ飛んでしまいました(。_。
そして試行錯誤中です。
実行結果が見れる訳でもなく只管エラーエラーエラー。
実行すらさせてくれないNetbeans様なのですが。
結局あの後にjButtonのActionの場所でやらなくても
別にボタンを押したらそっちのクラスを呼び出して・・・っていう方法があるのではないか!
と考えていろいろやっていたらこんな悲惨なことに・・・OTL


private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
        String fPath;
        Image file;
        Image img = null;
        if(evt.getActionCommand().equals("参照")){
        int returnVal = chooser.showOpenDialog(this);
        if(img == null) return;
        try {
            file = new FileInputStream(img);
            BufferedInputStream bis = new BufferedInputStream(ins);
            byte[] b = new byte[36];
            bis.read(b);
            
            width = b[32] + b[33] * 256;
            height = b[34] + b[35] * 256;
            if(height < 0) height += 256;
            if(width < 0) width += 256;
            colorMode = b[28];
            
            if(b[29] == 0x09){
                drawMode = RECT;
            }
            else if(b[29] == 0x07){
                drawMode = SQUARE_1B;
            }
            else{
                drawMode = SQUARE_2B;
            }
            StringBuilder s = new StringBuilder();
            s.append("Width=" + width);
            s.append(" Height=" + height);
            s.append(" ");
            s.append(colMode[colorMode]);
            s.append(" ");
            s.append(drwMode[drawMode]);
            label.setText(s.toString());
            createImage(bis);
        } catch (FileNotFoundException ex) {
            ex.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        }
    




    }                                        
private class imageFileOpenListener implements ActionListener
{
       
       public void actionPerformed(ActionEvent evt)
       {
       Image img;
        byte[] g = null;
        String fPath;
        if (returnVal == JFileChooser.APPROVE_OPTION) { // OKボタンでJFileChooserが閉じられた場合
            img = chooser.getSelectedFiles();
         chooser = new JFileChooser();
         
          chooser.setCurrentDirectory(new File("."));
          //jpg, jpeg, gif を表示するようにする

          int result= chooser.showOpenDialog(KojinKarte.this);
          // if image file accepted, set it as icon of the label
          
           ByteArrayInputStream bis = new ByteArrayInputStream(g);
            Image image = ImageIO.read(bis);
            
            repaint();
          }
       }
    }

評価

0

コーディングにおいてやるべき事は、
まず、とにかく動くものをつくる。
そして、それを拡張していくことです。

最初からやり直すか、
コメントで最小限必要な部分を隠して、
少しずつ復元していくか、
どちらか好きな方を選んでください。

評価

0

もうひとつ。
一度に考えることは、ひとつだけにしましょう。

評価

0

お早う御座います。
また修正していきたいと思います。

>一度に考えることは、ひとつだけにしましょう。

これは同じことを一度に考えるな という意味ですかな??

評価

0

違うわよ。
一度にいろいろ解決しようとしすぎなの。
夏休みで言えば
山と海と宿題とを一気にやろうとしているようなもの。
不可能じゃないけど混乱するわよ。

やらなくてはいけないことを箇条書きに並べて
1つずつ解決しないさいってことよ。

評価

0

てんこ様
成る程・・。
了解です。 有難う御座います。

評価

0

private InputStream ins;
    byte[] g = new byte[36];
    Image image;//上のあたりに宣言
------------以下主要(?)コード    
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
        String fPath;
        Image img = null;
        if(evt.getActionCommand().equals("参照")){
        int returnVal = chooser.showOpenDialog(this);
         
        if(returnVal == JFileChooser.APPROVE_OPTION){
        try {
              File file = chooser.getSelectedFile(); // 選択されたファイルのパスを取得
              fPath = file.getAbsolutePath();
              FileReader fr = new FileReader(file);
              jTextField2.setText(fPath); // パスの表示
              ByteArrayInputStream bis = new ByteArrayInputStream(g);
              image = ImageIO.read(bis);
              repaint();

        } catch (IOException e) {
            e.printStackTrace();
        }
          }
        }
    }                                        

    public void paintComponent(Graphics g) {
        
        g.drawImage(image , 200, 200 , 200 , 200 , this);
        repaint();
    }



今ここです。
う〜ん。imageまで読み込んでくれてるのかなぁ。
って言っても実行しても描写されないし・・。
むう。 なかなか敵は手強いです。

評価

0

repaint()が、本当に画像を表示する
Componentのメソッドなのかどうかが気になるんだが。

その前に質問だ。
表示したいファイルのパスを、ダイアログで取得するのは、いったん棚に上げよう。
パスをプログラム中に直接記述して、
起動直後に、画像を表示することはできるのかな?

評価

0

あと、paintComponet()の中で、repaint()なんかすんなよ。
どこで拾ってきたんだ?

やるんなら、メソッドの冒頭で
super.paintComponent()だ。

評価

0

>パスをプログラム中に直接記述して、
>起動直後に、画像を表示することはできるのかな?
うーむ・・出来ないと思います。
解決策をまた探さなければ。


>あと、paintComponet()の中で、repaint()なんかすんなよ。
おっと・・ 失礼しました。

>やるんなら、メソッドの冒頭で
>super.paintComponent()だ。
それも配置してみたのですが、NetbeansからJFrameクラスにシンボルが見当たらないといわれる始末。

先ほどのrepaintは再描画ですよね?
マウスイベントをくっつけてみても駄目ですかね?(。_。;


何はともあれもう一度見直してきます。。

評価

0

>うーむ・・出来ないと思います。
>解決策をまた探さなければ。

じゃあ、まずはそこからだ。
イメージファイルを表示するためのGUIプログラムを作るんだ。
サンプルくらい、探せば引っかかるでしょ。

他のことは全部忘れなさい。
ひとつずつ、というのはそういうこと。

>JFrameクラスにシンボルが見当たらないといわれる始末。

もしかして、変数のスコープも把握してないのか?
そりゃダメだろ。

オブジェクトって、インスタンスって何か理解してる?
GUIのパーツは、それぞれ独立したコンポーネントの集合体だって、理解してる?
イベントは、どのコンポーネントが所有していて、
どのコンポーネントにどんな操作するのか、把握してるか?

>マウスイベントをくっつけてみても駄目ですかね?(。_。;

現状がどうで、この操作で何を狙ってるのか、説明してくれないか。

>何はともあれもう一度見直してきます。。

性根を据えて、イチから勉強したら?
行き当たりばったりでどうにかなるようなことなんて、
たいていは、最初からどうでもいいことだよ。

評価

0

不良社員殿・てんこ様

private void initFrame1(File file, BufferedImage img) {
       
       ImageIcon icon = new ImageIcon(img);
       JLabel label = new JLabel(icon);
       jLabel44.setIcon(icon);  //jLabel44にアイコンを組み込む
       this.getContentPane().add(label);
    }


private void jButton3ActionPerformed(java.awt.event.ActionEvent evt) {                                         
        if(evt.getActionCommand().equals("参照")){
        int returnVal = chooser.showOpenDialog(this);


        if(returnVal == JFileChooser.APPROVE_OPTION){
        try {

            File file = chooser.getSelectedFile(); // 選択されたファイルのパスを取得
            BufferedImage img = ImageIO.read(file);
            fPath = file.getAbsolutePath();
            FileReader fr = new FileReader(file);
            jTextField3.setText(fPath); // パスの表示
            initFrame3(file, img);


        } catch (IOException e) {
            e.printStackTrace();
        }
          }
        }
    }


public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                KojinKarte kjnkrt = new KojinKarte();
                kjnkrt.displayData();
                kjnkrt.setVisible(true);
                
       
        }
        });
    }

試行錯誤を繰り返して上記のコードに辿り着きました
表示も一応正常です。
ご回答、ご指導有難うございました。
また現れるやもしれませんがお手柔らかにお願いします(^-^;w

質問から6ヶ月以上経過しているので、回答を書き込むことはできません。