2010-11-23 4 views
0

프로젝트에서 일부 trimable 텍스트가있는 사각형과 크기를 조정할 수있는 작은 기능을 추가해야합니다.어떻게 자바 스윙에서 크기를 조정할 수있는 사각형을 만들 수 있습니까?

시간이 너무 짧기 때문에 읽고 읽고 사용해 보는 것이 좋습니다. 나는 어떻게 할 생각이 필요합니다.

미리 감사드립니다. -Uday

+1

가 JTextArea에 같은 소리. 훨씬 더 구체적 일 수 있습니까? – jzd

+1

사각형을 크기 조정할 수 있으면 이동 가능해야합니까? 그렇지 않은 경우 사용자 정의 테두리와 크기 조정을 허용하는 LayoutManager 설정을 사용하여 JLabel을 사용하지 않는 이유는 무엇입니까? – Puce

답변

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); 
    } 
} 
+0

안녕하세요 주셔서 감사합니다, 실제로 발견하고 그 코드를 시도. 8 개의 작은 직사각형이 사용되는 패널의 크기를 조절하는 코드라고 생각합니다. 그것이 맞다면 알려주십시오 .. – uday

+0

당신은 주어진 샘플 코드를 따라갈 수 있습니까? (ResizableComponent.java) 그냥 그것을 따르고 구현 비슷한. –

+0

예. 노력하고 있습니다. 감사. – uday

관련 문제