2015-06-05 57 views
0

我写了一个GUI应用程序,如果我拖动JLabel并将其放到空白区域,它将保留在我放置它的位置。但是,如果我将它放到另一个JLabel上,JLabel就好像布局管理器已将它们移回默认位置一样,即使我为它们设置了位置。Java图标返回到默认位置

import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 
import java.util.Vector; 
public class DragnDrop { 
    static JFrame window=new JFrame("Drag n Drop"); 
    static JPanel content=new JPanel(); 
    static JMenu file=new JMenu("File"); 
    static JMenuItem clear=new JMenuItem("New"); 
    static JMenuItem quit=new JMenuItem("Quit"); 
    static JMenu edit=new JMenu("Edit"); 
    static JMenuItem addm=new JMenuItem("Add mole"); 
    static JMenuItem addh=new JMenuItem("Add hole"); 
    static ImageIcon hole=new ImageIcon("hole.png"); 
    static ImageIcon mole=new ImageIcon("mole.png"); 
    static JMenuBar menubar=new JMenuBar(); 
    static Vector<JLabel> draggables=new Vector<JLabel>(); 
    static Vector<Point> dragpoints=new Vector<Point>(); 
    static Vector<Boolean> morh=new Vector<Boolean>(); //true if mole 
    static Vector<Integer> hcounts=new Vector<Integer>(); 
    static Vector<Integer> mcounts=new Vector<Integer>(); 
    public static class DragHandler extends MouseAdapter{ 
     int xDisp; 
     int yDisp; 
     int curr; 
     public void mousePressed(MouseEvent e){ 
      JLabel tmp=(JLabel) e.getComponent(); 
      curr=(draggables.indexOf(tmp)); 
      xDisp = dragpoints.elementAt(curr).x - tmp.getLocation().x; 
      yDisp = dragpoints.elementAt(curr).y - tmp.getLocation().y+63; 
     } 
     public void mouseReleased(MouseEvent e){ 
      JLabel tmp=(JLabel) e.getComponent(); 
      JLabel tmp2 = null; 
      int toRemove=0; 
      int replacement=0; 
      boolean remove=false; 
      toRemove=draggables.indexOf(tmp); 
      for(int a=0;a<draggables.size();a++){ 
       if(tmp.getLocation().x>=dragpoints.elementAt(a).x&&tmp.getLocation().x<=dragpoints.elementAt(a).x+draggables.elementAt(a).getWidth()){ 
        if(tmp.getLocation().y>=dragpoints.elementAt(a).y&&tmp.getLocation().y<=dragpoints.elementAt(a).y+draggables.elementAt(a).getHeight()){ 
         if(draggables.elementAt(a)!=tmp&&morh.elementAt(toRemove)==true){ 
          Integer temp=mcounts.elementAt(a); 
          temp=Integer.valueOf(temp.intValue()+1); 
          mcounts.setElementAt(temp,a); 
          remove=true; 
          replacement=a; 
          tmp2=(JLabel) draggables.elementAt(a); 
          break; 
         } 
         else if(draggables.elementAt(a)!=tmp){ 
          Integer temp=hcounts.elementAt(a); 
          temp=Integer.valueOf(temp.intValue()+1); 
          hcounts.setElementAt(temp,a); 
          remove=true; 
          replacement=a; 
          tmp2=(JLabel) draggables.elementAt(a); 
          break; 
         } 
        } 
       } 
      } 
      if(remove==true){ 
       if(hcounts.elementAt(replacement).intValue()!=0){ 
        tmp2.setText(hcounts.elementAt(replacement)+"H"); 
       } 
       if(mcounts.elementAt(replacement).intValue()!=0){ 
        if(tmp2.getText()==null){ 
         tmp2.setText(mcounts.elementAt(replacement)+"M"); 
        } 
        else{ 
         tmp2.setText(tmp2.getText()+" "+mcounts.elementAt(replacement)+"M"); 
        } 
       } 
       draggables.removeElementAt(toRemove); 
       dragpoints.removeElementAt(toRemove); 
       morh.removeElementAt(toRemove); 
       mcounts.removeElementAt(toRemove); 
       hcounts.removeElementAt(toRemove); 
       tmp.setVisible(false); 
      } 
      else{ 
       dragpoints.setElementAt(tmp.getLocation(), curr); 
      } 
      content.validate(); 
      for(int a=0;a<draggables.size();a++){ 
       draggables.elementAt(a).setLocation(dragpoints.elementAt(a)); 
       System.out.println(draggables.elementAt(a).getLocation().x+" "+draggables.elementAt(a).getLocation().y); //debugging purposes 
      } 
     } 
     public void mouseDragged(MouseEvent e){ 
      JLabel tmp = (JLabel) e.getComponent(); 
      PointerInfo tmppi=MouseInfo.getPointerInfo(); 
      Point pt=tmppi.getLocation(); 
      tmp.setLocation(pt.x-xDisp,pt.y-yDisp); 
     } 
     public void mouseMoved(MouseEvent e){ 
     } 
    } 
    public static class AddMHandler implements ActionListener{ 
     public void actionPerformed(ActionEvent e) { 
      JLabel tmp=new JLabel(mole); 
      DragHandler drag=new DragHandler(); 
      tmp.setLocation(0,0); 
      tmp.addMouseListener(drag); 
      tmp.addMouseMotionListener(drag); 
      tmp.setVerticalTextPosition(SwingConstants.BOTTOM); 
      tmp.setHorizontalTextPosition(SwingConstants.CENTER); 
      content.add(tmp, 0); 
      content.validate(); 
      for(int a=0;a<draggables.size();a++){ 
       draggables.elementAt(a).setLocation(dragpoints.elementAt(a)); 
      } 
      draggables.add(tmp); 
      dragpoints.add(new Point(0,0)); 
      draggables.elementAt(draggables.size()-1).setLocation(dragpoints.elementAt(draggables.size()-1)); 
      morh.add(new Boolean(true)); 
      mcounts.add(new Integer(1)); 
      hcounts.add(new Integer(0)); 
     } 
    } 
    public static class AddHHandler implements ActionListener{ 
     public void actionPerformed(ActionEvent e) { 
      JLabel tmp=new JLabel(hole); 
      DragHandler drag=new DragHandler(); 
      tmp.setLocation(0,0); 
      tmp.addMouseListener(drag); 
      tmp.addMouseMotionListener(drag); 
      tmp.setVerticalTextPosition(SwingConstants.BOTTOM); 
      tmp.setHorizontalTextPosition(SwingConstants.CENTER); 
      content.add(tmp, 0); 
      content.validate(); 
      for(int a=0;a<draggables.size();a++){ 
       draggables.elementAt(a).setLocation(dragpoints.elementAt(a)); 
      } 
      draggables.add(tmp); 
      dragpoints.add(new Point(0,0)); 
      draggables.elementAt(draggables.size()-1).setLocation(dragpoints.elementAt(draggables.size()-1)); 
      morh.add(new Boolean(false)); 
      hcounts.add(new Integer(1)); 
      mcounts.add(new Integer(0)); 
     } 
    } 
    public static class ClearHandler implements ActionListener{ 
     public void actionPerformed(ActionEvent e){ 
      content.removeAll(); 
      content.validate(); 
     } 
    } 
    public static class QuitHandler implements ActionListener{ 
     public void actionPerformed(ActionEvent e){ 
      System.exit(0); 
     } 
    } 
    public static void main(String[] args) { 
     clear.addActionListener(new ClearHandler()); 
     file.add(clear); 
     quit.addActionListener(new QuitHandler()); 
     quit.setMnemonic(KeyEvent.VK_Q); 
     quit.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_Q, ActionEvent.META_MASK)); 
     file.add(quit); 
     addm.addActionListener(new AddMHandler()); 
     addm.setMnemonic(KeyEvent.VK_M); 
     addm.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_M, ActionEvent.ALT_MASK)); 
     edit.add(addm); 
     addh.addActionListener(new AddHHandler()); 
     addh.setMnemonic(KeyEvent.VK_H); 
     addh.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_H, ActionEvent.ALT_MASK)); 
     edit.add(addh); 
     menubar.add(file); 
     menubar.add(edit); 
     window.setJMenuBar(menubar); 
     window.setSize(500, 500); 
     window.setLocation(0, 0); 
     window.setContentPane(content); 
     window.setVisible(true); 
     window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    } 
} 
+1

