2010-11-23 3 views
0

J'ai besoin d'ajouter une petite fonctionnalité dans un projet où, rectangle avec du texte trimable, et le rectangle devrait être redimensionnable. Je n'ai pas assez de temps, donc je n'ai pas essayé de lire et de travailler beaucoup dessus. J'ai besoin d'une idée de comment y aller.Comment puis-je créer un rectangle redimensionnable en java swing?

Merci d'avance.

-Uday

+1

Sons comme un JTextArea. Pourriez-vous être beaucoup plus précis? – jzd

+1

Si le rectangle est redimensionnable, doit-il être également déplaçable? Si non, pourquoi ne pas simplement utiliser un JLabel, avec une bordure personnalisée et un paramètre LayoutManager qui permet le redimensionnement? – Puce

Répondre

1

j'ai eu l'exemple suivant de ligne seulement, je ne suis pas le propriétaire de cet exemple de code. J'ai oublié où est-ce que j'ai eu ceci. Quoi qu'il en soit espérons que cela pourrait vous aider:

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

Exemple Mise en œuvre: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); 
     } 
    } 

Mise à jour: 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

Salut merci pour notre temps, en fait j'ai trouvé et essayé ce code. Je pense que c'est un code pour redimensionner un panneau où 8 petits rectangles sont utilisés. Faites-moi savoir si le faire droit .. – uday

+0

vous pouvez suivre l'exemple de code donné à droite? (ResizableComponent.java) il suffit de suivre et de mettre en œuvre quelque chose de similaire. –

+0

Ya j'essaie. Merci. – uday

Questions connexes