Java Swing在拖动鼠标时重新绘制

Java Swing在拖动鼠标时重新绘制,java,swing,drawing,mouseevent,Java,Swing,Drawing,Mouseevent,当我在自定义面板上拖动鼠标时,我很难让它自己重新绘制 基本上,我在自定义面板上绘制自由形式的线条,并附加以下处理程序: MouseInputAdapter mia = new MouseInputAdapter() { @Override public void mousePressed(MouseEvent e) { if(_app_split_right_buttons_radioInkBtn.isSelecte

当我在自定义面板上拖动鼠标时,我很难让它自己重新绘制

基本上,我在自定义面板上绘制自由形式的线条,并附加以下处理程序:

MouseInputAdapter mia = new MouseInputAdapter() {
            @Override
            public void mousePressed(MouseEvent e) {
                if(_app_split_right_buttons_radioInkBtn.isSelected()) {
                    _app_split_right_journal.StartLine();
                    _app_split_right_journal.AddLineSegment(e.getX(), e.getY());
                }
                _app_split_right_journal.repaint();
            }
            @Override
            public void mouseReleased(MouseEvent e) {
                if(_app_split_right_buttons_radioInkBtn.isSelected()) {
                    _app_split_right_journal.AddLineSegment(e.getX(), e.getY());
                    _app_split_right_journal.EndLine();
                }
                _app_split_right_journal.repaint();
            }
            @Override
            public void mouseDragged(MouseEvent e) {
                if(_app_split_right_buttons_radioInkBtn.isSelected()) {
                    _app_split_right_journal.AddLineSegment(e.getX(), e.getY());
                }
                _app_split_right_journal.repaint();
            }
        };
        _app_split_right_journal.addMouseListener(mia);
        _app_split_right_journal.addMouseMotionListener(mia);
然而,当我拖动鼠标时,我似乎无法让它重新绘制,只有在我释放它之后(线绘制正确)。奇怪的是,如果在我的拖拽的中间,我右键单击,当我拖动时,该线将突然开始绘制。< /P> 任何帮助都将不胜感激

编辑:为了清晰起见,StartLine()/AddLineSegment()/EndLine()的内容只是将点添加到点对象的ArrayList中,而repain()函数已被重写以循环遍历这些点并在每个点之间绘制线段。代码如下:

public void DrawShapes(Graphics g) {
        g.setColor(Color.black);
        for(Geometry.Shape shape : _shapeList) {
            if(shape instanceof Geometry.Line) {
                ArrayList<Point> points = ((Line) shape).GetPointList();
                Point p1 = points.get(0);
                for(int i=1; i<points.size(); i++) {
                    Point p = points.get(i);
                    g.drawLine(p1.x, p1.y, p.x, p.y);
                    p1 = p;
                }
            }
}
public void绘图形状(图形g){
g、 设置颜色(颜色为黑色);
对于(Geometry.Shape形状:_shapeList){
if(几何体.Line的形状实例){
ArrayList points=((线)形状).GetPointList();
点p1=点。获取(0);

对于(int i=1;i这是我针对另一个问题所做的示例,但它使用鼠标拖动在组件上绘制线

public class PaintingExample {

    private BufferedImage bImage;
    private ImageIcon image;
    private JLabel imageLabel;
    private int xClicked = 0;
    private int yClicked = 0;
    private int xDragged = 0;
    private int yDragged = 0;
    private MouseAdapter mouseListener =
        new MouseAdapter() {
            private boolean paint = false;
            @Override
            public void mousePressed(MouseEvent me) {

                xClicked = me.getX();
                yClicked = me.getY();
                xDragged = xClicked;
                yDragged = yClicked;

                paint = true;

            }

            @Override
            public void mouseReleased(MouseEvent e) {

                xClicked = -1;
                xClicked = -1;
                xDragged = -1;
                yDragged = -1;

                paint = false;

            }

            @Override
            public void mouseMoved(MouseEvent me) {
            }

            @Override
            public void mouseDragged(MouseEvent me) {

                if (paint) {

                    xClicked = xDragged;
                    yClicked = yDragged;

                    xDragged = me.getX();
                    yDragged = me.getY();

                    xDragged = me.getX();
                    yDragged = me.getY();

                    Graphics2D g2 = bImage.createGraphics();
                    g2.setColor(Color.WHITE);
                    g2.drawLine(xClicked, yClicked, xDragged, yDragged);
                    g2.dispose();
                    imageLabel.setIcon(new ImageIcon(bImage));

                    me.getComponent().repaint();

                }

            }
        };

    public PaintingExample() {
        try {
            bImage = ImageIO.read(new URL(
                            "http://gagandeepbali.uk.to/"
                            + "gaganisonline/images/planetbackground.jpg"));
            image = new ImageIcon(bImage);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    private void displayGUI() {
        JFrame frame = new JFrame("Painting on Image");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JPanel contentPane = new JPanel();
        imageLabel = new JLabel(image);
        imageLabel.addMouseListener(mouseListener);
        imageLabel.addMouseMotionListener(mouseListener);

        contentPane.add(imageLabel);

        frame.setContentPane(contentPane);
        frame.pack();
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }

    public static void main(String... args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                new PaintingExample().displayGUI();
            }
        });
    }
}

试着在父容器上调用repaint/instead这帮了我今天的忙。谢谢!!!@MadProgrammer你真是糟透了!在这个问题上看到了你这么多有用的答案。你想指出投票失败的原因吗?我想知道你看到的答案可能有什么问题
public class PaintingExample {

    private BufferedImage bImage;
    private ImageIcon image;
    private JLabel imageLabel;
    private int xClicked = 0;
    private int yClicked = 0;
    private int xDragged = 0;
    private int yDragged = 0;
    private MouseAdapter mouseListener =
        new MouseAdapter() {
            private boolean paint = false;
            @Override
            public void mousePressed(MouseEvent me) {

                xClicked = me.getX();
                yClicked = me.getY();
                xDragged = xClicked;
                yDragged = yClicked;

                paint = true;

            }

            @Override
            public void mouseReleased(MouseEvent e) {

                xClicked = -1;
                xClicked = -1;
                xDragged = -1;
                yDragged = -1;

                paint = false;

            }

            @Override
            public void mouseMoved(MouseEvent me) {
            }

            @Override
            public void mouseDragged(MouseEvent me) {

                if (paint) {

                    xClicked = xDragged;
                    yClicked = yDragged;

                    xDragged = me.getX();
                    yDragged = me.getY();

                    xDragged = me.getX();
                    yDragged = me.getY();

                    Graphics2D g2 = bImage.createGraphics();
                    g2.setColor(Color.WHITE);
                    g2.drawLine(xClicked, yClicked, xDragged, yDragged);
                    g2.dispose();
                    imageLabel.setIcon(new ImageIcon(bImage));

                    me.getComponent().repaint();

                }

            }
        };

    public PaintingExample() {
        try {
            bImage = ImageIO.read(new URL(
                            "http://gagandeepbali.uk.to/"
                            + "gaganisonline/images/planetbackground.jpg"));
            image = new ImageIcon(bImage);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    private void displayGUI() {
        JFrame frame = new JFrame("Painting on Image");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JPanel contentPane = new JPanel();
        imageLabel = new JLabel(image);
        imageLabel.addMouseListener(mouseListener);
        imageLabel.addMouseMotionListener(mouseListener);

        contentPane.add(imageLabel);

        frame.setContentPane(contentPane);
        frame.pack();
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }

    public static void main(String... args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                new PaintingExample().displayGUI();
            }
        });
    }
}