English 中文(简体)
将此处的随机绘制线更改为mouseListener绘制
原标题:Change the random draw line here for a mouseListener draw

我正在做一个“绘画”项目。到目前为止,我有一个带有1个按钮“Ligne”和一个可绘制面板的GUI。在我的类Paint_Desin中,有一个方法调用TracerLigne()。这种方法按照随机的模式画线。我想做的是放置一个鼠标监听器,使x1,y1=点击1,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;
    }
}  
问题回答

为了实现这一点,您需要在绘画JPanel中添加一个MouseListener(这可以在一个扩展MouseAdapter的类中进行编码)。然后,您将覆盖mousePressed和mouseReleased(如果这些是所需的方法),并在这些方法中从传递给它的MouseEvent对象中获取鼠标位置Point。然后,您可以使用Points的值在BufferedImage中绘制一条线。我的猜测是,你会想在mousePressed上得到起点,在mouseRelease上得到终点,然后在mouseReleased之后在缓冲区中画一条线。如果您需要在mouseDraged上动态绘制一条线,那么您将需要一个MouseMotionListener(同样,上面的MouseAdapter类也适用于此)。

查看教程以获得优秀的示例代码和解释:如何编写鼠标定位器

执行此操作的半伪代码类似于:

// 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
   }
}




相关问题
Spring Properties File

Hi have this j2ee web application developed using spring framework. I have a problem with rendering mnessages in nihongo characters from the properties file. I tried converting the file to ascii using ...

Logging a global ID in multiple components

I have a system which contains multiple applications connected together using JMS and Spring Integration. Messages get sent along a chain of applications. [App A] -> [App B] -> [App C] We set a ...

Java Library Size

If I m given two Java Libraries in Jar format, 1 having no bells and whistles, and the other having lots of them that will mostly go unused.... my question is: How will the larger, mostly unused ...

How to get the Array Class for a given Class in Java?

I have a Class variable that holds a certain type and I need to get a variable that holds the corresponding array class. The best I could come up with is this: Class arrayOfFooClass = java.lang....

SQLite , Derby vs file system

I m working on a Java desktop application that reads and writes from/to different files. I think a better solution would be to replace the file system by a SQLite database. How hard is it to migrate ...

热门标签