2010-11-23 4 views
0

私はプロジェクト内にトリム可能なテキストを含む矩形とサイズ変更可能な小さなフィーチャを追加する必要があります。どのように私はJavaスイングでサイズ変更可能な四角形を作成できますか?

私は時間が足りないので、読んでそれを大いに試してみました。 私はそれのために行く方法をいくつか考えてください。

ありがとうございます。

-Uday

+1

はJTextAreaのような音。もっと具体的になりますか? – jzd

+1

矩形も移動可能な場合はサイズ変更が可能ですか?そうでない場合は、JLabelを使用するだけでなく、カスタムボーダーとサイズ変更を可能にするLayoutManager設定を使用するのはなぜですか? – 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