为什么可以在接口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()调用是隐含的某种暗示吗?
答案 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();