BorderLayout macht meine Zeichnung kaputt

Status
Nicht offen für weitere Antworten.

raffnix

Bekanntes Mitglied
Hallo.
Ich habe da ein Problem mit dem Layout.

Ich Benutze ein BorderLayout. Beim Start des Programms wird ein Rechteck gezeichnet.
der Zeichenbereich ist CENTER.

Ich fügte noch ein paar Buttons hinzu (NORTH). Nun wird mein Rechteck verschoben gezeichnet.
Wie bekomme ich es hin, das der ZeichenBereich nicht gestaucht wird??
hier mal ein Stück Code.

Code:
mal= new Drawit();
mal.setSize(500,500);

ButtonGroup bgr = new ButtonGroup(); 
move   = new JToggleButton("move");		
..

bgr.add(move);
..
JPanel buttonleiste = new JPanel(new GridLayout(0,5));
buttonleiste.add(move);
..

getContentPane().add(buttonleiste, BorderLayout.NORTH);
getContentPane().add(mal, BorderLayout.CENTER);

setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(800, 600);
setLocation(100, 100);
}

public static void main(String[] args){
	Handmanager f = new Handmanager();
	f.setVisible(true);
	
}

Ich hoffe jemand weiss hier Rat den ich bin echt ratlos....
 
es könnte sein, dass das setSize() die Probleme auslöst. Probier stattdessen mal setPreferredSize()
 
Versuch mal:
Code:
public static void main(String[] args){ 
   Handmanager f = new Handmanager(); 
   f.pack();
   f.setVisible(true); 

}
wenn's nicht funktioniert erklär mal genauer was du mit verschoben meinst, und poste mehr code...
 
Danke für die Mühe. aber so funzt es auch nicht.
Mit Verschoben mein ich, daß mein gezeichnetes rechteck 2mal da ist . einmal an der richtigen position und einmal nach unten versetzt.

ohne Buttons. entsteht nur ein Rechteck..
hier mal der ganze code.
es ist etwas viel zum posten aber so kann man es testen.

Code:
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import javax.swing.ButtonGroup;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JToggleButton;

class Handmanager extends JFrame implements MouseListener, MouseMotionListener{
 HandDrawit mal;
    JToggleButton move;	
	JToggleButton rotate;
	JToggleButton point;
	JToggleButton rect;
	JToggleButton scale;
	
Handmanager(){

mal= new HandDrawit();
mal.addMouseListener(this);
mal.addMouseMotionListener(this);
mal.setPreferredSize(new Dimension(500,500));

ButtonGroup bgr = new ButtonGroup(); 
move   = new JToggleButton("move");		
rotate = new JToggleButton("rotate");
point  = new JToggleButton("point");
rect   = new JToggleButton("rect");
scale  = new JToggleButton("scale");

bgr.add(move);
bgr.add(rotate);
bgr.add(point);
bgr.add(rect);
bgr.add(scale);

JPanel buttonleiste = new JPanel(new GridLayout(0,5));
buttonleiste.add(move);
buttonleiste.add(rotate);
buttonleiste.add(point);
buttonleiste.add(rect);
buttonleiste.add(scale);

getContentPane().add(buttonleiste, BorderLayout.NORTH);//diese Zeile auskomm.  = alles richtig

getContentPane().add(mal, BorderLayout.CENTER);

setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(800,600);
setLocation(100, 100);
}

public static void main(String[] args){
	Handmanager f = new Handmanager();
	f.pack();
	f.setVisible(true);
	
}

public void mouseClicked(MouseEvent e) {
	if(e.getSource() == mal){
		mal.rectPunkte.clear();
		mal.getRectPoint(e.getPoint());
	}
	repaint();
}


public void mouseDragged(MouseEvent e) {
	if(e.getSource() == mal ){
		mal.rotategraph(e.getPoint());
	}
	repaint();
}

public void mousePressed(MouseEvent arg0) {
	// TODO Auto-generated method stub
	
}

public void mouseReleased(MouseEvent arg0) {
	// TODO Auto-generated method stub
	
}


public void mouseEntered(MouseEvent arg0) {
	// TODO Auto-generated method stub
	
}

public void mouseExited(MouseEvent arg0) {
	// TODO Auto-generated method stub
	
}


public void mouseMoved(MouseEvent arg0) {
	// TODO Auto-generated method stub
	
}

}
und die malende classe.
Code:
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.RenderingHints;
import java.awt.Toolkit;
import java.awt.geom.*;
import java.util.ArrayList;
import java.util.Iterator;

import javax.swing.JComponent;

public class HandDrawit extends JComponent{
	Graphics2D g2d;
	ArrayList rectPunkte = new ArrayList();
	double rectx=210;
	double recty=210;
	double rectWidth=80;
	double rectHeight=60;
	
	
	double theta;
	Rectangle.Double rechteck = new Rectangle2D.Double(rectx,recty,rectWidth,rectHeight);
	
	
		public void paintComponent(Graphics g){
			g2d = (Graphics2D) g;
			g2d.setColor(Color.GREEN);
			Iterator zaehler2 = rectPunkte.iterator();
	         while (zaehler2.hasNext())
	         {
	         	g2d.setColor(Color.GREEN);
	         Point punktrect = (Point) zaehler2.next();
	         rectx = punktrect.x;
	         recty = punktrect.y;
	         rechteck = new Rectangle2D.Double(rectx,recty,rectWidth,rectHeight);
	         g2d.draw(rechteck);
	         }
			
			
			g2d.draw(rechteck);
			AffineTransform as = AffineTransform.getRotateInstance(theta,rechteck.getCenterX(), rechteck.getCenterY());
			g2d.setTransform(as);
			g2d.draw(rechteck);			         
		}
		
	         	


public void rotategraph (Point p){
	theta =  - Math.atan2(p.x - rechteck.getCenterX(), p.y-rechteck.getCenterY());	
		repaint();
	    
}
public void getRectPoint(Point punkt){
 	rectPunkte.add(punkt);
 	repaint();
 }


}
 
