2013-03-21 4 views
-1

Я хочу нарисовать холст, который будет перемещаться на Jpanel. То есть, когда пользователь нажимает на холст и перетаскивает его, он должен перейти в новый позит. Я реализовал MouseMotionListener, но я понятия не имею, что включить внутрь, чтобы заставить холст двигаться в соответствии с требованиями. вот класс 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); 
    } 
} 

NB: просьба не предполагать, что я использую JPanel am для использования холста.

+0

Тогда вы будете [* Смешение тяжеловесных и легкие компоненты *] (http://www.oracle.com/technetwork/articles/java/mixing-components-433992.html). – trashgod

ответ

4

Факт, который вы не хотите распространять JPanel, кажется довольно странным, но это не является неосуществимым. Тем не менее, вы, вероятно, столкнетесь с проблемами в какой-то момент, потому что вы смешиваете легкие и тяжеловесные компоненты. Вероятно, у вас будут видимые сбои и другие проблемы с отображением.

Однако я хотел бы обратить ваше внимание на несколько важных ошибок, которые вы сделали в текущем коде:

  1. Не проходит классы, если не требуется (нет необходимости расширять JFrame ни Canvas)
  2. Не сделать переменные static если не абсолютно необходимо
  3. соглашения об именах Follow Java: имена классов всегда начинаются с заглавной буквы
  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

Thank u Polet..это именно то, что я хотел иметь движущийся холст, и я прочитал http://www.oracle.com/technetwork/articles/java/mixing-components-433992.html это действительно помогло мне – Twekz

Смежные вопросы