2013-03-21 3 views
-1

Jpanel에서 움직일 수있는 캔버스를 그려야합니다. 사용자가 캔버스를 클릭하고 드래그하면 새로운 위치로 이동해야합니다. MouseMotionListener를 구현했지만 내부에 포함 시켜서 requierements 당 캔버스를 움직이게하는 방법을 모른다. 다음은 DisplayCanvas 클래스입니다.Jpanel에 움직일 수있는 캔버스를 그립니다.

class DisplayCanvas extends Canvas 
{ 
    public DisplayCanvas() 
    { 
     setBounds(20, 40, 300, 300); 
     setBackground(Color.white); 
    } 
} 
class shape extends JFrame implements MouseMotionListener{ 

static JPanel panel; 
static Container contentpane; 
static DisplayCanvas canvas; 
shape() 
{ 
    canvas=new DisplayCanvas(); 
    canvas.addMouseMotionListener(this); 
    panel= new JPanel(); 
    panel.setBounds(20,20,250,140); 
    panel.setLayout(null); 
    contentpane = getContentPane(); 
    contentpane.add(canvas); 
    contentpane.add(panel); 
} 
@Override 
public void mouseDragged(MouseEvent e) {} 
@Override 
public void mouseMoved(MouseEvent arg0) {} 
} 

이것은 테스트 방법입니다.

public class display 
{ 
    static JFrame frame; 
    public static void main(String[] args) 
    { 
     frame=new shape(); 
     frame.setBounds(380, 200, 500, 400); 
     frame.setTitle("SHAPE AND COLOR"); 
     frame.setVisible(true); 
    } 
} 

주의 : 캔버스를 사용하는 데 필요한 JPanel을 사용하지 마십시오.

+0

