2016-08-26 1 views
-2

Ich habe eine einfache Frage, aber aus irgendeinem Grund stecke ich fest und kann es nicht herausfinden. Ich habe einen einfachen Code mit 3 Schaltflächen in einem JPanel jede der Schaltflächen sollte auf der JPanel mit der überschriebenen PaintComponent zeichnen und es tut, aber was ich tun möchte, ist die Formen bleiben. (nachdem ich es in zufällige Positionen ändern werde) jede Hilfe wäre dankbar, danke!3 Tasten zum Zeichnen von 3 verschiedenen Objekten in einem jPanel

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.FlowLayout; 
import java.awt.Graphics; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.util.Random; 

import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 

public class Ex3 extends JFrame implements ActionListener 
{ 
    JButton circle, triang, square; 
    JPanel jp, jButton; 
    boolean drawSq, drawCir, drawTr; 
    public static void main(String[] args) 
    { 
     JFrame frame = new Ex3(); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setVisible(true); 
    } 

    public Ex3() 
    { 
     super("Ex3"); 
     setSize(400, 500); 

     circle = new JButton("Circle"); 
     triang = new JButton("Triangle"); 
     square = new JButton("Square"); 
     drawCir = false; 
     drawSq = false; 
     drawTr = false; 
     //setLayout(new FlowLayout(FlowLayout.CENTER, 20, 30)); 

     jButton = new JPanel(); 
     jp = new CustomPanel(); 

     circle.addActionListener(this); 
     triang.addActionListener(this); 
     square.addActionListener(this); 

     jButton.add(circle); 
     jButton.add(triang); 
     jButton.add(square); 
     jButton.add(new JLabel("Kayy")); 

     jp.setBackground(Color.gray); 
     add(jp, BorderLayout.CENTER); 
     add(jButton, BorderLayout.NORTH); 
    } 

    @Override 
    public void actionPerformed(ActionEvent e) 
    { 
     if(e.getSource() == circle) 
     { 
      drawCir = true; 
      System.out.println("created cricle"); 

     } 
     if(e.getSource() == triang) 
     { 
      drawTr = true; 
      System.out.println("created triangle"); 
     } 
     if(e.getSource() == square) 
     { 
      drawSq = true; 
      System.out.println("created square"); 
     } 
     repaint(); 
    } 

    class CustomPanel extends JPanel 
    { 

     @Override 
     public void paintComponent(Graphics g) 
     { 
      super.paintComponent(g); 
      if(drawSq) 
      { 
       g.setColor(Color.blue); 
       g.drawRect(((int)Math.random()* 20), 50, 200, 150); 
       drawSq = false; 
      } 
      else if(drawTr) 
      { 
       g.setColor(Color.green); 
      } 
      else if(drawCir) 
      { 
       g.setColor(Color.red); 
       g.drawOval(182, 124, 200, 200); 
      } 
      else 
      { 
      } 
      //drawSq = false; 
      drawTr = false; 
      drawCir = false; 
     } 

    } 
} 
+0

Sie zeichnen nicht einmal drei Formen - also was wollen Sie ?? – gpasch

+0

Ich möchte keine Shapes verwenden, nur so dass drawRect oder drawOval beibehalten werden, wenn eine andere Taste gedrückt wird. –

Antwort

1

Was ich tun möchte, ist die Formen

bleiben machen müssen Sie

Dann werden die Formen der Komponente jedes Mal neu zu streichen neu gestrichen wird.

Es gibt zwei Ansätze, dies zu tun:

  1. Farbe auf einen BufferedImage
  2. eine Liste des Objekts halten zu malen und durch die Liste durchlaufen zu jedem
  3. zu malen objekt

prüfen Custom Painting Approaches für Arbeitsbeispiele für jeden Ansatz. Welchen Ansatz Sie verwenden, hängt von Ihren genauen Anforderungen ab.

Auch sollten Sie nie den Zustand Ihrer Komponente in der Malmethode ändern. Sie können nicht steuern, wann die paintComponent() -Methode aufgerufen wird. Manchmal wird das System eine Komponente neu streichen. Das Vorhandensein Ihrer booleschen Variablen weist also auf ein Designproblem hin.

Verwandte Themen