mehrere Rectangles per JButton

plammy

Bekanntes Mitglied
Hallo 🙂

Ich habe ein Programm, was verschiedene Rechtecke zeichnen soll.. Man muss immer die Breite und Höhe in den dafür bestimmten Textfeldern eingeben. Alles klappt bis auf eine Sache noch.. Es muss per JButton ein Rechteckt erstellt werden, den man auch verschieben kann.. Das Schieben und das Erstellen des Rechtecks klappt, aber es wird immer nur 1 Rechteck erstellt. Ich möchte aber dass jedes mal wenn ich auf dem JButton klicke ein weiteres Rechteck erstellt wird. Ich habe m Netz gegooglt :rtfm: aber ich bin nicht sehr schlau geworden.. Hier schon mal das was ich bisher hab..

Java:
public class CreateFile extends JPanel implements ActionListener
{
     
     static CreateFile cf = new CreateFile();
   
     static EditPanel editPanel;

     JTextField bausteinWidth;
     JTextField bausteinHeight;


    public CreateFile()
    {
        initComponents();     
     }

   public void initComponents() 
  {
       editPanel = new EditPanel();
        ......

        bausteinWidth = new JTextField();
        bausteinHeight = new JTextField();

        buttonIndividualForms = new JButton();
        buttonIndividualForms.addActionListener(this);

  }
  
 @Override
/* Hier muss beim Drücken des Button jedes Mal ein neues Rechteckt erzeugt werden */
    public void actionPerformed(ActionEvent object) 
    {
    if (object.getSource() == buttonIndividualForms)
        {   
           drawRectangle = true;
           cf.bausteinW = Integer.parseInt(bausteinWidth.getText());
           cf.bausteinH = Integer.parseInt(bausteinHeight.getText());  
          
           repaint();
            
        } 

......
}


Java:
public class EditPanel extends JPanel
{

static Rectangle bausteinRect;