Code:
public void paintComponent(Graphics g){ 
        //hier einfügen super.paintComponent(g);
         g2d = (Graphics2D) g; 
         g2d.setColor(Color.GREEN); 
         Iterator zaehler2 = rectPunkte.iterator(); 
            while (zaehler2.hasNext()) 
            { 
               g2d.setColor(Color.GREEN); 
            Point punktrect = (Point) zaehler2.next(); 
            rectx = punktrect.x; 
            recty = punktrect.y; 
            rechteck = new Rectangle2D.Double(rectx,recty,rectWidth,rectHeight); 
            g2d.draw(rechteck); 
            } 
          
          
         g2d.draw(rechteck); 
         AffineTransform as = AffineTransform.getRotateInstance(theta,rechteck.getCenterX(), rechteck.getCenterY()); 
         g2d.setTransform(as); 
         g2d.draw(rechteck);                   
      }
 
Richtig . ganz vergessen.
allerdings hilft das meinem Problem nicht weiter.
trotzdem danke für den "Hint". :wink:
 
Dachte das Rechteck ist nur doppelt weil du nicht super.paintComponent() aufrufst, aber du zeichnest ja wirklich 2 Rechtecke:
Code:
         g2d.draw(rechteck); 
         AffineTransform as = AffineTransform.getRotateInstance(theta,rechteck.getCenterX(), rechteck.getCenterY()); 
         g2d.setTransform(as); 
         g2d.draw(rechteck);
mach das erste mal weg
 
ich möchte auch 2 mal zeichnen.
das erste ist nur da, damit ich sehe ob die koordinaten verschoben sind(durch die Buttons) oder nicht.
wenn du die zeile :
getContentPane().add(buttonleiste, BorderLayout.NORTH);

auskommentierst. siehst du das EIN rechteck erscheint.
das ist das erste draw(rechteck).
wenn ich es entferne ist das Problem scheinbar gelöst aber halt nur scheinbar.
der Zeichen bereich bleibt gestaucht und ärgert meine AffineTransfom.
 
Code:
      public void paintComponent(Graphics g){ 
         g2d = (Graphics2D) g; 
         g2d.setColor(Color.GREEN);        
         g2d.draw(rechteck); 
  		 g2d.rotate(theta,rechteck.getCenterX(), rechteck.getCenterY());
         g2d.draw(rechteck);                   
      }
 
Ja das meinte ich.

Code:
public void paintComponent(Graphics g){
         g2d = (Graphics2D) g;
         g2d.setColor(Color.GREEN);       
        // g2d.draw(rechteck);
         g2d.rotate(theta,rechteck.getCenterX(), rechteck.getCenterY());
         g2d.draw(rechteck);                   
      }

Ich habe es zur kontrolle eingefügt.
wenn ich es so auskommentiere. sieht es super aus . hast recht.
Nun drehe ich das rechteck. und es flackert beim drehen ein weiteres auf.
das flackernde bleibt zwar nicht, ist aber um den bereich der Buttons verschoben.
um der Sache auf den Grund zu gehen fügte ich die Zeile(g2d.draw(rechteck)) ein.
und siehe da . Mein Koordinatensystem wird durch die Buttons geändert.
 
Also bei mir flackert da nichts, und die Koordinaten stimmen auch.
Natürlich wird das Koordinatensystem geändert, das sind ja alles Koordinaten relativ zum Ursprung deines Panels, aber das ist ja auch ok...
 
nicht wirklich:
Code:
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.geom.Rectangle2D;
import java.util.ArrayList;

import javax.swing.JComponent;

public class HandDrawit extends JComponent
{

	ArrayList rectPunkte = new ArrayList();

	double rectx = 210;

	double recty = 210;

	double rectWidth = 80;

	double rectHeight = 60;

	double theta;

	Rectangle.Double rechteck = new Rectangle2D.Double(rectx, recty, rectWidth,
			rectHeight);

	public void paintComponent(Graphics g)
	{
		super.paintComponent(g);
		Graphics2D g2d = (Graphics2D) g;
		g2d.setColor(Color.GREEN);
		g2d.draw(rechteck);
		g2d.rotate(theta, rechteck.getCenterX(), rechteck.getCenterY());
		g2d.draw(rechteck);
	}

	public void rotategraph(Point p)
	{

		theta = -Math.atan2(p.x - rechteck.getCenterX(), p.y
				- rechteck.getCenterY());
		repaint();

	}

	public void getRectPoint(Point punkt)
	{
		rectPunkte.add(punkt);
		repaint();
	}

}
 
naja . dann liegt es wohl an der hardware.
Vielen dank für die nette Hilfe.
ich denke mal, das Problem ist so gelöst
.
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben