1

printComponentメソッドで出力されるはずのメッセージは出力されません。ペイントメソッドが呼び出されていない印象があります。そうでない場合は、なぜですか?

import java.util.*;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.*;
import javax.swing.*;
import javax.imageio.*;

public class Main extends JFrame{
    CustomComponent cc;

    public static void main(String[] args) {
        Main m = new Main();
    }

    public Main(){
        setTitle( "Diverse Testari 7");
        setLayout(null);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setSize(600, 400);

        cc = new CustomComponent();
        cc.setImage("rgbcmy.jpg");

        add(cc);
        pack();
        setVisible( true );
    }
}

class CustomComponent extends JPanel{
    BufferedImage img = null;
    public void setImage( String str ){
    try {
        img = ImageIO.read( new File( str ) );
        System.out.println("SUCCESS!");

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

    @Override
    protected void paintComponent(Graphics g) {
        // TODO Auto-generated method stub
        System.out.println("altceva");
        super.paintComponent(g);
        System.out.println("ceva");
    }
}
4

1 に答える 1

2

Mainコンストラクターに次のコードを追加します。

new Thread(new Runnable() {
    public void run() {
        repaint();
        try {
            Thread.sleep(20);
        } catch (InterruptedException e) {}
    }
}).start();

paintComponentあなたがいるときにのみ呼び出されますrepaint();

また、決して使用しないsetLayout(null);でください。ここを参照してください。

このコードは継続的にパネルを再描画するため、継続的にを呼び出しますpaintComponent。パネルは常に最新の状態に保たれるので、これは良いことです。repaint();パネルの内容を変更するときに電話をかけることもできます。

于 2013-01-05T17:00:05.503 に答える