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

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

0

画像処理

こんにちわ。
ボタンをクリックして画像を変えていくプログラムを作ろうと思っています。
画像を変える事には成功したのですが、ずっと更新していて、ちかちかしてしまいます。
ソースをのせますので原因の分かる方は是非、教えてください。
import java.awt.*;
import java.awt.geom.*;
import java.awt.event.*;
import javax.swing.*;
import java.awt.image.BufferedImage;
import java.io.File;
import javax.imageio.ImageIO;
import java.io.IOException;

public class sample extends JFrame {

    int a =0;
    
    
public static void main(String s[]){
        sample test =new sample();

        test.addWindowListener(new WindowAdapter(){
        public void windowClosing(WindowEvent e){System.exit(0);}
        });
        test.setBounds(0,0,400,400);
        
        test.setVisible(true);


        }


public  void paint(Graphics g){
    Graphics2D g2 =(Graphics2D)g;
    JButton button =new JButton("btn");
    BufferedImage readImage =null;
    BufferedImage readImage2 =null;
    
    
     
    JPanel p= new JPanel();
    p.add(button);
getContentPane().add(p,BorderLayout.SOUTH);
try{
    readImage  =ImageIO.read(new File("sample1.png"));
    readImage2 =ImageIO.read(new File("sample2.png"));
        

    }catch(Exception e){
        e.printStackTrace();
        readImage =null;
    }
    
if(readImage !=null){
    SwingUtilities.updateComponentTreeUI(this);
    if(a==1){
    
    g2.drawImage(readImage,0,0,this);
    }
     else if(a==2){

    g2.drawImage(readImage2,0,0,this);
    }
}

button.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent ae){
    a++;}
});


    }
}
    
    

10

回答

83626

閲覧

10件の回答

評価

0

そりゃ、paint()の中でComponentのセットアップをしてりゃねえ。
コンストラクタを使いましょう。

評価

0

回答ありがとうございます。
例えばどんなコンストラクタを書けば良いでしょうか?

評価

0

コンストラクタって何か、理解してらっしゃいます?

評価

0

クラス名と同じ名前を持つメソッドってくらいの知識しかありませんが・・・

評価

0

同じ名前を持つだけじゃないですよ。

つhttp://www.nextindex.net/java/constructor.html

評価

0

ありがとうございます。
しかし、どんな感じで書けば良いんでしょうか?

評価

0

まずは、コンストラクタがなんなのか、
何故必要なのか、有益なのかを勉強しましょう。

評価

0

>どんな感じで書けば
以下不良社員様の言葉を引用して回答します。

>、paint()の中でComponentのセットアップをしてりゃねえ。
paintのなかでComponentのセットアップをしているのが問題なんですよ。
>コンストラクタを使いましょう。
コンストラクタでComponentのセットアップをしてみたら?

評価

0

こういう場合は、JPanelにJLabelを設置するといいです。JLabelは、大きい画像も表示できます。そして大きい画像の場合の読込処理は、別スレッドがいいです。

JLabel label = new JLabel();
BufferedImage readImage =
   ImageIO.read(new File("sample1.png"));
//readImage.createGraphics().drawRect(0,0,100,100);
label.setIcon(new ImageIcon(readImage));
readImage = null;

評価

0

書き忘れました。JPanelを次々にaddするとチラついたり、メニューアイテムに干渉しますので、イベントからlabel.setIcon(...)で画像を切り替えるといいですよ。label.setPreferredSize(...)は、JPanelのレイアウトによりますが必要です。paint()はいりません。

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