2012-02-15 5 views
0

Il y a plusieurs problèmes avec ce codeDessin en ligne java

public class LineEx extends JFrame implements MouseMotionListener,MouseListener{ 
    int x1,y1,x2,y2; 
    public LineEx(){ 
     JLabel image=new JLabel(""); 
     JFileChooser chooser=new JFileChooser(); 

     chooser.setCurrentDirectory(new File(".")); 
     int r=chooser.showOpenDialog(new JFrame()); 
     File file=chooser.getSelectedFile(); 
     if(r==JFileChooser.APPROVE_OPTION){ 
      try { 
       BufferedImage bf; 
       bf = ImageIO.read(file); 
       ImageIcon icon=new ImageIcon(bf); 
       image.setIcon(icon); 
       image.setHorizontalAlignment(JLabel.CENTER); 

      } catch (IOException ex) { 
       Logger.getLogger(LineEx.class.getName()).log(Level.SEVERE, null, ex); 
      } 
     } 
     JScrollPane jsp=new JScrollPane(image); 
     getContentPane().add(jsp); 
     image.addMouseListener(this); 
     image.addMouseMotionListener(this); 
     this.pack(); 
    } 
    public static void main(String ar[]){ 
     LineEx line=new LineEx(); 
     line.setVisible(true); 
     line.setDefaultCloseOperation(EXIT_ON_CLOSE); 
    } 

    public void mouseClicked(MouseEvent e) { 

    } 

    public void mousePressed(MouseEvent e) { 
     x1=e.getX(); 
     y1=e.getY(); 
    } 

    public void mouseReleased(MouseEvent e) { 
     JOptionPane.showMessageDialog(rootPane, "X1="+x1+" Y1="+y1); 
    } 

    public void mouseEntered(MouseEvent e) { 
    } 

    public void mouseExited(MouseEvent e) { 
    } 
    @Override 
    public void paint(Graphics g){ 
     super.paintComponents(g); 
     Graphics2D gd=(Graphics2D)g; 
     gd.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); 
     Line2D line=new Line2D.Double(x1,y1,x2,y2); 
     gd.draw(line); 
    } 

    public void mouseDragged(MouseEvent e) { 
     x2=e.getX(); 
     y2=e.getY(); 
     repaint(); 
    } 

    public void mouseMoved(MouseEvent e) { 
    } 
} 
  1. MouseEvents ne reçoivent pas les coordonnées exactes que signifie chaque fois que je dessine une ligne, il est pas sur sa position. Quelle est la raison derrière cela?
  2. Je veux déplacer la ligne le long de l'image lorsque la barre de défilement monte et descend, comment puis-je faire cela?
+0

Pour une meilleure aide plus rapidement, postez un [SSCCE] (http://sscce.org/). –

+0

'public void paint (Graphiques g) {' devrait être 'public void paintComponent (Graphics g) {' – mKorbel

+0

@mKorbel C'est là que la notation '@ Override' est très pratique. Si vous essayez votre suggestion dans le code OP, cela provoquera une erreur de compilation. Et * c'est * où un SSCCE est utile. ;) –

Répondre

6
  • MouseEvents ne reçoivent pas les coordonnées exactes qui signifie chaque fois que je dessine une ligne ne figure pas sur sa position. Quelle est la raison derrière cela?
  • Je veux déplacer la ligne le long de l'image lorsque la barre de défilement monte et descend, comment puis-je faire cela?

Vous obtenez les coordonnées correctes de la JLabel mais les peintures sur le JFrame. Et les coordonnées du cadre commencent en haut à gauche et "inclut" le titre/la bordure de la fenêtre.

substituez la méthode paintComponent sur la JLabel et vous obtiendrez les coordonnées correctes et encarts.


Exemple:

class ImageComponent extends JComponent 
     implements MouseListener, MouseMotionListener { 
    private final BufferedImage img; 
    private Point p1, p2; 

    public ImageComponent(URL url) throws IOException { 
     img = ImageIO.read(url); 
     setPreferredSize(new Dimension(img.getWidth(), img.getHeight())); 
     addMouseListener(this); 
     addMouseMotionListener(this); 
    } 
    @Override protected void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     g.drawImage(img, 0, 0, img.getWidth(), img.getHeight(), this); 
     if (p1 != null && p2 != null) 
      g.drawLine(p1.x, p1.y, p2.x, p2.y); 
    } 
    @Override public void mousePressed(MouseEvent e) { 
     p1 = e.getPoint(); 
    } 
    @Override public void mouseDragged(MouseEvent e) { 
     mouseReleased(e); 
    } 
    @Override public void mouseReleased(MouseEvent e) { 
     p2 = e.getPoint(); 
     repaint(); 
    } 
    @Override public void mouseMoved(MouseEvent e) {} 
    @Override public void mouseClicked(MouseEvent e) {} 
    @Override public void mouseEntered(MouseEvent e) {} 
    @Override public void mouseExited(MouseEvent e) {} 
} 

Code d'essai (génère cette capture d'écran):

screenshot

public static void main(String[] args) throws Exception { 

    final URL lenna = 
     new URL("http://upload.wikimedia.org/wikipedia/en/2/24/Lenna.png"); 

    final ImageComponent image = new ImageComponent(lenna); 

    JFrame frame = new JFrame("Test"); 
    frame.add(new JScrollPane(image)); 

    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.setSize(400, 300); 
    frame.setVisible(true); 
} 
+0

Je n'ai pas ajouté écouteur souris au 'JFrame', à la place je l'ai ajouté sur 'image (JLabel)'. – Parth

+0

C'est pourquoi j'ai mis à jour la réponse. :) * refresh * :) – dacwe

+0

A également ajouté un exemple complet et une capture d'écran. – dacwe

2
  1. La source peut être des encarts de la bordure de JLabel.
  2. Vous avez le rect visible. Ajoutez rect x et y visibles à vos coordonnées de base.
3
  1. N'allongez rien (surtout pas JFrame). Conservez une référence à l'original BufferedImage qui a été chargé.
  2. Lorsqu'un événement de souris se produit (sur l'étiquette, comme mentionné par d'autres), peindre la ligne à une copie de l'image, qui est ensuite utilisé pour l'étiquette.
  3. Placez l'étiquette dans un panneau avec GridBagLayout sans contrainte, elle est donc centrée.
  4. Supprimez le panneau dans un volet de défilement qui est ensuite ajouté à une contrainte (par exemple BorderLayout.CENTER) d'un composant parent.

Notez que vous pouvez également ajouter la ligne des objets à une collection extensible comme un ArrayList ou DefaultListModel, puis les afficher dans un JList au WEST du volet de défilement d'image. Cela faciliterait la gestion (et éventuellement la suppression) des groupes de lignes.