java-FLowLayout()中的两个图像在移动时将消失
我有下面的代码在屏幕上生成两个独立的.png。这些.png是要用鼠标移动的,除了被拖动时,它们似乎在某种类型的层下,当拖动超过一英寸时,它们就会消失。谢谢你的建议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
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
中移动它,该面板设置了它的边界。每个框架都有自己独立的空间。记住,这不是面板,你的移动,而是标签