Реализуйте в JAVA функцию прямоугольной формы, как в Paint - PullRequest
1 голос
/ 17 января 2020

Я хочу реализовать функцию формы прямоугольника точно так же, как в Paint в JAVA. Я построил программу следующим образом. Я построил класс MyPaint, в котором определены кнопки и рамка. Я создал другой класс в той же программе PadDraw, где создается панель рисования, где я могу рисовать карандашом, как в Paint. Затем у меня есть другой класс вне программы DrawRect, где создается элемент формы прямоугольника. Я хочу знать, есть ли способ интегрировать прямоугольник таким образом, что если я нажму кнопку «Прямоугольник», способ рисования должен измениться, и вместо рисования карандашом я должен рисовать прямоугольные формы точно так же, как в Paint, когда прямоугольная форма нажата. Кусок кода для класса PadDraw выглядит следующим образом:

class PadDraw extends JComponent {

   private Image image;    
   private Graphics2D graphics2D;  
   private int currentX , currentY , oldX , oldY ;

  public PadDraw(){
   setDoubleBuffered(false);
   addMouseListener(new MouseAdapter(){
   public void mousePressed(MouseEvent e){
        oldX = e.getX();
        oldY = e.getY();
      }
   });

    addMouseMotionListener(new MouseMotionAdapter(){
     public void mouseDragged(MouseEvent e){
        currentX = e.getX();
        currentY = e.getY();
        if(graphics2D != null)
        graphics2D.drawLine(oldX, oldY, currentX, currentY);
        repaint();
        oldX = currentX;
        oldY = currentY;
         }

        });

    }   

   public void paintComponent(Graphics g){
        if(image == null){
          image = createImage(getSize().width, getSize().height);
          graphics2D = (Graphics2D)image.getGraphics();
          graphics2D.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
          clear();

          }
          g.drawImage(image, 5, 5, null);
    }

В то время как фрагмент кода класса DrawRect, который я хочу интегрировать в программу, где расположены классы MyPaint и PadDraw, выглядит следующим образом:

import javax.swing.*;

import java.awt.*;

import java.awt.event.*;

public class DrawRect extends JPanel {

    int x, y, x2, y2;

    public static void main(String[] args) {
        JFrame f = new JFrame("Draw Box Mouse 2");
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setContentPane(new DrawRect());
        f.setSize(300, 300);
        f.setVisible(true);
    }

    DrawRect() {
        x = y = x2 = y2 = 0; // 
        MyMouseListener listener = new MyMouseListener();
        addMouseListener(listener);
        addMouseMotionListener(listener);
    }

    public void setStartPoint(int x, int y) {
        this.x = x;
        this.y = y;
    }

    public void setEndPoint(int x, int y) {
        x2 = (x);
        y2 = (y);
    }

    public void drawPerfectRect(Graphics g, int x, int y, int x2, int y2) {
        int px = Math.min(x,x2);
        int py = Math.min(y,y2);
        int pw=Math.abs(x-x2);
        int ph=Math.abs(y-y2);
        g.drawRect(px, py, pw, ph);
    }

    class MyMouseListener extends MouseAdapter {

        public void mousePressed(MouseEvent e) {
            setStartPoint(e.getX(), e.getY());
        }

        public void mouseDragged(MouseEvent e) {
            setEndPoint(e.getX(), e.getY());
            repaint();
        }

        public void mouseReleased(MouseEvent e) {
            setEndPoint(e.getX(), e.getY());
            repaint();
        }
    }

    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.setColor(Color.BLACK);
        drawPerfectRect(g, x, y, x2, y2);
    }

}
...