2016-10-08 4 views
0

Ich möchte einen Kreis neu zu zeichnen, wenn eine Taste gedrückt wird.einen Kreis Repaint

Derzeit habe ich es, wenn ich eine Taste drücken, druckt er auf die Konsole, welche Taste ich gedrückt. Zum Beispiel, wenn ich den "Paint Red" Knopf drücke, möchte ich, dass der Kreis mit Rot gefüllt wird und das gleiche mit den anderen Farben. Ich versuche, meinen Kopf um den ganzen Farb/PaintComponent-Unterschied zu wickeln.

Das ist, was ich bisher haben ...

public class testCircle extends JPanel { 

public void paint(Graphics g) 
{ 
    setSize(500,500); 

    int R = (int) (Math.random()*256); 
    int G = (int)(Math.random()*256); 
    int B= (int)(Math.random()*256); 
    Color randomColor = new Color(R, G, B); 
    g.setColor(randomColor); 
    g.drawOval(75, 100, 200,200); 
    g.fillOval(75, 100, 200, 200); 
} 

public static void main(String[] args) 
{ 

    JFrame frame = new JFrame(); 
    frame.setSize(400, 400); 
    testCircle circlePanel = new testCircle(); 
    frame.add(circlePanel); 



    JButton redButton = new JButton("Paint Red"); 
    redButton.addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent event) 
     { 
      System.out.println("Red Button Pressed!"); 
     } 
    }); 
    JButton blueButton = new JButton("Paint Blue"); 
    blueButton.addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent event) 
     { 
      System.out.println("Blue Button Pressed!"); 
     } 
    }); 

    JButton greenButton = new JButton("Paint Green"); 
    greenButton.addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent event) 
     { 
      System.out.println("Green Button Pressed!"); 
     } 
    }); 

    redButton.setPreferredSize(new Dimension(100,100)); 
    blueButton.setPreferredSize(new Dimension(100,100)); 
    greenButton.setPreferredSize(new Dimension(100,100)); 

    frame.setLayout(new FlowLayout()); 
    frame.add(redButton); 
    frame.add(blueButton); 
    frame.add(greenButton); 
    frame.setVisible(true); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

} 

}

Antwort

0

Sie lösen nicht ein in Ihrem Code an beliebiger Stelle "neu streichen". Das sollte funktionieren:

redButton.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent event) { 
       System.out.println("Red Button Pressed!"); 
       frame.invalidate(); 
       frame.validate(); 
      } 
     }); 
+1

Sie sollten nicht zu 'validate haben()' die gesamte 'Container'; es sollte möglich sein, '()' nur das Panel neu streichen, wie skizziert [hier] (http://stackoverflow.com/a/39941735/230513). – trashgod

3

diese Änderungen an Ihrem Code vor:

  • Wie diskutiert here, Swing-Programme außer Kraft setzen sollte paintComponent() statt paint() vorran.

  • Geben Sie Ihren Panel ein Attribut für currentColor.

    private Color currentColor; 
    
  • jede Taste Lasst uns ActionListener gesetzt currentColor und repaint() aufzurufen.

    currentColor = color; 
    repaint(); 
    
  • Verwenden Action für Ihr Programm der Funktionalität verkapseln.

Ein vollständiges Beispiel wird here untersucht.

image