Java 在JPanel周围移动JLabel
我有一个JPanel,上面有2+JLables,我希望能够抓取一个标签,然后将其移动到JPanel上的其他位置。我该怎么做?我能找到的唯一东西是将标签从组件“a”移动到组件“B”,而不是在面板上移动标签。开始玩这个:Java 在JPanel周围移动JLabel,java,swing,drag-and-drop,jlabel,Java,Swing,Drag And Drop,Jlabel,我有一个JPanel,上面有2+JLables,我希望能够抓取一个标签,然后将其移动到JPanel上的其他位置。我该怎么做?我能找到的唯一东西是将标签从组件“a”移动到组件“B”,而不是在面板上移动标签。开始玩这个: public class ComponentDragger extends MouseAdapter { private Component target; /** * {@inheritDoc} */ @Override
public class ComponentDragger extends MouseAdapter {
private Component target;
/**
* {@inheritDoc}
*/
@Override
public void mousePressed(MouseEvent e) {
Container container = (Container) e.getComponent();
for (Component c : container.getComponents()) {
if (c.getBounds().contains(e.getPoint())) {
target = c;
break;
}
}
}
/**
* {@inheritDoc}
*/
@Override
public void mouseDragged(MouseEvent e) {
if (target != null) {
target.setBounds(e.getX(), e.getY(), target.getWidth(), target.getHeight());
e.getComponent().repaint();
}
}
/**
* {@inheritDoc}
*/
@Override
public void mouseReleased(MouseEvent e) {
target = null;
}
public static void main(String[] args) {
JLabel label = new JLabel("Drag Me");
JPanel panel = new JPanel();
panel.add(label);
ComponentDragger dragger = new ComponentDragger();
panel.addMouseListener(dragger);
panel.addMouseMotionListener(dragger);
JFrame f = new JFrame();
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setSize(1024, 768);
f.add(panel);
f.setVisible(true);
panel.setLayout(null);
f.setState(Frame.MAXIMIZED_BOTH);
}
}
下面是另一个例子,其中MouseListener和MouseMotionListener位于JLabel上。要使其工作,它需要知道鼠标在屏幕上的位置,而不是最初按下鼠标时鼠标在屏幕上的初始位置
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Point;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.Random;
import javax.swing.*;
import javax.swing.border.Border;
import javax.swing.border.EmptyBorder;
import javax.swing.border.LineBorder;
public class MovingLabels {
private static final int PREF_W = 800;
private static final int PREF_H = 600;
private static void createAndShowGui() {
Random random = new Random();
final JPanel panel = new JPanel();
Color[] colors = {Color.red, Color.orange, Color.yellow, Color.green, Color.blue, Color.cyan};
panel.setPreferredSize(new Dimension(PREF_W, PREF_H)); // sorry kleopatra
panel.setLayout(null);
MyMouseAdapter myMouseAdapter = new MyMouseAdapter();
for (int i = 0; i < colors.length; i++) {
Color c = colors[i];
JLabel label = new JLabel("Label " + (i + 1));
Border outsideBorder = new LineBorder(Color.black);
int eb = 10;
Border insideBorder = new EmptyBorder(eb, eb, eb, eb);
label.setBorder(BorderFactory.createCompoundBorder(outsideBorder , insideBorder));
label.setSize(label.getPreferredSize());
label.setBackground(c);
label.setOpaque(true);
int x = random.nextInt(PREF_W - 200) + 100;
int y = random.nextInt(PREF_H - 200) + 100;
label.setLocation(x, y);
label.addMouseListener(myMouseAdapter);
label.addMouseMotionListener(myMouseAdapter);
panel.add(label);
}
JFrame frame = new JFrame("MovingLabels");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(panel);
frame.pack();
frame.setLocationByPlatform(true);
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGui();
}
});
}
}
class MyMouseAdapter extends MouseAdapter {
private Point initialLoc;
private Point initialLocOnScreen;
@Override
public void mousePressed(MouseEvent e) {
Component comp = (Component)e.getSource();
initialLoc = comp.getLocation();
initialLocOnScreen = e.getLocationOnScreen();
}
@Override
public void mouseReleased(MouseEvent e) {
Component comp = (Component)e.getSource();
Point locOnScreen = e.getLocationOnScreen();
int x = locOnScreen.x - initialLocOnScreen.x + initialLoc.x;
int y = locOnScreen.y - initialLocOnScreen.y + initialLoc.y;
comp.setLocation(x, y);
}
@Override
public void mouseDragged(MouseEvent e) {
Component comp = (Component)e.getSource();
Point locOnScreen = e.getLocationOnScreen();
int x = locOnScreen.x - initialLocOnScreen.x + initialLoc.x;
int y = locOnScreen.y - initialLocOnScreen.y + initialLoc.y;
comp.setLocation(x, y);
}
}
导入java.awt.Color;
导入java.awt.Component;
导入java.awt.Dimension;
导入java.awt.Point;
导入java.awt.event.MouseAdapter;
导入java.awt.event.MouseEvent;
导入java.util.Random;
导入javax.swing.*;
导入javax.swing.border.border;
导入javax.swing.border.EmptyBorder;
导入javax.swing.border.LineBorder;
公共类移动标签{
专用静态最终整型预调W=800;
专用静态最终整型参数参数H=600;
私有静态void createAndShowGui(){
随机=新随机();
最终JPanel面板=新JPanel();
Color[]colors={Color.red,Color.orange,Color.yellow,Color.green,Color.blue,Color.cyan};
panel.setPreferredSize(新维度(PREF_W,PREF_H));//对不起,kleopatra
panel.setLayout(空);
MyMouseAdapter MyMouseAdapter=新的MyMouseAdapter();
for(int i=0;i
您可能会从标签本身获得它。试着观察面板的坐标。它应该能用以下是我想要的:
public class LayerItem extends JLabel{
protected int lblYPt = 0;
public LayerItem(JPanel layers){
this.addMouseListener(new MouseAdapter(){
@Override
public void mousePressed(MouseEvent evt){
lblMousePressed(evt);
}
});
this.addMouseMotionListener(new MouseAdapter(){
@Override
public void mouseDragged(MouseEvent evt){
lblMouseDragged(evt);
}
});
}
public void lblMousePressed(MouseEvent evt){
lblYPt = evt.getY();
}
public void lblMouseDragged(MouseEvent evt){
Component parent = evt.getComponent().getParent();
Point mouse = parent.getMousePosition();
try{
if(mouse.y - lblYPt >= 30){
this.setBounds(0, mouse.y - lblYPt, 198, 50);
}
}catch(Exception e){
}
}
}
考虑使用MouSististor和MouseMotionListener,并给出JPAND(颤抖)空布局。如果你玩这个,你可能会有进步。好吧,我让它移动,但它移动起来很奇怪。我使用的是“mouseDragged()”,其中:
inty=evt.getY();这个.挫折(0,y,198,50)代码>但当它移动时,它会抖动,并且不会移动到鼠标位于面板中的位置。你知道为什么吗?那么你没有正确地实施它。考虑创建和发布一个演示你的问题。我知道了,我用鼠标在标签上的Y位置,我应该使用鼠标在面板上的Y位置。@ HoviCRAFtFulfFoeles从来没有想过你会建议<代码> null <代码>布局。我推荐