2016-05-12 11 views
0

Warum ist es möglich, mit getGraphics() zu zeichnen, wenn in der Methode ActionPerformed von Interface ActionListener aufgerufen wird, aber nicht innerhalb einer Methode, die vom Konstruktor oder einer anderen Methode aufgerufen wird. Hier ist der Code, den ich gemacht habe. Warum werden die Aufrufe der Methode "dibujar" in "empezar" und Konstruktor ignoriert, aber nicht in der ActionListener-Methode?Warum funktioniert getGraphics in einer ActionPerformed-Methode?

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

Ich habe gelesen, dass die repaint() -Methode jedes irgendwann neu streichen genannt wird und es bedeutet, dass dibujar() nicht ignoriert, sondern neu streichen() haben ihre Arbeit gelöscht, aber warum es passieren tut, wenn der Anruf innerhalb der gemacht Aktionsereignis? es ist irgendwas implizit, eine Art Schleife zu machen oder den repaint() Aufruf zu verhindern?

Antwort

0

Ich denke, dass dies, weil im ersten Fall verursacht wird new VentanaGrafica().setVisible(true); nach dibujar() genannt wird, was bedeutet, dass, sobald Sie machen den Rahmen sichtbar die panel neu gestrichen werden und die Auswirkungen der dibujar() wird der zweite Fall werden, gelöscht und in der panel wird nicht neu lackiert, nachdem Sie dibujar() anrufen.

Wenn Sie eine benutzerdefinierte Bemalung durchführen möchten, müssen Sie die paintComponent-Methode überschreiben und eine Logik hinzufügen, um den Zustand der Komponente konsistent zu machen. Hier

ein Beispiel:

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

Und hier ist, wie Sie dieses Panel verwenden:

CustomPanel panel = new CustomPanel(); 
panel.changeColor(Color.RED); 
panel.repaint();