簡體   English   中英

如何在JPanel中點擊移動形狀?

[英]How to make a shape move to click in JPanel?

我試圖使形狀移動到我單擊鼠標的位置。 我得到了移動的形狀,它朝着我單擊的位置的大致方向移動,但是它永遠不會精確地移動到我單擊的位置,因此錯過了一段很長的距離。 由於它不會完全移動到我單擊的位置,因此形狀會繼續移動並且不會停止。

這是代碼:

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.io.IOException;

public class GraphicsTester extends JFrame implements MouseListener {
    private int startX;
    private int startY;
    private int endX;
    private int endY;
    private int stepX;
    private int stepY;
    private Timer sliderTimer = new Timer(40, new SlideListener());

    public GraphicsTester() throws IOException {
        setTitle("Graphics Tester 1");
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        setLayout(new BorderLayout());

        JPanel basePanel = new JPanel(new BorderLayout()) {
            @Override
            protected void paintComponent(Graphics g) {
                super.paintComponent(g);
                Graphics2D g2d = (Graphics2D) g;
                g2d.setColor(Color.red);
                g2d.fillOval(215 + stepX, 215 + stepY, 30, 30);
                startX = stepX;
                startY = stepY;
                if (215 + stepX == endX && 215 + stepY == endY) {
                    sliderTimer.stop();
                }
            }
        };
        basePanel.setPreferredSize(new Dimension(500, 500));
        basePanel.addMouseListener(this);

        getContentPane().add(basePanel);
        pack();
        setVisible(true);
    }
    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    new GraphicsTester();
                } catch (IOException ex) {
                    ex.printStackTrace();
                }
            }
        });
    }

    @Override
    public void mouseClicked(MouseEvent e) {
    }

    @Override
    public void mousePressed(MouseEvent e) {
        endX = e.getX();
        endY = e.getY();
        System.out.println("endX: " + endX + ", endY: " + endY);
        sliderTimer.start();
    }

    @Override
    public void mouseReleased(MouseEvent e) {
    }

    @Override
    public void mouseEntered(MouseEvent e) {
    }

    @Override
    public void mouseExited(MouseEvent e) {
    }

    private class SlideListener implements ActionListener {
        @Override
        public void actionPerformed(ActionEvent e) {
            stepX += (endX - startX) / 5; // the 5's are just arbitrary values, I chose 5 because it makes the shape slide at the speed I want
            stepY += (endY - startY) / 5;
            System.out.println("stepX: " + (215 + stepX) + ", stepY: " + (215 + stepY));
            repaint();
        }
    }
}

如何使形狀精確移動到單擊的位置? 問題在於stepX += (endX - startX) / 5; stepY += (endY - startY) / 5; 這兩行導致形狀不能精確移動到我單擊的位置,因為它們沒有將stepXstepY精確地增加到單擊位置,而是每次增加一個“舍入”。 我不知道如何固定這兩行,以便它們將stepXstepY精確地增加到我單擊的位置,因此一旦到達endXendY ,就停止移動形狀。

您的主要問題是您在paintComponent()方法中的stepXstepY中添加了215 ,這就是為什么它看起來“ stepY ”的原因。 這是因為當您確實要在stepXstepY (它們都是基於單擊時的鼠標指針)上繪制時,它在stepX + 215stepY + 215繪制。 大概+ 215只是初始位置的偏移量?

簡單的解決方法是將您的paintComponent()方法更改為:

protected void paintComponent(Graphics g) {
    super.paintComponent(g);
    Graphics2D g2d = (Graphics2D) g;
    g2d.setColor(Color.RED);
    g2d.fillOval(stepX, stepY, 30, 30);
    startX = stepX;
    startY = stepY;
    if (stepX == endX && stepY == endY) {
        sliderTimer.stop();
    }
}

或僅與所有坐標的偏移量一致。

其次,您的slideTimer.stop()極不可能被調用。 如果滿足以下條件,則應設置stepX = endXstepY = endYend - step < 5 ,即

stepX = endX - startX < 5 ? endX : stepX + (endX - startX) / 5;
stepY = endY - startY < 5 ? endY : stepY + (endY - startY) / 5;

這可能無法達到最佳效果,所以請隨時嘗試。

暫無
暫無

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

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