미리보기 이미지를 통해 변경하고 패널에 대해 드래그 할 수있는 패널 내에 FBButton
이라는 4 개의 JButton을 만들려고합니다. 현재 버튼은 mouseListener
에서 클릭되지만 드래그 할 때 오류가 발생합니다. 레이아웃을 null
으로 설정하려고 시도했지만 크기와 위치를 초기화하더라도 버튼이 화면에 나타나지 않습니다.JButton에 MouseMotionListener 추가하기
이 작업을 수행하기 위해 코드를 FBPlayerFrame
, FBButton
및 FBMouseListener
의 세 클래스로 분할했습니다. 나는 각각을 최소한의 엉덩이로 만들 것이지만 너무 많이 추가했다고 생각하면 사과드립니다.
여기 여기 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)
감사합니다. 나는 이것을 잠시 동안 풀려고 노력해 왔으며, 내가 얻을 수있는 모든 도움에 감사드립니다.
글쎄, 나는 눌렀거나 위치가 null이라고 생각합니다. 나는 그것이 눌려 졌다고 생각한다. – keuleJ
재 게시 질문을 종료하십시오. 문제를 설명하기 위해 적절한 [mcve]를 게시하라는 요청을 받았습니다. DragLayout이 무엇인지 알지 못하기 때문에 이것은 'MCVE'가 아니며 'MCVE'가 아닙니다. '레이아웃을 null로 설정하려고 시도했지만 크기와 위치를 초기화하더라도 버튼이 화면에 나타나지 않습니다. '그러면 첫 단계입니다. 마지막 질문에서 제안한 것처럼 끌기에 대해 잊어 버리고 패널에 단일 구성 요소를 추가하는 방법을 배웁니다. 일단 그 문제를 풀면 주어진 드래그 논리를 사용할 수 있습니다. – camickr
또한 코드는 마지막 질문에서 제공 한 코드와 다릅니다. 특히 DragListener 클래스의 단일 인스턴스를 만들고 드래그하려는 모든 구성 요소에 추가한다고 명시했습니다. 이 작업을 수행하는 방법에 대한 샘플 코드를 제공했습니다. – camickr