2014-11-18 1 views
0

Я прочитал много других сообщений об этом, и я узнал, что по умолчанию для рамки установлен BorderLayout. Я добавил одну форму на запад и одну фигуру в центр кадра. Но все же на раме появляется только одна фигура. Форма, которая появляется на раме, является той, чье расположение находится в центре.Добавление двух фигур в одно и то же время на jFrame

Вот код:

import java.awt.*; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

import javax.swing.*; 

public class ShapeMover { 

    private static final int FRAME_WIDTH = 400; 
    private static final int FRAME_HEIGHT = 400; 
    private static final int SHAPE_WIDTH = 50; 
    private static final int INITIAL_X = 30; 
    private static final int INITIAL_Y = 100; 
    private static final int rec_x = 200; 
    private static final int rec_y = 200; 
    private static final int rec_height = 30; 
    private static final int rec_width = 50; 

    private boolean recToggle = true; 
    private boolean circleToggle = true; 

    private JFrame frame; 
    private CircleComponent myShape; 
    private RectangleComponent recShape; 
    private JButton circle, rectangle; 
    private JPanel panel, panel2; 

    private void initialSetUp() { 
     frame = new JFrame(); 

    myShape = new CircleComponent(INITIAL_X, INITIAL_Y, SHAPE_WIDTH); 
    recShape = new RectangleComponent(rec_x, rec_y,rec_height, rec_width); 

    circle = new JButton("Click for circle"); 
    event c = new event(); 
    circle.addActionListener(c); 

    rectangle = new JButton("Click for rectangle"); 
    event2 r = new event2(); 
    rectangle.addActionListener(r); 
    panel = new JPanel(); 
    panel.add(circle); 
    panel.add(rectangle); 
    frame.add(panel, BorderLayout.NORTH); 


    frame.add(myShape, BorderLayout.WEST); 
    frame.add(recShape,BorderLayout.CENTER); 
    myShape.setVisible(false); 
    recShape.setVisible(false); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.setSize(FRAME_WIDTH, FRAME_HEIGHT); 
    frame.setVisible(true); 

    } //method 

    public class event implements ActionListener{ 
    @Override 
    public void actionPerformed(ActionEvent e) { 
     if(circleToggle == true){ 
      myShape.setVisible(true); 
      circleToggle = false; 
     } 
     else{ 
      myShape.setVisible(false); 
      circleToggle = true; 
     } 
     } 
    } 

    public class event2 implements ActionListener{ 
     @Override 
     public void actionPerformed(ActionEvent e){ 
      if(recToggle == true){ 
       recShape.setVisible(true); 
       recToggle = false; 
      } 
      else{ 
       recShape.setVisible(false); 
       recToggle = true; 
      } 
      } 
    } 


    public static void main(String[] args) { 

    ShapeMover sm = new ShapeMover(); 
    sm.initialSetUp(); 

    } //main 

} //class 

Предупреждаю другой код довольно долго. Вот прямоугольник компонент:

import java.awt.Graphics; 
    import java.awt.Graphics2D; 
    import java.awt.Point; 
    import java.awt.event.MouseAdapter; 
    import java.awt.event.MouseEvent; 
    import java.awt.event.MouseMotionAdapter; 
    import javax.swing.JComponent; 

    public class RectangleComponent extends JComponent{ 
     private CompoundShape shape2; 
     private Point mousePoint2; 

    public RectangleComponent(int x, int y, int height, int width){ 
      shape2 = new RectangleShape(x, y, height, width); 
      addMouseListener(new MouseAdapter(){ 
       @Override 
       public void mousePressed(MouseEvent event2){ 
        mousePoint2 = event2.getPoint(); 
        if(!shape2.contains(mousePoint2)){ 
         mousePoint2 = null; 
        } 
       } 
      }); 

      addMouseMotionListener(new MouseMotionAdapter(){ 
       @Override 
       public void mouseDragged(MouseEvent event2){ 
        if(mousePoint2 == null){ 
         return; 
        } 
        Point lastMousePoint2 = mousePoint2; 
        mousePoint2 = event2.getPoint(); 
        double dx = mousePoint2.getX() - lastMousePoint2.getX(); 
        double dy = mousePoint2.getY() - lastMousePoint2.getY(); 
        shape2.translate((int) dx, (int) dy); 
        repaint(); 
       } 
      }); 
    } 
    public void paintComponent(Graphics g) { 
     Graphics2D g2 = (Graphics2D) g; 
     //shape.draw(g2); 
     shape2.draw(g2); 
     } //method 
    } 

Вот круг компонентов:

import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.Point; 
import java.awt.event.MouseAdapter; 
import java.awt.event.MouseEvent; 
import java.awt.event.MouseMotionAdapter; 
import javax.swing.JComponent; 

public class CircleComponent extends JComponent{ 
    private Circle shape2; 
    private Point mousePoint2; 

public CircleComponent(int x, int y, int width){ 
     shape2 = new Circle(x, y, width); 
     addMouseListener(new MouseAdapter(){ 
      @Override 
      public void mousePressed(MouseEvent event2){ 
       mousePoint2 = event2.getPoint(); 
       if(!shape2.contains(mousePoint2)){ 
        mousePoint2 = null; 
       } 
      } 
     }); 

     addMouseMotionListener(new MouseMotionAdapter(){ 
      @Override 
      public void mouseDragged(MouseEvent event2){ 
       if(mousePoint2 == null){ 
        return; 
       } 
       Point lastMousePoint2 = mousePoint2; 
       mousePoint2 = event2.getPoint(); 
       double dx = mousePoint2.getX() - lastMousePoint2.getX(); 
       double dy = mousePoint2.getY() - lastMousePoint2.getY(); 
       shape2.translate((int) dx, (int) dy); 
       repaint(); 
      } 
     }); 
} 
public void paintComponent(Graphics g) { 
    Graphics2D g2 = (Graphics2D) g; 
    //shape.draw(g2); 
    shape2.draw(g2); 
    } //method 
} 

