2011-02-10 57 views
0

即时通讯工作在“绘图”程序。到目前为止,我有一个带有1个按钮“Ligne”和一个可绘制面板的GUI。在我的类Paint_Dessin中,一个方法调用TracerLigne()。此方法在随机模式中画线。我想要做的是把一个mouselistener所以x1,y1 = click1和x2,y2 =单击2.这是我的代码。谢谢(遗憾的法国评论)更改鼠标侦听器绘制的随机绘制线

//cree une fenetre 
public class QUESTION { 

    public static void main(String[] args) { 
     Paint_GUI test2 = new Paint_GUI(); 
    } 
} 

import javax.swing.*; 
import java.awt.event.*; 
import java.awt.*; 

public class Paint_GUI extends JFrame { 
    //Panels contenant tout les bouton de mon interface 

    private JPanel panelBtn; 
    //Bar d'outil Btn 
    private JButton BtnTracerLigne; 
    //créer l'objet Paint_Dessin 
    private Paint_Dessin espaceDessin = new Paint_Dessin(); 

    public Paint_GUI() { 
     final int WINDOW_WIDTH = 650; 
     final int WINDOW_HEIGHT = 450; 

     setSize(WINDOW_WIDTH, WINDOW_HEIGHT); 
     setTitle("Paint v.2.0"); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setLayout(new BorderLayout()); 

     // Appeler la methode qui construit la barre de BTN. 
     buildPanelBtn(); 
     add(panelBtn, BorderLayout.NORTH); 
     add(espaceDessin, BorderLayout.CENTER); 

     // Afficher la fenetre. 
     setVisible(true); 
    } 

    private void buildPanelBtn() { 
     BtnTracerLigne = new JButton("Ligne"); 
     BtnTracerLigne.addActionListener(new LigneListener()); 

     // Creer le panel. 
     panelBtn = new JPanel(); 
     // Ajouter les composantes au label 
     panelBtn.add(BtnTracerLigne); 
    } 

    private class LigneListener implements ActionListener { 

     public void actionPerformed(ActionEvent e) { 
      espaceDessin.TracerLigne(); 
     } 
    } 
} 

import java.awt.*; 
import java.awt.geom.*; 
import javax.swing.*; 
import java.util.*; 
import java.awt.image.*; 

class Paint_Dessin extends JPanel { 

    private static final long serialVersionUID = -2110723486099015303L; 
    private static final Random RAND = new Random(); 
    private BufferedImage buffer = null; 

    @Override 
    public void paintComponent(final Graphics g) { 
     final Graphics2D g2 = (Graphics2D) g; 
     g2.clearRect(0, 0, getWidth(), getHeight()); // cleanup du composant 
     g2.drawImage(getBuffer(), null, 0, 0); 
    } 

    public void TracerLigne() { 
     final Graphics2D g2 = getBuffer().createGraphics(); 
     g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, 
       RenderingHints.VALUE_ANTIALIAS_ON); 
     g2.setColor(Color.BLACK); 
     // dessin la ligne au pif dans l'espace visible 
     final int x1 = RAND.nextInt(500); // position en X1 
     final int y1 = RAND.nextInt(500); // position en Y1 
     final int x2 = RAND.nextInt(500); // position en X2 
     final int y2 = RAND.nextInt(500); // position en Y2 
     g2.drawLine(x1, y1, x2, y2); 
     Line2D.Double line = new Line2D.Double(x1, y1, x2, y2); 
     g2.fill(line); 
     repaint(); 
    } 

    private BufferedImage getBuffer() { 
     if (buffer == null) { 
      buffer = new BufferedImage(getWidth(), getHeight(), 
        BufferedImage.TYPE_INT_ARGB); 
     } 
     return buffer; 
    } 
} 
+0

我清理你的问题。下次请正确格式化源代码。粘贴代码时,在窗口中选择它并点击代码按钮(二进制图标)。它会缩进四个空格,导致页面呈现为源代码。 – I82Much 2011-02-10 03:22:26

回答

1

对于这个工作,你需要一个的MouseListener添加到您画的JPanel(这样就可以编码在扩展MouseAdapter的单个类中)。然后,您将重写mousePressed和mouseReleased(如果这些是所需的方法),并在这些方法中获取传递给它的MouseEvent对象的鼠标位置Point。然后,您将使用这些点的值在BufferedImage中绘制一条线。我的猜测是,你会希望得到mousePressed上的起点和mouseReleased上的终点,然后在mouseReleased之后在缓冲区中画线。如果您需要在mouseDragged上动态绘制一条线,则需要一个MouseMotionListener(同样,上面的MouseAdapter类也适用于此)。

检查出优秀的示例代码和解释教程:How To Write a MouseListener

半伪这样做的是一样的东西:

// assuming a private inner class 
private class MyMouseAdapter extends MouseAdapter { 
    @Override 
    public void mousePressed(MouseEvent e) { 
     // get your starting point from e, the MouseEvent and store it in variable 
    } 

    @Override 
    public void mouseReleased(MouseEvent e) { 
     // get your end point from e, the MouseEvent 
     // get the Graphics object from the BufferedImage 
     // set the color 
     // set rendering hints for antialiasing if desired 
     // draw your line using the starting and end points 
     // **** dispose your graphics object **** don't forget! 
     // repaint your JPanel 
    } 
}