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);
 
S

SlaterB

Gast
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
 

Momolin

Aktives Mitglied
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
 

plammy

Bekanntes Mitglied
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:
S

SlaterB

Gast
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?
 

plammy

Bekanntes Mitglied
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); 

        } 
    }
 
S

SlaterB

Gast
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.
 

plammy

Bekanntes Mitglied
es geht aber nicht ohne getGraphics (ich weiß das ist sehr böööse)... aber in dem ButtonListener kennt er g. sonst nicht
 
S

SlaterB

Gast
im MouseListener auch nicht..

überlege und schreibe was du willst,
paintComponent-Inhalt kannst du kaum weder an die Maus noch an einen Button übertragen
 

njans

Top Contributor
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 ;)
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
T Swing Mehrere Ausgaben in JTextArea AWT, Swing, JavaFX & SWT 2
H Mehrere Panels auf JFrame AWT, Swing, JavaFX & SWT 8
S Mehrere Tabellen Zellen gleichzeitig färben AWT, Swing, JavaFX & SWT 5
Apfelbaum2005 Swing JFrame mehrere JPanels mit unterschiedlichen Formen hinzufügen AWT, Swing, JavaFX & SWT 1
K JavaFX unterschiedliche (mehrere Fenster) in seperater Main Methode AWT, Swing, JavaFX & SWT 26
I Scene Builder - mehrere Seiten AWT, Swing, JavaFX & SWT 6
P Swing Mehrere JLabels mit ImageIcon in JPanel lesen AWT, Swing, JavaFX & SWT 1
schoel27 Mehrere JButtons sollen das gleiche Event auslösen AWT, Swing, JavaFX & SWT 2
Z GUI Forms - Mehrere Fenster in einem Projekt AWT, Swing, JavaFX & SWT 18
M mehrere jTextField untereinander AWT, Swing, JavaFX & SWT 1
N Bilder auf Button einfügen und mehrmals ändern (ein Button, mehrere ActionListener) AWT, Swing, JavaFX & SWT 2
B Swing Sudoku: Laden / Speichern von Zahlen aus/in mehrere JTextFields aus/in eine(r) Textdatei AWT, Swing, JavaFX & SWT 9
M JavaFX JavaFX in mehrere Controller AWT, Swing, JavaFX & SWT 21
R mehrere buttons mit forschleife kreieren und individuell bearbeiten AWT, Swing, JavaFX & SWT 1
N JavaFX 1 Listener für mehrere ChoiceBoxen AWT, Swing, JavaFX & SWT 3
N Textdatei GUI, Text in Textarea anzeigen mehrere Zeilen AWT, Swing, JavaFX & SWT 1
temi JavaFX Mehrere Views mit Stage.setScene() oder mit Scene.setRoot()? AWT, Swing, JavaFX & SWT 7
P Swing Mehrere JPanels auf ein JFrame hinzufügen? AWT, Swing, JavaFX & SWT 2
T Swing Tetraeder - mehrere Punkte verbinden? - Ansätze gesucht AWT, Swing, JavaFX & SWT 2
K JavaFX in mehrere Controller aufteilen AWT, Swing, JavaFX & SWT 29
K JavaFX in mehrere Controller aufteilen AWT, Swing, JavaFX & SWT 0
stroggi Swing Mehrere transparentes Objekte (Grafiken) über einem Bild (JLabel) darstellen AWT, Swing, JavaFX & SWT 4
K Mehrere Linien zeichnen AWT, Swing, JavaFX & SWT 8
J JavaFX - mehrere Views, Model durchreichen AWT, Swing, JavaFX & SWT 10
it_is_all Swing Mehrere JComboBoxen - wie die versch. Boxen mit ItemStateChange auslesen? AWT, Swing, JavaFX & SWT 3
M Swing Mehrere Textfelder mit ScrollBars - Größe der Felder AWT, Swing, JavaFX & SWT 0
W JavaFX Mehrere Klassen in ein TableView AWT, Swing, JavaFX & SWT 6
F AWT mehrere Panels in einem Frame AWT, Swing, JavaFX & SWT 17
L JavaFX Mehrere JavaFX Szenen mit einem Menü AWT, Swing, JavaFX & SWT 1
D Java FXML mehrere Fenster AWT, Swing, JavaFX & SWT 4
F JavaFX Mehrere Stages "managen" AWT, Swing, JavaFX & SWT 2
r4w Changelistener auf mehrere Textfelder AWT, Swing, JavaFX & SWT 5
H Swing + Paint: Mehrere Objekte zeichnen lassen AWT, Swing, JavaFX & SWT 3
S Swing Mehrere Modal-Dialoge übereinander AWT, Swing, JavaFX & SWT 5
T 2D-Grafik JFreeChart mehrere Y-Achsen AWT, Swing, JavaFX & SWT 2
C JavaFX mehrere Kreise nach Eingabeprozess ausgeben AWT, Swing, JavaFX & SWT 2
Thallius Swing Mehrere tausend "Panels" erstellen AWT, Swing, JavaFX & SWT 3
C Java FX Warnmeldung: Mehrere Fonts gehören derselben Familie und Stil AWT, Swing, JavaFX & SWT 2
J Mehrere JInternalFrame; GetValues AWT, Swing, JavaFX & SWT 1
JG12111989 mehrere Polyline-Objekte zeichnen AWT, Swing, JavaFX & SWT 3
LexeB4F JTable mehrere Zelle selektieren und inhalte Löschen.. Ideen gesucht AWT, Swing, JavaFX & SWT 1
V Tastatur KeyListener für mehrere Buttons AWT, Swing, JavaFX & SWT 1
K JavaFX Mehrere Cell Editors in einem TreeView Item AWT, Swing, JavaFX & SWT 2
KaffeeFan mehrere JTextField durchlaufen AWT, Swing, JavaFX & SWT 4
J Java -8 Action Listener für mehrere Buttons AWT, Swing, JavaFX & SWT 9
T Dynamisch mehrere Checkboxen anlegen AWT, Swing, JavaFX & SWT 2
G JavaFX Menü und mehrere Scenes AWT, Swing, JavaFX & SWT 16
R Swing Mehrere JTextFields mit einem Document Listener AWT, Swing, JavaFX & SWT 2
D Mehrere RadiButtons auswählar AWT, Swing, JavaFX & SWT 3
P Swing JTable mehrere Zeilen markieren AWT, Swing, JavaFX & SWT 1
M Mehrere Jpanel in einem JScrollPane (Layout) AWT, Swing, JavaFX & SWT 2
T JavaFX FXMLController für mehrere FXML? AWT, Swing, JavaFX & SWT 7
G mehrere Action-Abfolgen erfassen AWT, Swing, JavaFX & SWT 6
elischa JFrame über mehrere JPanel und Listener AWT, Swing, JavaFX & SWT 17
X Swing JPanel mehrere Ebenen zeichnen AWT, Swing, JavaFX & SWT 13
J Mehrere Hyperlinks "stilvoll" darstellen. AWT, Swing, JavaFX & SWT 1
G Mehrere Strings um Kreis zeichnen und positionieren AWT, Swing, JavaFX & SWT 0
S JavaFX Mehrere TreeTableView's synchron scrollen AWT, Swing, JavaFX & SWT 0
U Mehrere Oberflächeninstanzen seperat schließen AWT, Swing, JavaFX & SWT 5
J Rahmen um mehrere GUI Einzelteile AWT, Swing, JavaFX & SWT 2
S Layouts, mehrere Buttons nebeneinander AWT, Swing, JavaFX & SWT 2
M Mehrere Fenster innerhalb einer Application AWT, Swing, JavaFX & SWT 3
T Über mehrere Panel zeichnen AWT, Swing, JavaFX & SWT 2
M ActionListener für mehrere Klassen AWT, Swing, JavaFX & SWT 4
T [LWJGL] mehrere Displays? AWT, Swing, JavaFX & SWT 19
SexyPenny90 Mehrere Fenster AWT, Swing, JavaFX & SWT 2
M Handling 1 Fenster mehrere Panels AWT, Swing, JavaFX & SWT 2
Y Mehrere JSlider verlinken AWT, Swing, JavaFX & SWT 6
Java-Insel LayoutManager Ein GridBagLayout-Objekt für mehrere Panels? AWT, Swing, JavaFX & SWT 2
O Swing JLabel mehrere Zeilen AWT, Swing, JavaFX & SWT 2
B JToolBar dynamisch auf mehrere Zeilen erweitern AWT, Swing, JavaFX & SWT 2
Jats Zeichen auf mehrere JPanels AWT, Swing, JavaFX & SWT 7
G Mehrere Probleme mit Java's GUI AWT, Swing, JavaFX & SWT 6
G Mehrere Layoutprobleme AWT, Swing, JavaFX & SWT 2
Kenan89 JTable mehrere ListSelections AWT, Swing, JavaFX & SWT 2
M TextArea über mehrere Zeilen - wie Zeileanzahl abfragen? AWT, Swing, JavaFX & SWT 5
J Swing JDialog blokiert mehrere JFrames - soll aber nur den aufrufenden blockieren AWT, Swing, JavaFX & SWT 4
A mehrere Zeilen in GUi ausgeben AWT, Swing, JavaFX & SWT 2
N Mehrere Tasks nacheinander ausführen AWT, Swing, JavaFX & SWT 7
C SWT Mehrere Bilder in GUI laden AWT, Swing, JavaFX & SWT 5
propra Mehrere Objekte gleichzeitig verschieben AWT, Swing, JavaFX & SWT 7
M 2D-Grafik Mehrere Linien (nacheinander) übereinander Zeichnen AWT, Swing, JavaFX & SWT 6
M Mehrere JPanel nacheinander?! AWT, Swing, JavaFX & SWT 11
Furtano AWT mehrere Bilder in einen Frame zeichnen + Layout Manager AWT, Swing, JavaFX & SWT 10
K SWT Mehrere Einträge ins Clipboard legen AWT, Swing, JavaFX & SWT 2
C Swing Ein JFrame mehrere Ansichten AWT, Swing, JavaFX & SWT 8
C Swing Mehrere JSlider sollen aufeinander reagieren AWT, Swing, JavaFX & SWT 4
GUI-Programmer JFilechooser, mehrere Datein selektieren und Reihenfolge (2) AWT, Swing, JavaFX & SWT 8
S Mehrere JLists - Wie kennzeichnen? AWT, Swing, JavaFX & SWT 2
S Swing MVC Ein JFrame, mehrere JPanels AWT, Swing, JavaFX & SWT 6
J Mehrere JRadioButtons, aber nur 1 darf ausgewählt sein AWT, Swing, JavaFX & SWT 4
L Swing Mehrere Button die selbe Größe AWT, Swing, JavaFX & SWT 4
B AWT mehrere Fenster schließen AWT, Swing, JavaFX & SWT 8
I Wie mehrere JComboBoxen in Abhängigkeit einer anderen Box ändern? AWT, Swing, JavaFX & SWT 8
G mehrere JPanel in ein (vertikales) JScrollPane AWT, Swing, JavaFX & SWT 8
F Swing Mehrere Textfelder in Scrollpane einfügen und dann zum Scrollen bringen? AWT, Swing, JavaFX & SWT 4
GianaSisters Swing jTable - Feldtext soll mehrere Zeilen haben AWT, Swing, JavaFX & SWT 3
K JFileChooser mehrere Dateien markieren ohne STRG AWT, Swing, JavaFX & SWT 4
D Mehrere JTabel in einem Frame positionieren AWT, Swing, JavaFX & SWT 5
N mehrere JComboBoxes AWT, Swing, JavaFX & SWT 10

Ähnliche Java Themen

Neue Themen


Oben