Вот круг:

import java.awt.Color; 
import java.awt.Graphics2D; 
import java.awt.Point; 
import java.awt.Rectangle; 
import java.awt.Shape; 
import java.awt.geom.Ellipse2D; 
import java.awt.geom.GeneralPath; 
import java.awt.geom.Line2D; 
import java.awt.geom.Point2D; 

public class Circle implements CompoundShape { 
    private GeneralPath path = null; 
    private int x; 
    private int y; 
    private final int width; 

    public Circle(int x, int y, int width){ 
     this.x = x; 
     this.y = y; 
     this.width = width; 
    } 


    @Override 
    public void draw(Graphics2D g2) { 
     Ellipse2D.Double c = new Ellipse2D.Double(x,y,width,width); 
     g2.setColor(Color.RED); 
     g2.fill(c); 
     g2.draw(c); 

     path = new GeneralPath(); 
     path.append(c,false); 
     g2.draw(path); 
    } 

    @Override 
    public void translate(int dx, int dy) { 
     // TODO Auto-generated method stub 
     x = x + dx; 
     y = y + dy; 

    } 

    @Override 
    public boolean contains(Point point) { 
     // TODO Auto-generated method stub 

     if(path == null){ 
      return false; 
     } 
     return path.contains(point); 
    } 

} 

Вот прямоугольник формы:

import java.awt.Color; 
import java.awt.Graphics2D; 
import java.awt.Point; 
import java.awt.Rectangle; 
import java.awt.Shape; 
import java.awt.geom.Ellipse2D; 
import java.awt.geom.GeneralPath; 
import java.awt.geom.Line2D; 
import java.awt.geom.Point2D; 

public class RectangleShape implements CompoundShape { 
    private GeneralPath path = null; 
    private int x; 
    private int y; 
    private final int width; 
    private final int height; 

    public RectangleShape(int x, int y, int width, int height){ 
     this.x = x; 
     this.y = y; 
     this.width = width; 
     this.height = height; 
    } 


    @Override 
    public void draw(Graphics2D g2) { 
     Rectangle r = new Rectangle(x,y,width,height); 
     g2.setColor(Color.BLUE); 
     g2.fill(r); 
     g2.draw(r); 

     path = new GeneralPath(); 
     path.append(r,false); 
     g2.draw(path); 
    } 

    @Override 
    public void translate(int dx, int dy) { 
     // TODO Auto-generated method stub 
     x = x + dx; 
     y = y + dy; 

    } 

    @Override 
    public boolean contains(Point point) { 
     // TODO Auto-generated method stub 

     if(path == null){ 
      return false; 
     } 
     return path.contains(point); 
    } 

} 

Здесь я с соединением формы:

import java.awt.Graphics2D; 
import java.awt.Point; 

public interface CompoundShape { 

    void draw(Graphics2D g2); 
    void translate(int dx, int dy); 
    boolean contains(Point point); 

} //interface 
+1

Вы собираетесь нужно предоставить 'CircleComponent' и' RectangleComponent' прежде чем мы сможем сделать больше предложений ... – MadProgrammer

+0

* "добавил одну форму на запад и одну форму для центр рамки "* Почему бы не нарисовать оба объекта в разных местах ** того же ** контейнера? Я бы сохранил их в коллекции, такой как «ArrayList», затем перебирал коллекцию в методе paint (component) и рисовал или заполнял каждый. –

+0

* «Форма, которая появляется на кадре, является той, чье местоположение находится в центре». * Но непосредственную проблему можно устранить с помощью '@Override public Dimension getPreferredSize() {..' компонентов фигуры. –

ответ

1

Примеры итерации ArrayList<Shape> можно увидеть в:

Конечно, эти примеры живописи к изображению, но как только есть Graphics (или Graphics2D как я предпочитаю работать с) принцип такой же. Копировать/вставить из одного примера:

ArrayList<Shape> regions = separateShapeIntoRegions(imageShapeArea); 
// .. 
for (Shape region : regions) { 
    // .. 
    g.fill(region); 
    // .. 
} 
+0

Я все еще смущен, если честно. Я не понимаю, почему мой код будет рисовать только одну фигуру за раз. Что именно останавливает его от двух разных действий? – user3754524

+0

Как я уже писал вчера, вы получите лучшую помощь, если вы опубликуете MCVE. Менее тонкий способ выразить это: «Я дам ему больше внимания в тот самый момент, когда вы отправляете MCVE (и я слышу об этом). Обратите внимание, что вы можете превратить этот код, увиденный выше, в MCVE относительно просто. «public class» просто «class». Затем скопируйте/вставьте источник (после импорта) каждого класса без 'main (String [])' в конец источника с 'main'. Затем разрешите импорт. (Для краткости я использовал импорт пакетов в большинстве сообщений MCVE, которые я публикую. Подготовка MCVE - важный навык. –

+0

(MCVE) .. Пришло время узнать, как его подготовить. –