Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/402.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-FLowLayout()中的两个图像在移动时将消失_Java_Swing - Fatal编程技术网

java-FLowLayout()中的两个图像在移动时将消失

java-FLowLayout()中的两个图像在移动时将消失,java,swing,Java,Swing,我有下面的代码在屏幕上生成两个独立的.png。这些.png是要用鼠标移动的,除了被拖动时,它们似乎在某种类型的层下,当拖动超过一英寸时,它们就会消失。谢谢你的建议 import java.awt.*; import javax.swing.*; import java.awt.event.MouseEvent; import java.awt.event.MouseAdapter; public class TestMouseDrag { public static void main(S

我有下面的代码在屏幕上生成两个独立的.png。这些.png是要用鼠标移动的,除了被拖动时,它们似乎在某种类型的层下,当拖动超过一英寸时,它们就会消失。谢谢你的建议

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

public class TestMouseDrag {

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

public TestMouseDrag() {
    EventQueue.invokeLater(new Runnable() {
        @Override
        public void run() {


            JFrame frame = new JFrame();
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setLayout(new FlowLayout());
            frame.add(new DragMyIcon("C:\\Users\\anon\\Desktop\\Hobbit.png"));
            frame.add(new DragMyIcon("C:\\Users\\anon\\Desktop\\alien.png"));

            frame.setSize(800,800);

            frame.setVisible(true);
        }
    });
}

public class DragMyIcon extends JPanel {

    public static final long serialVersionUID = 172L;
    private JLabel label;

    public DragMyIcon(String path) {


        ImageIcon icon = null;

        icon = new ImageIcon(path);

        label = new JLabel(icon);



        add(label);

        MouseHandler handler = new MouseHandler();
        label.addMouseListener(handler);
        label.addMouseMotionListener(handler);

    }

}

protected class MouseHandler extends MouseAdapter {

    private boolean active = false;
    private int xDisp;
    private int yDisp;

    @Override
    public void mousePressed(MouseEvent e) {
        active = true;
        JLabel label = (JLabel) e.getComponent();

        xDisp = e.getPoint().x - label.getLocation().x;
        yDisp = e.getPoint().y - label.getLocation().y;

        label.setCursor(Cursor.getPredefinedCursor(Cursor.MOVE_CURSOR));
    }

    @Override
    public void mouseReleased(MouseEvent e) {
        active = false;
        JLabel label = (JLabel) e.getComponent();
        label.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
    }

    @Override
    public void mouseDragged(MouseEvent e) {
        if (active) {
            JLabel label = (JLabel) e.getComponent();
            Point point = e.getPoint();
            label.setLocation(point.x - xDisp, point.y - yDisp);
            label.invalidate();
            label.repaint();

        }
    }

    @Override
    public void mouseMoved(MouseEvent e) {
    }
}}

只需
@覆盖
getPreferredSize
JPanel
中,只需
pack()
您的帧,而不是设置大小,它就能正常工作

   frame.pack();
   ...

   public class DragMyIcon extends JPanel {
       ...
       @Override
       public Dimension getPreferredSize() {
           return new Dimension(400, 600);
       }
   }

但是要记住,这是两个单独的面板(当您创建
DragMyIcon
的两个单独实例时),因此您只能将标签移动到包含面板的范围内。如果您想在整个屏幕上移动它们,您需要将它们添加到同一个面板。

非常感谢您的回答,它是有效的,但是您能否详细说明它是如何工作的/为什么工作的?我不明白为什么创建一个新方法比使用.setSize更有效。再次感谢。您实际上并没有创建新方法,而是覆盖了
JPanel
已有的方法,该方法设置了
JPanel
的首选大小。如果未设置大小,则
JPanel
preferredSize
将仅为添加到其中的
JLabel
的大小。当您
pack()
frame时,首选的尺寸是不同的如果我想让图像在屏幕上到处移动,为什么要将它们添加到同一个面板上呢?难道它们不能独立移动吗?或者我远离了框架中给定空间内的每个面板。当您移动
JLabel
时,您只在
JPanel
中移动它,该面板设置了它的边界。每个框架都有自己独立的空间。记住,这不是面板,你的移动,而是标签