    public  EditPanel()
    {
      /* ********************* Mouse Listener ***************************  */
        addMouseListener(new MouseAdapter() 
        {
            public void mousePressed(MouseEvent e) 
            {  
                x1 = e.getX();
                y1 = e.getY();     
            }
            
            public void mouseReleased(MouseEvent e) 
            {
                x2 = e.getX();
                y2 = e.getY(); 
                repaint();   
            }      
        });

        /* ****************** Mouse Motion Listener ***********************  */
        addMouseMotionListener(new MouseMotionAdapter() 
        {
            public void mouseDragged(MouseEvent e) 
            {
                 repaint();
            }
        });
        }
 protected void paintComponent(Graphics g) 
    {
        super.paintComponent(g);
        .........
         //baustein
            bausteinRect = new Rectangle(0, 0,CreateFile.cf.bausteinW,CreateFile.cf.bausteinH);
            g.setColor(orangeRect);  
            g.fill3DRect(x2, y2, bausteinRect.width, bausteinRect.height,true);
 
wonach hast du denn gegoogelt..

das ist doch diesmal umso mehr ein Problem für den Kopf, fürs Denken, danach kann man nicht googeln,
zum Zeitpunkt des Mausklicks musst du dir die Informationen über das Rechteck zusammensammeln,

mit deinem ständigen Neuaufbau in paintComponent ist das nicht ganz leicht,
aber die grundsätzliche Aufgabe 'ein Rectangle, bzw. zumindest die 4 Informationen (x, y, breite, höhe) zusammenbekommen' dürfte vertraut sein,
das muss endlich fest werden, nicht CreateFile irgendwas anhängen oder so,
du kannst ja gerne ein letztes Mal dort nachschauen, aber dann ist es nur noch ein Rectangle bzw. vergleichbares und fertig,

dieses kommt in eine Liste und alle Instanzvariablen wie x2 sind frei für was neues, evtl. auf 0 zurücksetzen usw.

wenn du das alte Rechteck zeichnen willst, musst du das paint so gestalten, dass es die Liste berücksichtigt


------

nochmal angemaßte allgemeine Bewertung der letzten Threads:
Lernen und Finden kann man Grundlagen wie das Malen eines Rechtecks, das Abfragen der Mauskoordinaten,
die logische Verwendung in deinem Programm unterliegt aber nur dir,
da solltest du vor allem das bisherige schon versuchen zu verstehen, statt immer mehr aus dem Forum von verschiedenen Leuten zusammenzusammeln ohne Gesamtdurchblick
 
Hallo,

Du musst die neue anzuzeigenden Rechtecke ja irgendwo speichern und dann in
Code:
paintComponent(...)
alle zeichnen.
Hier ein JPanel, das das kann:
Java:
package rectangle;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.geom.Rectangle2D;
import java.util.ArrayList;
import java.util.List;

import javax.swing.JFrame;
import javax.swing.JPanel;

public class KlickPanel extends JPanel implements MouseListener {

	private List<Rectangle2D> rectangles = new ArrayList<Rectangle2D>();
	int rWidth = 100;
	int rHeight = 30;

	@Override
	protected void paintComponent(Graphics arg0) {
		super.paintComponent(arg0);
		Graphics2D g2d = (Graphics2D) arg0;
		g2d.setPaint(Color.ORANGE);
		for (Rectangle2D r : rectangles) {
			g2d.fill(r);
		}
	}

	public KlickPanel() {
		this.addMouseListener(this);
	}

	@Override
	public void mouseClicked(MouseEvent e) {
		int x, y;
		x = e.getX();
		y = e.getY();
		Rectangle2D rec = new Rectangle2D.Double(x, y, rWidth, rHeight);
		rectangles.add(rec);
		repaint();
	}

	@Override
	public void mouseEntered(MouseEvent e) {
	}

	@Override
	public void mouseExited(MouseEvent e) {
	}

	@Override
	public void mousePressed(MouseEvent e) {
	}

	@Override
	public void mouseReleased(MouseEvent e) {
	}

	public static void main(String[] args) {
		JFrame app = new JFrame();
		app.add(new KlickPanel());
		app.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		app.setSize(600, 480);
		app.setLocationRelativeTo(null);
		app.setVisible(true);
	}
}

Grüße
Momolin
 
ja das funktioniert so prima mit der Erstellen mehrerer Rechtecke, aber die werden nur per mouseklick erstelllt und nicht wie ich will per JButton... ich hab jetzt meine Klasse so umschrieben...

Java:
public class EditPanel extends JPanel
{
    private List<Rectangle2D> rectangles = new ArrayList<>();
        int rWidth = 100;
        int rHeight = 100;

    public  EditPanel()
    {

        
        /* ********************* Mouse Listener ***************************  */
        addMouseListener(new MouseAdapter() 
        {
            public void mousePressed(MouseEvent e) 
            {  

                x = e.getX();
                y = e.getY();
                Rectangle2D rec = new Rectangle2D.Double(x, y,rWidth,rHeight);
                rectangles.add(rec);
                repaint();    
            }
            
            public void mouseReleased(MouseEvent e) 
            {
                x2 = e.getX();
                y2 = e.getY(); 
                repaint();   
            }      
        });

        /* ****************** Mouse Motion Listener ***********************  */
        addMouseMotionListener(new MouseMotionAdapter() 
        {
            public void mouseDragged(MouseEvent e) 
            {
                 repaint();
            }
        });
        }

    protected void paintComponent(Graphics g) 
    {
        super.paintComponent(g);
     Graphics2D g2d = (Graphics2D) g;
            g2d.setPaint(orangeRect);
            
            for (Rectangle2D r : rectangles) {
                g2d.fill(r);
            }
            

    }
  
 
     int x1,y1; //mousePressed
    int x2, y2; //mouseReleased
 
    static Rectangle headerRect ;
      
    //Colors
    Color grayRect = new Color(230,227,224);
    Color orangeRect = new Color(211,111,53);

Java:
public class CreateFile extends JPanel implements ActionListener
{
     
 
    static CreateFile cf = new CreateFile();
   
    public CreateFile()
    {
        initComponents();     
    
    }
    

    public void initComponents() 
    { ... }

public void actionPerformed(ActionEvent object) 
    {
        if (object.getSource() == buttonIndividualForms)
        {   
           cf.bausteinW = Integer.parseInt(bausteinWidth.getText());    //Daten auslesen
           cf.bausteinH = Integer.parseInt(bausteinHeight.getText());   //Daten auslesen
           add(new EditPanel());
           repaint();
        } 
    }


wie kann ich denn die Zeile
Java:
 Rectangle2D rec = new Rectangle2D.Double(x, y,rWidth,rHeight);
                rectangles.add(rec);
an meinem Button anhängen
 
Zuletzt bearbeitet:
mit einem ActionListener, es ist nicht klar worin das Problem besteht,
fraglich ist auch wie du das steuern willst, denn bisher ist das Rechteck sehr eng mit der Maus verknüpft,

soll auf einen Button-Klick ein neues Rechteck irgendwo erscheinen?
willst du das danach noch mit der Maus verschieben/ vergrößern können?
na ich will eigentlich gar nicht zuviele Fragen stellen auf denen die Antwort 'ja bitte, programmieren' lauten könnte 😉

ein Button hat einen ActionListener, darin kannst du doch ein Rectangle erstellen,
also Wiederholung der ersten Zeile: was könnte dazu dein Problem sein?
 
soll auf einen Button-Klick ein neues Rechteck irgendwo erscheinen?
Ja auf dem editPanel
willst du das danach noch mit der Maus verschieben/ vergrößern können?
Ja, das alles hat ja auch funktioniert soweit.. mein problem ist nur das es nur 1 rechteck erstellt wird und nicht jedes mal wenn ich auf dem jbutton klicke...wenn ich das beim dem JButton listener erstelle passieren ganz lustige Sache.. der rechteck wird erstmal gar nicht richtig auf dem editPanel plaziert und zweitens verschwindet er imemr demm man draufzeigt
Java:
       if (object.getSource() == buttonIndividualForms)
        {   
           cf.bausteinW = Integer.parseInt(bausteinWidth.getText());    //Daten auslesen
           cf.bausteinH = Integer.parseInt(bausteinHeight.getText());   //Daten auslesen
           
           Graphics g=getGraphics();
           
           Rectangle bausteinRect = new Rectangle(0, 0,CreateFile.cf.bausteinW,CreateFile.cf.bausteinH);
           g.setColor(Color.red);  
           g.fill3DRect(0, 0, bausteinRect.width, bausteinRect.height,true); 

        } 
    }
 
du musst schon genau das machen was auch im MouseListener passiert, steht dort getGraphics()?
nein, x und y werden gesetzt, ein rectangle in die Liste eingefügt, falls das wichtig ist, repaint() aufgerufen usw.
 
es geht aber nicht ohne getGraphics (ich weiß das ist sehr böööse)... aber in dem ButtonListener kennt er g. sonst nicht
 
im MouseListener auch nicht..

überlege und schreibe was du willst,
paintComponent-Inhalt kannst du kaum weder an die Maus noch an einen Button übertragen
 
Wenn du die Rechtecke verschieben willst, dann musst du bei jedem drücken der Maustaste prüfen, ob du über einem Rechteck bist. Wenn ja, musst du dir dieses merken und dieses mittels mousemotionListener an die Position der Maus anpassen, solange diese gedrückt ist 😉
 

Zurück
Oben