How can i create resizable rectangle in java swing?

后端 未结 1 538
春和景丽
春和景丽 2021-01-27 15:42

I need to add a small feature in a project where, rectangle with some trimable text in it, and the rectangle should be resizable.

I\'m short of time so didnt try out rea

1条回答
  •  孤街浪徒
    2021-01-27 15:55

    I got the following example from online only, I am not the owner of this code sample. I forgot it where did I get this. Anyway hope this would help you:

    Resizable.java


    import java.awt.BorderLayout;
    import java.awt.Component;
    import java.awt.Cursor;
    import java.awt.Point;
    import java.awt.Rectangle;
    import java.awt.event.MouseEvent;
    
    import javax.swing.JComponent;
    import javax.swing.event.MouseInputAdapter;
    import javax.swing.event.MouseInputListener;
    
    // Resizable.java
    
    public class Resizable extends JComponent {
    
      public Resizable(Component comp) {
        this(comp, new ResizableBorder(8));
      }
    
      public Resizable(Component comp, ResizableBorder border) {
        setLayout(new BorderLayout());
        add(comp);
        addMouseListener(resizeListener);
        addMouseMotionListener(resizeListener);
        setBorder(border);
      }
    
      private void resize() {
          if (getParent() != null) {
            ((JComponent)getParent()).revalidate();
          }
      }
    
      MouseInputListener resizeListener = new MouseInputAdapter() {
        public void mouseMoved(MouseEvent me) {
          if (hasFocus()) {
              ResizableBorder border = (ResizableBorder)getBorder();
              setCursor(Cursor.getPredefinedCursor(border.getCursor(me)));
          }
        }
    
        public void mouseExited(MouseEvent mouseEvent) {
           setCursor(Cursor.getDefaultCursor());
        }
    
        private int cursor;
        private Point startPos = null;
    
        public void mousePressed(MouseEvent me) {
          ResizableBorder border = (ResizableBorder)getBorder();
          cursor = border.getCursor(me);
          startPos = me.getPoint();
          requestFocus();
          repaint();
        }
    
        public void mouseDragged(MouseEvent me) {
    
          if (startPos != null) {
    
            int x = getX();
            int y = getY();
            int w = getWidth();
            int h = getHeight();
    
            int dx = me.getX() - startPos.x;
            int dy = me.getY() - startPos.y;
    
            switch (cursor) {
              case Cursor.N_RESIZE_CURSOR:
                if (!(h - dy < 50)) {
                  setBounds(x, y + dy, w, h - dy);
                  resize();
                }
                break;
    
              case Cursor.S_RESIZE_CURSOR:
                if (!(h + dy < 50)) {
                  setBounds(x, y, w, h + dy);
                  startPos = me.getPoint();
                  resize();
                }
                break;
    
              case Cursor.W_RESIZE_CURSOR:
                if (!(w - dx < 50)) {
                  setBounds(x + dx, y, w - dx, h);
                  resize();
                }
                break;
    
              case Cursor.E_RESIZE_CURSOR:
                if (!(w + dx < 50)) {
                  setBounds(x, y, w + dx, h);
                  startPos = me.getPoint();
                  resize();
                }
                break;
    
              case Cursor.NW_RESIZE_CURSOR:
                if (!(w - dx < 50) && !(h - dy < 50)) {
                  setBounds(x + dx, y + dy, w - dx, h - dy);
                  resize();
                }
                break;
    
              case Cursor.NE_RESIZE_CURSOR:
                if (!(w + dx < 50) && !(h - dy < 50)) {
                  setBounds(x, y + dy, w + dx, h - dy);
                  startPos = new Point(me.getX(), startPos.y);
                  resize();
                }
                break;
    
              case Cursor.SW_RESIZE_CURSOR:
                if (!(w - dx < 50) && !(h + dy < 50)) {
                  setBounds(x + dx, y, w - dx, h + dy);
                  startPos = new Point(startPos.x, me.getY());
                  resize();
                }
                break;
    
              case Cursor.SE_RESIZE_CURSOR:
                if (!(w + dx < 50) && !(h + dy < 50)) {
                  setBounds(x, y, w + dx, h + dy);
                  startPos = me.getPoint();
                  resize();
                }
              break;
    
              case Cursor.MOVE_CURSOR:
                Rectangle bounds = getBounds();
                bounds.translate(dx, dy);
                setBounds(bounds);
                resize();
              }
    
    
              setCursor(Cursor.getPredefinedCursor(cursor));
            }
         }
    
       public void mouseReleased(MouseEvent mouseEvent) {
         startPos = null;
        }
      };
    }
    

    ResizableBorder.java


    import java.awt.Color;
    import java.awt.Component;
    import java.awt.Cursor;
    import java.awt.Graphics;
    import java.awt.Insets;
    import java.awt.Rectangle;
    import java.awt.event.MouseEvent;
    
    import javax.swing.SwingConstants;
    import javax.swing.border.Border;
    
    // ResizableBorder.java
    
    public class ResizableBorder implements Border {
      private int dist = 8;
    
      int locations[] =
      {
        SwingConstants.NORTH, SwingConstants.SOUTH, SwingConstants.WEST,
        SwingConstants.EAST, SwingConstants.NORTH_WEST,
        SwingConstants.NORTH_EAST, SwingConstants.SOUTH_WEST,
        SwingConstants.SOUTH_EAST
      };
    
      int cursors[] =
      {
        Cursor.N_RESIZE_CURSOR, Cursor.S_RESIZE_CURSOR, Cursor.W_RESIZE_CURSOR,
        Cursor.E_RESIZE_CURSOR, Cursor.NW_RESIZE_CURSOR, Cursor.NE_RESIZE_CURSOR,
        Cursor.SW_RESIZE_CURSOR, Cursor.SE_RESIZE_CURSOR
      };
    
      public ResizableBorder(int dist) {
        this.dist = dist;
      }
    
      public Insets getBorderInsets(Component component) {
          return new Insets(dist, dist, dist, dist);
      }
    
      public boolean isBorderOpaque() {
          return false;
      }
    
      public void paintBorder(Component component, Graphics g, int x, int y,
                              int w, int h) {
          g.setColor(Color.black);
          g.drawRect(x + dist / 2, y + dist / 2, w - dist, h - dist);
    
          if (component.hasFocus()) {
    
    
            for (int i = 0; i < locations.length; i++) {
              Rectangle rect = getRectangle(x, y, w, h, locations[i]);
              g.setColor(Color.WHITE);
              g.fillRect(rect.x, rect.y, rect.width - 1, rect.height - 1);
              g.setColor(Color.BLACK);
              g.drawRect(rect.x, rect.y, rect.width - 1, rect.height - 1);
            }
          }
      }
    
      private Rectangle getRectangle(int x, int y, int w, int h, int location) {
          switch (location) {
          case SwingConstants.NORTH:
              return new Rectangle(x + w / 2 - dist / 2, y, dist, dist);
          case SwingConstants.SOUTH:
              return new Rectangle(x + w / 2 - dist / 2, y + h - dist, dist,
                                   dist);
          case SwingConstants.WEST:
              return new Rectangle(x, y + h / 2 - dist / 2, dist, dist);
          case SwingConstants.EAST:
              return new Rectangle(x + w - dist, y + h / 2 - dist / 2, dist,
                                   dist);
          case SwingConstants.NORTH_WEST:
              return new Rectangle(x, y, dist, dist);
          case SwingConstants.NORTH_EAST:
              return new Rectangle(x + w - dist, y, dist, dist);
          case SwingConstants.SOUTH_WEST:
              return new Rectangle(x, y + h - dist, dist, dist);
          case SwingConstants.SOUTH_EAST:
              return new Rectangle(x + w - dist, y + h - dist, dist, dist);
          }
          return null;
      }
    
      public int getCursor(MouseEvent me) {
          Component c = me.getComponent();
          int w = c.getWidth();
          int h = c.getHeight();
    
          for (int i = 0; i < locations.length; i++) {
              Rectangle rect = getRectangle(0, 0, w, h, locations[i]);
              if (rect.contains(me.getPoint()))
                  return cursors[i];
          }
    
          return Cursor.MOVE_CURSOR;
      }
    }
    

    Example Implementation: ResizableComponent.java


        import java.awt.Color;
        import java.awt.Dimension;
        import java.awt.event.MouseAdapter;
        import java.awt.event.MouseEvent;
    
        import javax.swing.JFrame;
        import javax.swing.JPanel;
    
    
        /* ResizableComponent.java */
    
    
    
     public class ResizableComponent extends JFrame {
    
          private JPanel panel = new JPanel(null);
          private Resizable resizer;
    
    
          public ResizableComponent() {
    
              add(panel);
    
              JPanel area = new JPanel();
              area.setBackground(Color.white);
              resizer = new Resizable(area);
              resizer.setBounds(50, 50, 200, 150);
              panel.add(resizer);
    
    
              setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
              setSize(new Dimension(350, 300));
              setTitle("Resizable Component");
              setLocationRelativeTo(null);
    
              addMouseListener(new MouseAdapter() {
                public void mousePressed(MouseEvent me) {
    
                  requestFocus();
                  resizer.repaint();
                }
              });
          }
    
          public static void main(String[] args) {
              ResizableComponent rc = new ResizableComponent();
              rc.setVisible(true);
          }
        }
    

    Updated: ResizeRectangle.java

    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.geom.Rectangle2D;
    
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    
    public class ResizeRectangle extends JPanel {
    
        private int SIZE = 8;
        private Rectangle2D[] points = {new Rectangle2D.Double(50, 50, SIZE, SIZE), new Rectangle2D.Double(150, 100, SIZE, SIZE)};
        Rectangle2D s = new Rectangle2D.Double();
        ShapeResizeHandler ada = new ShapeResizeHandler();
    
        public ResizeRectangle() {
            addMouseListener(ada);
            addMouseMotionListener(ada);
        }
    
        public void paintComponent(Graphics g) {
            super.paintComponent(g);
    
            Graphics2D g2 = (Graphics2D) g;
    
            for (int i = 0; i < points.length; i++) {
                g2.fill(points[i]);
            }
            s.setRect(points[0].getCenterX(), points[0].getCenterY(),
                    Math.abs(points[1].getCenterX() - points[0].getCenterX()),
                    Math.abs(points[1].getCenterY() - points[0].getCenterY()));
    
            g2.draw(s);
        }
    
        class ShapeResizeHandler extends MouseAdapter {
    
            Rectangle2D r = new Rectangle2D.Double(0, 0, SIZE, SIZE);
            private int pos = -1;
    
            public void mousePressed(MouseEvent event) {
                Point p = event.getPoint();
    
                for (int i = 0; i < points.length; i++) {
                    if (points[i].contains(p)) {
                        pos = i;
                        return;
                    }
                }
            }
    
            public void mouseReleased(MouseEvent event) {
                pos = -1;
            }
    
            public void mouseDragged(MouseEvent event) {
                if (pos == -1) {
                    return;
                }
    
                points[pos].setRect(event.getPoint().x, event.getPoint().y, points[pos].getWidth(),
                        points[pos].getHeight());
                repaint();
            }
        }
    
        public static void main(String[] args) {
    
            JFrame frame = new JFrame("Resize Rectangle");
    
            frame.add(new ResizeRectangle());
            frame.setSize(300, 300);
            frame.setLocationRelativeTo(null);
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setVisible(true);
        }
    }
    

    0 讨论(0)
提交回复
热议问题