簡體   English   中英

在Java中的JFrame上拖動矩形

[英]Drag rectangle on JFrame in Java

我想根據mousedrag事件繪制矩形。 如果用戶拖動鼠標,則小程序上的矩形應根據當前鼠標坐標增加或減少。 我有以下代碼。

在以下代碼中,我正在使用SelectionArea類,該類擴展了在其上執行繪制操作的畫布。 我在此類中使用image變量進行雙重緩沖以減少閃爍並保存applet的先前狀態(即applet的繪制內容)

但如果我畫第一個矩形,代碼工作正常。 如果我開始繪制第二個矩形,則先前繪制的矩形將消失。 我希望先前繪制的矩形出現在屏幕上

請告訴我如何解決這個問題。

您需要做的是將先前繪制的矩形保存在某種數據結構中,以便稍后再繪制。

此代碼(很抱歉,長度不正確,將執行與您所描述的類似的操作。
要使用它,只需將JPanel拍打到JFrame

public class DrawPane extends JPanel {

    private List<DrawnShape> drawings;
    private DrawnShape curShape;

    public DrawPane() {
        drawings = new ArrayList<DrawnShape>();
        setBackground(Color.WHITE);
        setPreferredSize(new Dimension(300, 300));
        addMouseListener(clickListener);
        addMouseMotionListener(moveListener);
    }

    @Override
    protected void paintComponent(Graphics g2) {
        super.paintComponent(g2);
        Graphics2D g = (Graphics2D) g2;
        for (DrawnShape s : drawings) {
            s.draw(g);
        }
        g.setColor(Color.BLACK);
        g.setStroke(new BasicStroke(2));

        if (curShape == null)
            return;
        curShape.draw(g);
    }

    private MouseListener clickListener = new MouseAdapter() {

        @Override
        public void mousePressed(MouseEvent e) {
            curShape = new DrawnShape(e.getPoint(), e.getPoint());
        }

        @Override
        public void mouseReleased(MouseEvent e) {
            drawings.add(new DrawnShape(curShape.getClickP(), e.getPoint()));
            curShape = null;
        }
    };

    private MouseMotionListener moveListener = new MouseMotionListener() {

        @Override
        public void mouseDragged(MouseEvent e) {
            curShape = new DrawnShape(curShape.getClickP(), e.getPoint());
            repaint();
        }
        @Override
        public void mouseMoved(MouseEvent e) {
        }
    };
}

class DrawnShape {

    private Point p1, p2;

    public DrawnShape(Point p1, Point p2) {
        this.p1 = p1;
        this.p2 = p2;
    }

    public Point getClickP() {
        return p1;
    }

    public void draw(Graphics2D g) {
        g.drawLine(p1.x, p1.y, p2.x, p1.y);
        g.drawLine(p1.x, p1.y, p1.x, p2.y);
        g.drawLine(p2.x, p2.y, p2.x, p1.y);
        g.drawLine(p2.x, p2.y, p1.x, p2.y);
    }
}

“自定義繪畫方法”顯示了兩種執行此操作的技術。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM