2015-12-21 2 views
-2

J'ai ajouté 2 composants JComponent à JPanel. Ces composants JComponent ont des objets peints personnalisés, par exemple plusieurs Cercles et plusieurs Line2Ds.Les dimensions de ces deux composants jcomponent sont définies à la taille de l'écran requise Quand je les ajoute à JPanel, les mouselisteners ne fonctionnent pas. Cependant si je commente l'un d'entre eux, alors l'auditeur commence à travailler.L'ajout de plusieurs composants JComponents désactive le programme d'écoute de la souris

public class MapXMLBuilder extends JFrame { 
     public void initialize() { 
      panel = new Jpanel(); 
      addLine();//ading lines 
      addCircle();//adding cirlces 
      add(panel) 
     } 
     private void addLine() { 
      mDrawLine = new DrawLine(panel); 
      mDrawCircle.setDimensions(screenWidth, screenWidth); 
      panel.add(mDrawLine); //adding JComponent1 to panel 
      for (int i = 0; i < 10; i++) { //adding 10 circles  
       mDrawLine.addLine(new Point2D.Double(x, y)); 
      } 
     } 
     private void addCircle() { 
      mDrawCircle = new DrawCircle(panel); 
      mDrawCircle.setDimensions(screenWidth, screenWidth); 
      panel.add(mDrawCircle); //adding JComponent1 to panel 
      for (int i = 0; i < 10; i++) { //adding 10 circles  
       mDrawCircle.addCircle(new Point2D.Double(x, y)); 
      } 
     } 
    } 

    public class DrawLine extends JComponent { 
     public DrawLine(JPanel jpanel) { 
      lineList = new ArrayList(); 
      addMouseListener(mouseAdapter); 
      addMouseMotionListener(mouseAdapter); 
      setBackground(Color.white); 
     } 
     public void addLine(int x1, int y1, int x2, int y2, Color color) { 
      Shape currentShape = new Line2D.Float(x1, y1, x2, y2); 
      lineList.add(currentShape); 
      repaint(); 
     } 
     protected void paintComponent(Graphics g) { 
      super.paintComponent(g); 
      Graphics2D g2d = (Graphics2D) g; 
      g2d.setPaint(Color.BLACK); 
      for (Shape shape: lineList) { 
       if (shapes != null && shapes.size() > 0) { 
        g2d.setColor(Color.YELLOW); 
        g2d.draw(shape); 
       } 
      } 
     } 
     public void setDimensions(int width, int height) { 
      setSize(new Dimension(width, height)); 
     } 
    } 

    public class DrawCircle extends JComponent { 
     public DrawCircle(JPanel jpanel) { 
      circleList = new ArrayList(); 
      addMouseListener(mouseAdapter); 
      addMouseMotionListener(mouseAdapter); 
      setBackground(Color.white); 
     } 
     public void addCircle(Point2D p) { 
      Ellipse2D e = new Ellipse2D.Double(p.getX(), p.getY(), 5, 5); 
      circleList.add(e); 
      selectedPoint = null; 
      repaint(); 
     } 
     public void setDimensions(int width, int height) { 
      setSize(new Dimension(width, height)); 
     } 
     protected void paintComponent(Graphics g) { 
      super.paintComponent(g); 
      Graphics2D g2 = (Graphics2D) g; 
      int diameter = 75; 
      Ellipse2D e; 
      Color color; 
      for (int j = 0; j < circleList.size(); j++) { 
       e = (Ellipse2D) circleList.get(j); 
       float alpha = 0.75f; 
       color = new Color(1, 0, 0, alpha); //Red 
       g2.setPaint(color); 
       Ellipse2D.Double circle = new Ellipse2D.Double(e.getX(), e.getY(), diameter, diameter); 
       g2.fill(circle); 
      } 
     } 
    } 
+0

Si les deux occupent l'intégralité de l'écran et doivent être l'un sur l'autre ET doivent être ajoutés au même composant, doivent-ils vraiment être des composants séparés? – pvg

+0

sous-panneaux.setOpaque (faux)? – FredK

+0

La question est pourquoi? Pourquoi ne pas combiner la fonctionnalité de peinture dans un seul composant – MadProgrammer

Répondre

0

Vous pouvez transférer l'événement de l'un à l'autre. Essayez quelque chose comme ceci:

firstComponent.addMouseListener(new MouseAdapter(){ 
    public void mouseClicked(MouseEvent event){ 
     // forward the event 
     secondComponent.dispatchEvent(event); 

     // handle the code here 
    } 
}); 
secondComponent.addMouseListener(// etc. 
+0

Je suis passé par la démo du panneau de verre. Il maintient le panneau racine ou le panneau de verre actif à la fois. Que faire si nous voulons que les deux composants soient actifs simultanément? –

+0

J'ai édité ma réponse ci-dessus. Les 2 formes sont ajoutées mais les mouselisteners dessus ne fonctionnent pas –

+0

J'ai édité ma réponse pour assortir la question que je vous demande. –