java – 拖动时JPanel子类“跳转”

我目前正在为我的一个小“油漆”程序编码;到目前为止,您可以使用笔在其上绘图,放大至100倍,然后选择一种颜色.接下来我要添加的是(或者是)拖动JPanel子类的可能性,在该子类上选择要编辑的图像.基本上,通过按住鼠标右键,可以更改JPanel子类的位置,该子类位于JInternalFrame上.我有一个代码示例,它本身应该可以正常工作;至少它对我有用.要复制该问题,只需启动DragPanelTest类并在具有红色边框的组件上拖动鼠标 – 面板不会平滑拖动,而是始终来回跳转.

码:

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Point;
import java.awt.Toolkit;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;

import javax.swing.BorderFactory;
import javax.swing.JDesktopPane;
import javax.swing.JFrame;
import javax.swing.JInternalFrame;
import javax.swing.JPanel;

@SuppressWarnings("serial")
public class DragPanelTest extends JPanel implements MouseMotionListener, MouseListener {
    Point oldDragPt;
    boolean dragEnabled;
    int newX;
    int newY;

    public static void main(String[] args) {
        System.out.println("Launching Test.java ...");

        JFrame frame = new JFrame("Title");
        JInternalFrame intFrame = new JInternalFrame("title", true, true, true, true);
        JDesktopPane deskPane = new JDesktopPane();
        DragPanelTest dragPanel = new DragPanelTest();

        frame.setSize(300, 300);;
        frame.setLayout(null);
        frame.setVisible(true);
        Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
        int x = (d.width - frame.getWidth()) / 2;
        int y = (d.height - frame.getHeight()) / 2;
        frame.setLocation(x, y);

        deskPane.setBounds(50, 50, 200, 200);
        deskPane.setBorder(BorderFactory.createLineBorder(Color.BLACK));
        frame.add(deskPane);


        deskPane.add(intFrame);
        intFrame.setSize(150, 150);
        intFrame.add(dragPanel);
        intFrame.setVisible(true);
    }

    public DragPanelTest() {
        this.setSize(100,100);
        this.setBorder(BorderFactory.createLineBorder(Color.RED));
        this.addMouseListener(this);
        this.addMouseMotionListener(this);
    }

    public void mousePressed(MouseEvent e) {
        if (e.isMetaDown()) {
            dragEnabled = true;
            oldDragPt = new Point((int) this.getMousePosition().getX(), (int) this.getMousePosition().getY());
        }
        repaint();
    }

    public void mouseReleased(MouseEvent e) {
        dragEnabled = false;
        oldDragPt = null;
    }

    public void mouseDragged(MouseEvent e) {
        if (e.isMetaDown() && this.getMousePosition() != null) {
            if (oldDragPt != null) {
                if (dragEnabled) {
                    int mouseX = (int) this.getMousePosition().getX();
                    int mouseY = (int) this.getMousePosition().getY();
                    int x = this.getX();
                    int y = this.getY();
                    int diffX = (mouseX - (int) oldDragPt.getX());
                    int diffY = (mouseY - (int) oldDragPt.getY());
                    newX = getX() + diffX;
                    newY = getY() + diffY;
                    this.setLocation(newX, newY);
                    this.repaint();
                    oldDragPt = new Point(mouseX, mouseY);
                }
            } else {
                oldDragPt = new Point((int) this.getMousePosition().getX(), (int) this.getMousePosition().getY());
            }
        }
    }

    public void mouseClicked(MouseEvent e) {}
    public void mouseEntered(MouseEvent e) {}
    public void mouseExited(MouseEvent e) {}
    public void mouseMoved(MouseEvent e) {} 
}

请注意,我遗漏了一些System.out.println()或@Override命令来缩短代码.

无论如何,如果有人知道我做错了什么/改进什么,我会非常感激!

解决方法:

the panel isn’t dragged smoothly, but instead jumps back and forth all the time.

跳跃时,因为鼠标与组件和父面板之间的相对移动已关闭.您的代码太复杂,无法指出导致问题的确切行.

在面板上拖动组件的基本代码是:

public class DragListener extends MouseInputAdapter
{
    Point location;
    MouseEvent pressed;

    public void mousePressed(MouseEvent me)
    {
        pressed = me;
    }

    public void mouseDragged(MouseEvent me)
    {
        Component component = me.getComponent();
        location = component.getLocation(location);
        int x = location.x - pressed.getX() + me.getX();
        int y = location.y - pressed.getY() + me.getY();
        component.setLocation(x, y);
     }
}

对于具有更多功能的更高级代码,您还可以查看Moving Windows中的Component Mover类.

上一篇:javascript – 隐藏Raphael JS Freetransform上的句柄,但继续拖动?


下一篇:java – 如何将函数拖放到没有titleBar的JFame?