为什么getGraphics在ActionPerformed方法中有效?

时间:2016-05-12 04:51:03

标签: java constructor jpanel jbutton actionlistener

为什么可以在接口ActionListener的ActionPerformed方法中调用getGraphics(),但不能在构造函数或其他方法调用的方法中调用。这是我制作的代码。为什么在“empezar”和构造函数中忽略方法“dibujar”的调用但不在ActionListener方法内部?

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;
}

我已经读过每次都会调用repaint()方法进行重新绘制,这意味着dibujar()不会被忽略但是repaint()已经删除了它的工作,但是为什么它在内部调用时不会发生动作事件?做某种循环或抑制repaint()调用是隐含的某种暗示吗?

1 个答案:

答案 0 :(得分:0)

我认为这是因为第一种情况new VentanaGrafica().setVisible(true);dibujar()之后被调用,这意味着一旦您使框架可见,panel将被重新绘制,并且dibujar()将被删除,在第二种情况下,panel在您致电dibujar()后不会重新粉刷。

如果你想做一些自定义绘画,你必须覆盖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();