【问题标题】:Adding 2 shapes at the same time on a jFrame在 jFrame 上同时添加 2 个形状
【发布时间】:2014-11-19 10:50:31
【问题描述】:

我阅读了许多关于此的其他帖子,并了解到框架默认设置为 BorderLayout。我在西边添加了一个形状,在框架的中心添加了一个形状。但是,仍然只有一个形状出现在框架上。框架上出现的形状是位于中心的形状。

代码如下:

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

【问题讨论】:

  • 您需要提供CircleComponentRectangleComponent,我们才能提出更多建议...
  • "向西添加一个形状,向框架中心添加一个形状" 为什么不在相同的不同位置绘制两个对象容器?我会将它们存储在诸如ArrayList 之类的集合中,然后在绘制(组件)方法中迭代该集合并绘制或填充每一个。
  • “出现在框架上的形状是位于中心的形状。” 但是直接的问题可以通过形状组件的@Override public Dimension getPreferredSize() { .. 来解决。
  • 为了尽快获得更好的帮助,请发布 MCVE(最小完整可验证示例),而不是分布在 6 个源代码文件中的类。
  • 主类是ShapeMover.java。正如 MadProgrammer 要求的那样,其他类可供参考。我觉得它与我框架的布局管理器有关

标签: java swing java-2d jcomponent


【解决方案1】:

迭代ArrayList<Shape> 的示例可见:

当然,这些示例是在图像上绘画,但是一旦有Graphics(或我更喜欢使用的Graphics2D),原理就差不多了。从一个示例复制/粘贴:

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

【讨论】:

  • 老实说,我仍然很困惑。我不明白为什么我的代码一次只能绘制一个形状。究竟是什么阻止了它一次让两个人痛苦?
  • 就像我昨天写的那样,如果您发布 MCVE,您将获得更好的帮助。一个不太微妙的说法是“我会在你发布 MCVE 的那一刻(我听说过)给它更多的通知。请注意,你可以将上面看到的代码相对简单地转换为 MCVE。改变所有将public class 改为class。然后将没有main(String[]) 的每个类的源代码(在导入之后)复制/粘贴到带有main 的源末尾。然后解析导入。(为简洁起见,我在发布的大多数 MCVE 中都使用了包导入。准备 MCVE 是一项重要技能。..
  • 谢谢。一旦有时间,我会尝试学习它。我一直忙于其他课程。也有一个面向对象编程的庞大项目。作为一名大学生很糟糕=(
  • “还有一个面向对象编程的大型项目。” 除非您知道如何制作 MCVE,否则将需要 更长 才能完成。 . 就我而言,一旦出现 MCVE,我会更仔细地观察这个问题,而之前不会。 否则我就是在浪费 我的 时间,这对我来说很宝贵。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-24
  • 1970-01-01
  • 2017-02-22
  • 1970-01-01
相关资源
最近更新 更多