2013-05-19 6 views
2

Я пытаюсь выровнять центр формы java2d в центре JPanel без успеха. Я смог сделать это для изображения и многих 2D-фигур, таких как параллелограмм, используя метод getBounds, но не для ромба, хотя все они следуют одному и тому же шаблону. Резко, когда я подготовил SSCCE из фактического проекта, я мог правильно выровнять их. Я написал метод drawShape для рисования фигур по центру. Я не понимал, где я ошибаюсь. Это SSCCE:Выравнивание центра фигуры до центра JPanel

  import java.awt.*; 
      import java.awt.geom.*; 
      import java.util.*; 
      import javax.swing.*; 
      public class TestPanel extends JPanel{ 
        Point a,b,c,d; 
        Shape trapezium,parallelogram; 
        Random random=new Random(); 
        public TestPanel(){ 
         a=new Point(); 
         b=new Point(); 
         c=new Point(); 
         d=new Point(); 
         rhombusFactory(a,b,c,d); 
         trapezium=getQuadrilateral(a,b,c,d); 


        } 
        private void rhombusFactory(Point a,Point b,Point c,Point d) 
        {  int width=random.nextInt(200-100)+100; 
          int height=random.nextInt(150-50)+50; 
          a.x=0; 
          a.y=0; 
          b.x=a.x+width/2; 
          b.y=a.y+height/2; 
          c.x=a.x+width; 
          c.y=a.y; 
          d.x=a.x+width/2; 
          d.y=a.y-height/2; 
        } 
        private void parallelogramFactory(Point a,Point b,Point c,Point d){ 
         int l1=random.nextInt(200-100)+100; 
         int l2=random.nextInt(150-70)+70; 
         int offset=(random.nextInt(2)==0?-1:1)*(random.nextInt(50-20)+20); 
         a.x=0; 
         a.y=0; 
         b.x=a.x+l1; 
         b.y=a.y; 
         d.x=a.x+offset; 
         d.y=a.y+l2; 
         c.x=d.x+l1; 
         c.y=d.y; 
       } 
        private Shape getQuadrilateral(Point a,Point b,Point c,Point d){ 
         GeneralPath gp=new GeneralPath(); 
         gp.moveTo(a.x,a.y); 
         gp.lineTo(b.x,b.y); 
         gp.lineTo(c.x,c.y); 
         gp.lineTo(d.x,d.y); 
         gp.closePath(); 
         return gp; 
        } 
        private void drawShape(Graphics2D g,Shape shape){ 
         AffineTransform oldt=g.getTransform(); 
         Rectangle2D bounds=shape.getBounds2D(); 
         double height=bounds.getHeight(); 
         double width=bounds.getWidth(); 
         g.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON); 
         g.setStroke(new BasicStroke(2.0f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_BEVEL)); 
         g.translate(this.getWidth()/2,this.getHeight()/2); 
         g.translate(-width/2,-height/2); 
         g.draw(shape.getBounds2D()); 
         g.draw(shape); 
         g.setTransform(oldt); 
       } 
        public void paintComponent(Graphics g2){ 
          super.paintComponent(g2); 
          Graphics2D g=(Graphics2D)g2; 
          drawShape(g,trapezium); 
          //drawShape(g,parallelogram); 
        } 
        public static void main(String args[]){ 
          JFrame jf=new JFrame(); 
          TestPanel tp=new TestPanel(); 
          jf.setLayout(new BorderLayout()); 
          jf.add(tp,BorderLayout.CENTER); 
          jf.setSize(500,500); 
          jf.setVisible(true); 
        } 
      } 

Любая помощь будет оценена EDIT: я просто удалил запутанных линий из кода ...

+0

Прохождение объектов «Point», которые вы переписываете на свои фабрики, - это плохая идея. –

+0

@MelNicholson, что может быть плохой идеей, но это, похоже, не проблема. Я удалил эти линии и попытался без улучшения .... – pinkpanther

ответ

7

Вы должны учитывать для ограниченного х/у местоположения Форма:

Rectangle bounds=shape.getBounds(); // changed this 
... 
//g.translate(this.getWidth()/2,this.getHeight()/2); 
//g.translate(-width/2,-height/2); 
g.translate((this.getWidth() - width)/2,(this.getHeight() - height)/2); 
g.translate(-bounds.x, -bounds.y); // added this 
+0

Удалил ли избиратель? Пожалуйста, объясните причину, почему это не приемлемое решение. Я чувствую, что это лучше, чем принятый ответ, потому что все переводы выполняются в одном месте. Фактически принятый ответ работает только потому, что значение bounds.x имеет значение 0 (иначе вам также нужно будет манипулировать a.x). Это решение будет работать во всех случаях. – camickr

+0

твое прекрасно, вот что я хочу. Я хотел создать свою фигуру в своей собственной системе и нарисовать ее переведённую ... – pinkpanther

+0

probalby be scarred :-) – mKorbel

1

EDIT:
В методе rhombusFactory(), изменить это:

a.y=0; 

для это:

a.y=height/2; 

Short expanation:
В вашем методе drawShape(), вы размещаете происхождение графического контекста, где вы предполагаете, что левый верхний угол рамки для фигуры была бы (Point: [(GetWidth-ширина)/2, (getHeight() - height)/2]). В вашем методе rhombusFactory() вы устанавливаете точку a на (0, 0), что, следовательно, сдвигает верхний левый угол вашей формы на (0, -хейт/2), фактически заставляя его не центрировать по вертикали.

+0

(ОК, перестаньте ударить головой о стену сейчас. Это происходит с лучшими из нас (или так мне сказали: P).) – gkalpak

+0

это нормально любая другая вещь, которая мешает моей трапеции центрироваться ... – pinkpanther

+0

@pinkpanther: На самом деле это ваш ромб, который не центрирован. См. Мой обновленный ответ. (Ваша трапеция размещена просто отлично.) – gkalpak

1

Ваш перевод неправильный. Сначала вы должны перенести происхождение места рисования в центр панели, а затем перевести центр рисунка в начало. Вы сделали последнее правильно, но первое неправильно.

Изменить

g.translate(this.getWidth(),this.getHeight()); 
g.translate(-width/2,-height/2); 

в

g.translate(this.getWidth()/2,this.getHeight()/2); 
g.translate(-width/2,-height/2); 

Или просто

g.translate((this.getWidth() - width)/2,(this.getHeight() - height)/2); 
+0

. Да, извините, это было по ошибке в SSCCE, но фактический код содержит то, что вы написали и вызывающее проблему с трапецией. Итак, достаточно ли для центрирования ... или есть что-то другое, кроме этого в моем коде, вызывающее проблему при условии, что я правильно перевел? – pinkpanther

+0

@pinkpanther да, этого достаточно для центрирования. Возможно, действительно, вы повторно используете объекты «Point» в разных формах, как упоминал Мел Николсон, но, возможно, это также просто опечатка в вашем SSCCE? –

+0

Нет точек не потому, что я даже удалил эти линии и попытался ... – pinkpanther

Смежные вопросы