>source

패널에서 마우스를 드래그하면 페인트 앱과 같은 직사각형을 그리는이 code가 JAVA에 있습니다. 클릭하고 드래그하여 새 사각형을 만들 때마다 이전 사각형이 사라집니다. 나는 그것이 패널에 머물 수있는 방법이 있는지 궁금했다. 그리고 윈도우의 페인트 앱처럼 여러 개의 직사각형이 있어야합니다.


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.RED);
            drawPerfectRect(g, x, y, x2, y2);
        }
    }

확실한. 각 사각형을 java.awt.Rectangle 객체의 java.util.List에 저장합니다. 목록에서 직사각형을 그립니다.

Gilbert Le Blanc2021-02-23 01:16:23

paintComponent는 패널을 업데이트해야 할 때마다 호출되며 패널의 모든 내용을 대체합니다. 그리려는 개체 목록을 관리해야합니다.

tgdavies2021-02-23 01:16:23

  • 답변 # 1

    Swing 그래픽 프로그램 작성을 기억해야 할 몇 가지 유용한 정보가 있습니다.

    • paintComponent호출 될 때마다 전체 구성 요소를 다시 그리므로 표시하려는 모든 것을 그려야합니다. 당신이하는 작업제도법객체는 다음에 대한 다음 호출까지만 지속됩니다.paintComponent.
    • Graphics2D보다 유능하다제도법. 부동 소수점 좌표, 다양한 선 스타일 등으로 멋지게 앤티 앨리어싱 된 모양을 그립니다. 그만큼제도법매개 변수paintComponent사실 항상Graphics2D인스턴스로 만들 수 있으며 걱정없이 하나에 캐스팅 할 수 있습니다.
    • 구성 요소의 상속 계층 구조도 페인팅 계층 구조이므로 다음을 호출해야합니다.super.paintComponent (g)당신의 시작에paintComponent방법. 보다 이 질문자세한 내용은

    그래서 프로그램을 변경했습니다.

    • 필드 추가,목록 < Rectangle2D > 직사각형사용자가 만든 사각형을 기억합니다. 마우스 버튼을 올릴 때마다이 목록에 사각형이 추가됩니다.
    • 통화 추가super.paintComponent
    • 중고Graphics2D더 흥미로운 선 스타일 (뇌졸중)
    • 변경paintComponent목록의 각 직사각형과 사용자가 현재 그리는 '고무 밴드'직사각형을 그립니다.
    
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import java.awt.Color;
    import java.awt.Graphics;
    import java.awt.Graphics2D;
    import java.awt.event.MouseAdapter;
    import java.awt.event.MouseEvent;
    import java.awt.geom.Rectangle2D;
    import java.util.ArrayList;
    import java.util.List;
    public class DrawRect extends JPanel {
        int x, y, x2, y2;
        //this is the list of all the rectangles the user has drawn so far
        List rectangles= new ArrayList<>();
        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);
        }
        //this creates a new rectangle object instead of drawing one
        public Rectangle2D makePerfectRect(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);
            return new Rectangle2D.Float(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());
                //when the mouse is released, we add the current rectangle to our list
                rectangles.add(makePerfectRect(x,y,x2,y2));
                repaint();
            }
        }
        public void paintComponent(Graphics g) {
            //use Graphics2D, you can draw much nicer lines
            Graphics2D g2d= (Graphics2D) g;
            super.paintComponent(g);
            g.setColor(Color.RED);
            //draw the rectangle the user is currently drawing
            g2d.draw(makePerfectRect(x,y,x2,y2));
            g.setColor(Color.BLUE);
                    Stroke oldStroke= g2d.getStroke();
            g2d.setStroke(new BasicStroke(4.0f, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND, 0.0f));
            for (Rectangle2D r : rectangles) {
                g2d.draw(r);
            }
            g2d.setStroke(oldStroke); //restore the original Stroke
        }
    }
    
  • 이전 값 오류가 발생합니다. code에서 인식 할 수없는 모드 '1.4142135623730951'이 필요합니다.
  • 다음 javascript : AWS EC2에 배포 된 Nodejs에서 클라이언트의 퍼블릭 IP 찾기