이됩니다 (코드가 제대로 분리 측면 리팩토링 할 필요가)이 작업을 할 수 있습니다 매우 기본적인 방법을 설명한다 [* 중량 및 경량의 성분을 혼합 *] (http://www.oracle.com/technetwork/articles/java/mixing-components-433992.html). – trashgod

답변

4

사실 JPanel을 확장하고 싶지는 않지만 이상하게 보일 수 있지만 실행 불가능합니다. 가볍고 중량이 많은 구성 요소를 혼합하기 때문에 어느 시점에서 문제가 발생할 수 있습니다. 아마도 시각적 결함 및 기타 디스플레이 문제가있을 것입니다. 난 당신이 현재 코드에서 만든 몇 가지 중요한 실수에 관심을 그릴 것입니다 그러나

: 필요하지 않은 경우

  1. 클래스를 확장하지 마십시오
  2. 하지 마십시오 (필요 JFrame 확장되지도 Canvas합니다) 변수를 만들 static하지 않는 한 절대적으로 필요
  3. 따르 자바 명명 규칙 : 클래스 이름은 항상
  4. nullLayoutManager를 사용하지 마십시오 대문자로 시작 . 여기

이 조각은 당신이 그런

import java.awt.Canvas; 
import java.awt.Color; 
import java.awt.Component; 
import java.awt.Container; 
import java.awt.Dimension; 
import java.awt.LayoutManager2; 
import java.awt.Point; 
import java.awt.Rectangle; 
import java.awt.event.MouseAdapter; 
import java.awt.event.MouseEvent; 
import java.util.LinkedHashMap; 
import java.util.Map; 

import javax.swing.JComponent; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.SwingUtilities; 

public class TestHeavyweightLightweight { 

    public class MyLayoutManager implements LayoutManager2 { 

     private Map<Component, Rectangle> constraints = new LinkedHashMap<Component, Rectangle>(); 

     @Override 
     public void addLayoutComponent(String name, Component comp) { 
      constraints.put(comp, comp.getBounds()); 
     } 

     @Override 
     public void removeLayoutComponent(Component comp) { 
      constraints.remove(comp); 
     } 

     @Override 
     public Dimension preferredLayoutSize(Container parent) { 
      Rectangle rect = new Rectangle(); 
      for (Rectangle r : constraints.values()) { 
       rect = rect.union(r); 
      } 
      return rect.getSize(); 
     } 

     @Override 
     public Dimension minimumLayoutSize(Container parent) { 
      return preferredLayoutSize(parent); 
     } 

     @Override 
     public void layoutContainer(Container parent) { 
      for (Map.Entry<Component, Rectangle> e : constraints.entrySet()) { 
       e.getKey().setBounds(e.getValue()); 
      } 
     } 

     @Override 
     public void addLayoutComponent(Component comp, Object constraints) { 
      if (constraints instanceof Rectangle) { 
       this.constraints.put(comp, (Rectangle) constraints); 
      } else { 
       addLayoutComponent((String) null, comp); 
      } 
     } 

     @Override 
     public Dimension maximumLayoutSize(Container target) { 
      return new Dimension(Integer.MAX_VALUE, Integer.MAX_VALUE); 
     } 

     @Override 
     public float getLayoutAlignmentX(Container target) { 
      return 0; 
     } 

     @Override 
     public float getLayoutAlignmentY(Container target) { 
      return 0; 
     } 

     @Override 
     public void invalidateLayout(Container target) { 

     } 

     public void setConstraints(Component component, Rectangle rect) { 
      constraints.put(component, rect); 
     } 

     public class MouseDragger extends MouseAdapter { 
      private Point lastLocation; 
      private Component draggedComponent; 

      @Override 
      public void mousePressed(MouseEvent e) { 
       draggedComponent = e.getComponent(); 
       lastLocation = SwingUtilities.convertPoint(draggedComponent, e.getPoint(), draggedComponent.getParent()); 
      } 

      @Override 
      public void mouseDragged(MouseEvent e) { 
       Point location = SwingUtilities.convertPoint(draggedComponent, e.getPoint(), draggedComponent.getParent()); 
       if (draggedComponent.getParent().getBounds().contains(location)) { 
        Point newLocation = draggedComponent.getLocation(); 
        newLocation.translate(location.x - lastLocation.x, location.y - lastLocation.y); 
        newLocation.x = Math.max(newLocation.x, 0); 
        newLocation.x = Math.min(newLocation.x, draggedComponent.getParent().getWidth() - draggedComponent.getWidth()); 
        newLocation.y = Math.max(newLocation.y, 0); 
        newLocation.y = Math.min(newLocation.y, draggedComponent.getParent().getHeight() - draggedComponent.getHeight()); 
        setConstraints(draggedComponent, new Rectangle(newLocation, draggedComponent.getSize())); 
        if (draggedComponent.getParent() instanceof JComponent) { 
         ((JComponent) draggedComponent.getParent()).revalidate(); 
        } else { 
         draggedComponent.getParent().invalidate(); 
         draggedComponent.getParent().validate(); 
        } 
        lastLocation = location; 
       } 
      } 

      @Override 
      public void mouseReleased(MouseEvent e) { 
       lastLocation = null; 
       draggedComponent = null; 
      } 

      public void makeDraggable(Component component) { 
       component.addMouseListener(this); 
       component.addMouseMotionListener(this); 
      } 

     } 

    } 

    private Canvas canvas; 
    private JPanel panel; 

    protected void createAndShowGUI() { 
     JFrame frame = new JFrame(TestHeavyweightLightweight.class.getSimpleName()); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     canvas = new Canvas(); 
     canvas.setBackground(Color.WHITE); 
     panel = new JPanel(); 
     MyLayoutManager mgr = new MyLayoutManager(); 
     panel.setLayout(mgr); 
     panel.add(canvas, new Rectangle(20, 40, 300, 300)); 
     MyLayoutManager.MouseDragger mouseDragger = mgr.new MouseDragger(); 
     mouseDragger.makeDraggable(canvas); 
     frame.add(panel); 
     frame.pack(); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       new TestHeavyweightLightweight().createAndShowGUI(); 
      } 
     }); 
    } 

} 
+0

Polet에게 감사드립니다. 이것은 정확히 내가 움직이는 캔버스를 갖고 싶었고 http://www.oracle.com/technetwork/articles/java/mixing-components-433992.html을 읽었습니다. 정말 도움이되었습니다. – Twekz

관련 문제