2016-05-12 9 views
0

Interface ActionListenerのActionPerformedメソッド内で呼び出されたときにgetGraphics()で描画することはできますが、コンストラクタなどのメソッドから呼び出されたメソッドでは描画できないのはなぜですか?ここに私が作ったコードがあります。なぜメソッド "dibujar"の呼び出しが "empezar"とコンストラクタの中で無視されますが、ActionListenerメソッドの中では無視されるのですか?getGraphicsがActionPerformedメソッド内で動作するのはなぜですか?

import javax.swing.*; 
import java.awt.Dimension; 
import java.awt.Color; 
import java.awt.Graphics; 
import java.awt.event.ActionListener; 
import java.awt.event.ActionEvent; 

public class VentanaGrafica extends JFrame{ 


public static void main(String[] args){ 
SwingUtilities.invokeLater(new Runnable(){ 
@Override 
    public void run(){ 
     new VentanaGrafica().setVisible(true); 
    } 
}); 
} 


public VentanaGrafica(){  
    empezar(); 
    dibujar(); 
} 



private void empezar(){ 
setTitle("Graficar con Jpanel"); 
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
setMinimumSize(new Dimension(600,600)); 
setResizable(false); 
panel = new JPanel(); 
panel.setBackground(Color.blue); 
panel.setSize(new Dimension(400,400)); 
boton = new JButton("Este boton"); 
boton.setFocusable(false); 
panel.add(boton); 
add(panel); 
boton.addActionListener(new ActionListener(){ 
    @Override 
    public void actionPerformed(ActionEvent e){ 
     dibujar(); 
    } 
}); 
pack(); 
dibujar(); 

} 

private void dibujar(){ 
gc = panel.getGraphics(); 
gc.setColor(Color.red); 
gc.fillRect(200,0,120,80); 
} 
JPanel panel; 
Graphics gc; 
JButton boton; 
} 

私は再描画()メソッドを再描画するために、すべてのいつかと呼ばれていることを読んでいると、それは、dibujar()がその作業を消去している()無視されますが、再描画されないことを意味しますが、それが起こるdoesntのなぜ呼び出しが内部で行われたときActionEvent?何らかのループを実行するか、またはrepaint()呼び出しを禁止することが何らかの暗黙的なものですか?

答えて

0

私は、これが原因でnew VentanaGrafica().setVisible(true);は、あなたは、フレームを見えるように一度panelが再描画されるとdibujar()の効果が消去され、後者の場合にされることを意味しdibujar()後に呼び出される最初のケースで発生していることを考えますdibujar()に電話をした後にpanelは再描画されません。

カスタムペイントを行う場合は、paintComponentメソッドをオーバーライドし、ロジックを追加してコンポーネントの状態を一貫させる必要があります。ここで

は一例です:

public class CustomPanel extends JPanel{ 
    Color color = Color.WHITE; 
    protected void paintComponent(Graphics g){ 
     super.paintComponent(g); 
     g.setColor(color); 
     g.fillRect(200,0,120,80); 
    } 
    public void changeColor(Color color){ 
     this.color = color; 
    } 
} 

そして、ここでは、あなたがこのパネルを使用する方法である。

CustomPanel panel = new CustomPanel(); 
panel.changeColor(Color.RED); 
panel.repaint(); 
関連する問題