2010-11-23 119 views
0

我需要在項目中添加一個小功能,矩形中包含一些可修改的文本,而矩形應該可以調整大小。如何在java swing中創建可調整大小的矩形?

我很短的時間,所以沒有嘗試閱讀和處理它很多。 我需要一些想法如何去做。

在此先感謝。

-Uday

+1

聽起來像一個JTextArea。你能更具體些嗎? – jzd 2010-11-23 13:02:21

+1

如果矩形可調整大小,是否也可以移動?如果不是,那麼爲什麼不直接使用帶有自定義邊框和允許調整大小的LayoutManager設置的JLabel? – Puce 2010-11-23 13:37:51

回答

1

我得到了下面的例子只在網上,我沒有這個代碼示例的所有者。我忘了它是從哪裏得到的。無論如何希望這會幫助你:

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; 
    } 
} 

示例實現: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); 
     } 
    } 

更新時間: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); 
    } 
} 
相關問題