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

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

0

画面のちらつきについて

Timerクラス(Timer以外でもいいのですが)を使って刻々と変化するプログラムを作りたいのですが画面がちらついて困っています。
ダブルバッファリングはしているので、timerのactionListenerの中でrepaint()を呼び出してるのが問題だとは思うのですが、その解決方法がわからず困っています。どのように実装すればいいのでしょうか?
描画の内容はありませんが、とりあえずこんな感じのソースです。よろしくお願いします。

public class Test extends JFrame{
    
    Container cont = getContentPane();
    
    JMenuBar menu_bar = new JMenuBar();
    
    Image off_image = null;
    Graphics off_g = null;

    
    Timer timer;
    
    
    public static void main(String args[]){
        
        Test window = new Test();
        
        window.setSize(1024,768);
        
        window.addWindowListener(
            new WindowAdapter(){
                public void windowClosing(WindowEvent e){
                    System.exit(0);
                }
            }
        );

        window.setVisible(true);
    }
    
    public Test(){
        
        super("てすと");

        setResizable(false);
        
        setVisible(false);
        
        setBackground(Color.gray.brighter());
        
        setLocation(300,100);
        
        //メニュー設定
        
        JMenu menu1 = new JMenu("設定");
        
        JMenuItem menu1_item1 = new JMenuItem("設定1");
        menu1_item1.addActionListener(
                new ActionListener(){
                    public void actionPerformed(ActionEvent e){
                        
                    }
                }
        );
        
        menu1.add(menu1_item1);
        menu_bar.add(menu1);
    
        cont.add(menu_bar,"North");

        timer = new Timer(1,
            new ActionListener(){
                public void actionPerformed(ActionEvent e){
                    repaint();
                }
            }
        );
        
        timer.start();
        
    }
    

    
    public void update(Graphics g){
        paint(g);
    }
    
    public void paint(Graphics g){
        
        super.paint(g);
    
        int width =  getSize().width - getInsets().left - getInsets().right ;
        int height = getSize().height -  getInsets().top - getInsets().bottom - menu_bar.getHeight();
        
        if(off_image==null){
            
            off_image = createImage(getSize().width,getSize().height);
            off_g = off_image.getGraphics();
            
        }                    
        g.setClip(getInsets().left, getInsets().top + menu_bar.getHeight(),
            width ,
            height);

        g.drawImage(off_image,0,0,this);
    }
    

}


ちなみにmac上で実行してみたらなぜかちらつかないんですね・・・

2

回答

2678

閲覧

2件の回答

評価

0

JFrameではなくJPanelでやるとちらつきが無くなりました。

評価

0

ぬるぽ・・・じゃなくってマルポ
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=40606&forum=12

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