Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/403.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java、Swing、Awt—在图像上绘制一个矩形并使其可见_Java_Swing_Awt - Fatal编程技术网

Java、Swing、Awt—在图像上绘制一个矩形并使其可见

Java、Swing、Awt—在图像上绘制一个矩形并使其可见,java,swing,awt,Java,Swing,Awt,我试图打开一个图像,在拖动鼠标时在其上绘制一个矩形(鼠标拖动),并在释放鼠标时绘制最后一个矩形 我实现了在拖动时绘制矩形,但目前无法收集最后一点的坐标来绘制矩形并存储数据。你有什么想法来改进我的代码吗?(在背景中添加一个图像,即使在其上绘制了多个图像,也可以在其上保持矩形大小) 我想Mousevent可以帮助我,但我不确定该如何使用它 编辑:在绘制第一个矩形后,如果绘制第二个矩形,我希望它保持可见 package selectZone; import java.awt.event.*; imp

我试图打开一个图像,在拖动鼠标时在其上绘制一个矩形(鼠标拖动),并在释放鼠标时绘制最后一个矩形

我实现了在拖动时绘制矩形,但目前无法收集最后一点的坐标来绘制矩形并存储数据。你有什么想法来改进我的代码吗?(在背景中添加一个图像,即使在其上绘制了多个图像,也可以在其上保持矩形大小)

我想Mousevent可以帮助我,但我不确定该如何使用它

编辑:在绘制第一个矩形后,如果绘制第二个矩形,我希望它保持可见

package selectZone;

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

public class Rec extends JFrame {

    public Rec() {
        super("rectangle");
        setPreferredSize(new java.awt.Dimension(400, 400));
        setDefaultCloseOperation(EXIT_ON_CLOSE);

        JPanel pane = new Pan();
        add(pane);

        pack();
        setVisible(true);

    }

    public static void main(String[] args) {
        new Rec();
    }

}

class Pan extends JPanel {

    private Point origin;
    private Point end;
    private Point endFinal;

    public Pan() {
        MouseAdapter adapter = new Lis();
        addMouseMotionListener(adapter);
        addMouseListener(adapter);
    }

    class Lis extends MouseAdapter {
        public void mouseDragged(MouseEvent e) {
            end = e.getPoint();
            repaint();
        }

        public void mousePressed(MouseEvent e) {
            origin = e.getPoint();
        }

        public void mouseReleased(MouseEvent e, Graphics g) {
            endFinal = e.getPoint();
            g.clearRect(0, 0, getWidth(), getHeight());
            g.setColor(Color.RED);
            int x1 = (int) (origin.getX());
            int y1 = (int) (origin.getY());
            int x2 = (int) (endFinal.getX());
            int y2 = (int) (endFinal.getY());
            g.drawRect(x1, y1, x2 - x1, y2 - y1);
        }

    }

    public void paint(Graphics g) {
        g.clearRect(0, 0, getWidth(), getHeight());
        g.setColor(Color.RED);
        if (origin != null) {

            int tmp;

            int x1 = (int) (origin.getX());
            int y1 = (int) (origin.getY());
            int x2 = (int) (end.getX());
            int y2 = (int) (end.getY());

            if (x1 > x2) {
                tmp = x1;
                x1 = x2;
                x2 = tmp;
            }
            if (y1 > y2) {
                tmp = y1;
                y1 = y2;
                y2 = tmp;
            }

            g.drawRect(x1, y1, x2 - x1, y2 - y1);
        }

    }

}
谢谢你们的时间,伙计们

我试图打开一个图像,在上面画一个矩形

在绘制第一个矩形后,如果绘制第二个矩形,我希望它保持可见

package selectZone;

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

public class Rec extends JFrame {

    public Rec() {
        super("rectangle");
        setPreferredSize(new java.awt.Dimension(400, 400));
        setDefaultCloseOperation(EXIT_ON_CLOSE);

        JPanel pane = new Pan();
        add(pane);

        pack();
        setVisible(true);

    }

    public static void main(String[] args) {
        new Rec();
    }

}

class Pan extends JPanel {

    private Point origin;
    private Point end;
    private Point endFinal;

    public Pan() {
        MouseAdapter adapter = new Lis();
        addMouseMotionListener(adapter);
        addMouseListener(adapter);
    }

    class Lis extends MouseAdapter {
        public void mouseDragged(MouseEvent e) {
            end = e.getPoint();
            repaint();
        }

        public void mousePressed(MouseEvent e) {
            origin = e.getPoint();
        }

        public void mouseReleased(MouseEvent e, Graphics g) {
            endFinal = e.getPoint();
            g.clearRect(0, 0, getWidth(), getHeight());
            g.setColor(Color.RED);
            int x1 = (int) (origin.getX());
            int y1 = (int) (origin.getY());
            int x2 = (int) (endFinal.getX());
            int y2 = (int) (endFinal.getY());
            g.drawRect(x1, y1, x2 - x1, y2 - y1);
        }

    }

    public void paint(Graphics g) {
        g.clearRect(0, 0, getWidth(), getHeight());
        g.setColor(Color.RED);
        if (origin != null) {

            int tmp;

            int x1 = (int) (origin.getX());
            int y1 = (int) (origin.getY());
            int x2 = (int) (end.getX());
            int y2 = (int) (end.getY());

            if (x1 > x2) {
                tmp = x1;
                x1 = x2;
                x2 = tmp;
            }
            if (y1 > y2) {
                tmp = y1;
                y1 = y2;
                y2 = tmp;
            }

            g.drawRect(x1, y1, x2 - x1, y2 - y1);
        }

    }

}
保留要绘制的矩形阵列列表。然后在显示图像的组件的paintComponent()方法中,迭代列表以绘制矩形

查看中的
drawincomponet
example以获取一个工作示例,帮助您入门


该示例仅绘制矩形,因此您还需要绘制图像。或者您可以扩展JLabel,这样标签会绘制图像,然后您只需绘制矩形。

不要覆盖
paint
,而是使用
paintComponent
,并确保在执行任何自定义绘制之前调用
super.paintComponent
,你会发现它产生的问题更少我不明白
mouseRelease
事件的目的。
origin
end
已经设置得非常远,如果你调用
repaint
,矩形将被绘制。谢谢,我看到了你的观点,但是当我添加图像时,我看不到我正在绘制的矩形。我怎样才能解决这个问题?你不能将图像“添加”到面板中。使用面板的相同paintComponent()方法绘制图像和矩形。所以你先画图像,然后再画矩形,这样他们就可以在图像的顶部作画