2017-12-20 20 views
-1

미리보기 이미지를 통해 변경하고 패널에 대해 드래그 할 수있는 패널 내에 FBButton이라는 4 개의 JButton을 만들려고합니다. 현재 버튼은 mouseListener에서 클릭되지만 드래그 할 때 오류가 발생합니다. 레이아웃을 null으로 설정하려고 시도했지만 크기와 위치를 초기화하더라도 버튼이 화면에 나타나지 않습니다.JButton에 MouseMotionListener 추가하기

이 작업을 수행하기 위해 코드를 FBPlayerFrame, FBButtonFBMouseListener의 세 클래스로 분할했습니다. 나는 각각을 최소한의 엉덩이로 만들 것이지만 너무 많이 추가했다고 생각하면 사과드립니다.

여기 여기 FBPlayerFrame

package swing; 

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

public class FBPlayerFrame extends JFrame { 

    JPanel p = new JPanel(); 
    FBButton buttons[] = new FBButton[22]; 
    Dimension dim = new Dimension(52, 52); 

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

    public FBPlayerFrame() { 
     super("Football Start"); 
     setSize(400, 400); 
     setResizable(false); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     p.setLayout(new DragLayout()); 

     for (int i = 0; i < 4; i++) { 
      buttons[i] = new FBButton(); 
      buttons[i].setPreferredSize(new Dimension(52, 52)); 
      buttons[i].setLocation(50, 40 + 60 * i); 
      p.add(buttons[i]); 
      buttons[i].addMouseMotionListener(new FBMouseListener()); 
      buttons[i].addMouseListener(new FBMouseListener()); 

     } 

     add(p);  
     setVisible(true); 
    }  
} 

입니다 내가 클릭하고 표시 할 적절한 println()을 드래그하면 마지막 클래스는 FBMouseListener

package swing; 

import java.awt.Component; 
import java.awt.Point; 
import java.awt.event.*; 
import javax.swing.event.MouseInputAdapter; 

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

    public void mousePressed(MouseEvent me) { 
     pressed = me; 
     System.out.println("Found mousePressed() in FBMouseListener()"); 
    } 

    public void mouseDragged(MouseEvent me) { 
     System.out.println("Found mouseDragged() in FBMouseListener()"); 

     Component component = me.getComponent(); 
     location = component.getLocation(location); 
     int x = location.x - pressed.getX() + me.getX(); //ERROR HERE 
     int y = location.y - pressed.getY() + me.getY(); 
     component.setLocation(x, y); 
    } 
} 

입니다 FBButton

package swing; 

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

@SuppressWarnings("serial") 
public class FBButton extends JButton implements ActionListener { 
    ImageIcon SN, SL,IN; 
    byte value = 0; 
    FBMouseListener listener; 

    public FBButton() { 

     listener = new FBMouseListener(); 

     SN = new ImageIcon(this.getClass().getResource("square_null.png")); 
     SL = new ImageIcon(this.getClass().getResource("square_left.png")); 
     IN = new ImageIcon(this.getClass().getResource("invisible.png")); 

     addActionListener(this); 
    } 

    public void actionPerformed(ActionEvent e) { 
     value++; 
     value %= 3; 

     if (value == 1) { 
      setIcon(SN); 
     } else if (value == 2) { 
      setIcon(SL); 
     } else { 
      setIcon(IN); 
     }  

    }  
} 

입니다. 끌기에는 내가 인식하지 못하는 오류가 있습니다. 아래는 마지막으로 println()이며 전체 오류입니다. 어떤 줄을 클릭하면 FBMouseListener (코드에 주석으로 표시되어 있음)에있는이 줄이 int x = location.x - pressed.getX() + me.getX(); //ERROR HERE입니다.

Found mouseDragged() in FBMouseListener()Exception in thread "AWT-EventQueue-0" 
java.lang.NullPointerException 
    at swing.FBMouseListener.mouseDragged(FBMouseListener.java:22) 
    at java.awt.AWTEventMulticaster.mouseDragged(AWTEventMulticaster.java:320) 
    at java.awt.Component.processMouseMotionEvent(Component.java:6581) 
    at javax.swing.JComponent.processMouseMotionEvent(JComponent.java:3342) 
    at java.awt.Component.processEvent(Component.java:6302) 
    at java.awt.Container.processEvent(Container.java:2236) 
    at java.awt.Component.dispatchEventImpl(Component.java:4889) 
    at java.awt.Container.dispatchEventImpl(Container.java:2294) 
    at java.awt.Component.dispatchEvent(Component.java:4711) 
    at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4888) 
    at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4542) 
    at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4466) 
    at java.awt.Container.dispatchEventImpl(Container.java:2280) 
    at java.awt.Window.dispatchEventImpl(Window.java:2746) 
    at java.awt.Component.dispatchEvent(Component.java:4711) 
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:758) 
    at java.awt.EventQueue.access$500(EventQueue.java:97) 
    at java.awt.EventQueue$3.run(EventQueue.java:709) 
    at java.awt.EventQueue$3.run(EventQueue.java:703) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:80) 
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:90) 
    at java.awt.EventQueue$4.run(EventQueue.java:731) 
    at java.awt.EventQueue$4.run(EventQueue.java:729) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:80) 
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:728) 
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201) 
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116) 
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105) 
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101) 
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93) 
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:82) 

감사합니다. 나는 이것을 잠시 동안 풀려고 노력해 왔으며, 내가 얻을 수있는 모든 도움에 감사드립니다.

+0

글쎄, 나는 눌렀거나 위치가 null이라고 생각합니다. 나는 그것이 눌려 졌다고 생각한다. – keuleJ

+1

재 게시 질문을 종료하십시오. 문제를 설명하기 위해 적절한 [mcve]를 게시하라는 요청을 받았습니다. DragLayout이 무엇인지 알지 못하기 때문에 이것은 'MCVE'가 아니며 'MCVE'가 아닙니다. '레이아웃을 null로 설정하려고 시도했지만 크기와 위치를 초기화하더라도 버튼이 화면에 나타나지 않습니다. '그러면 첫 단계입니다. 마지막 질문에서 제안한 것처럼 끌기에 대해 잊어 버리고 패널에 단일 구성 요소를 추가하는 방법을 배웁니다. 일단 그 문제를 풀면 주어진 드래그 논리를 사용할 수 있습니다. – camickr

+1

또한 코드는 마지막 질문에서 제공 한 코드와 다릅니다. 특히 DragListener 클래스의 단일 인스턴스를 만들고 드래그하려는 모든 구성 요소에 추가한다고 명시했습니다. 이 작업을 수행하는 방법에 대한 샘플 코드를 제공했습니다. – camickr

답변

0

MouseEvent "pressed"에 대한 참조를 유지하지 말고 대신 위치 자체를 저장해야합니다.

+1

MouseEvent에 대한 참조를 유지하면 정상적으로 작동합니다. 어쩌면 포인트에 대한 참조 만 유지하는 것이 더 효율적이지만 NPE가 발생하지 않으므로 문제에 대한 대답이 아닙니다. 원래의 제안을 참조하십시오 : https://stackoverflow.com/questions/47870238/swing-library-for-dragging-components-in-java – camickr

+0

나는 고쳐졌다. 이벤트에 대한 참조를 유지하는 것은 이상하게 느껴집니다. 하지만 작동한다면 그것은 바보가 아닙니다 :) – SurfMan