不要使用静态变量!这表明你的班级设计不佳。重构你的代码并摆脱静态变量。 – camickr

回答

1

我真的不知道你在用你的代码做什么。例如,我无法弄清楚为什么你有两个添加处理程序。代码看起来非常相似。

但是,如果我拖放到另一个JLabel的,中的JLabel看起来好像布局管理器搬到他们回默认位置

通常当你拖动面板组件,你需要使用一个null layout,所以组件将留在你拖动它们的地方。

在你的情况下,你似乎在使用JPanel,它使用FlowLayout作为默认的布局管理器,所以当你重新验证面板时,布局管理器会重置组件的位置。

对于一个空的布局,你需要使用:

panel.setLayout(null); 

对于简单的拖动的逻辑,你可以使用以下命令:

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); 
    } 
} 

而你只用添加监听器组件:

DragListener drag = new DragListener(); 
component.addMouseListener(drag); 
component.addMouseMotionListener(drag); 
+0

我尝试使用空布局,但没有出现在窗口上。我没有得到的是为什么当我将JLabel拖动到空白区域时,它不会将JLabel移回到默认位置,但是当我将JLabel拖动到另一个JLabel时,它会将它们返回到默认位置。 – mudkip201

+0

当您使用空布局时,您需要设置组件的大小和位置。实际上,您可以使用[拖动布局](https://tips4java.wordpress.com/2011/10/23/drag-layout/)而不是FlowLayout来提供帮助。 '当我将JLabel拖放到空白区域时,它不会将JLabels移回到默认位置。只有当您在面板上调用revalidate()或validate()时,才会重置该位置(或者如果调整框架大小) 。我不明白你的代码,所以我不知道你是否这样做。 – camickr

+0

每次我放开其中一个JLabel时,我都会验证()。 – mudkip201