2017-12-06 15 views
2

다음을 수행 할 응용 프로그램을 만드는 작업이 있습니다. 마우스를 움직이면 상태 표시 줄에 좌표가 표시됩니다 마우스를 클릭하면 켜져있는 유일한 버튼 이 괜찮아요, 버튼을 클릭의의를 COORD로 이동,하지만 난 마우스를 움직이기 시작하면 버튼은 원래 위치JFrame 자바 단추로 이동

public class Window extends JFrame { 
    private JLabel statusBar; 
    private JPanel mainPanel, statusBarPanel; 
    JButton button; 
    public Window() 
    { 
     super("Window"); 
     setSize(400,600); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     mainPanel=new JPanel(); 
     statusBarPanel = new JPanel(); 
     statusBar=new JLabel("Coords: "); 
     add(statusBarPanel, BorderLayout.SOUTH); 
     add(mainPanel,BorderLayout.CENTER); 
     mainPanel.setBorder(new BevelBorder(BevelBorder.LOWERED)); 
     statusBarPanel.add(statusBar,BorderLayout.CENTER); 
     button = new JButton("Default text"); 
     mainPanel.add(button); 
     MyMouseListener myMouseListener=new MyMouseListener(); 
     mainPanel.addMouseMotionListener(new MouseMotionAdapter() { 
      @Override 
      public void mouseMoved(MouseEvent e) { 
       super.mouseMoved(e); 
       statusBar.setText("Coords: ("+e.getX()+":"+e.getY()+")"); 
      } 
     }); 
     mainPanel.addMouseListener(new MouseAdapter() { 
      @Override 
      public void mouseClicked(MouseEvent e) { 
       super.mouseClicked(e); 
       button.setLocation(e.getX()-button.getWidth()/2,e.getY()-button.getHeight()/2); 
      } 
     }); 
     mainPanel.setFocusable(true); 
     setVisible(true); 
    } 
} 
+0

;

댓글 다음과 같은 예를 참조하십시오, 그것은 당신에게 일반적인 아이디어를 줄 것이다 – CameronCoob

+0

그래서 신경 쓰지 마라 – CameronCoob

답변

1
에 다시 온다 - JPanel과 그래서 문제가 내가 마우스 클릭을 할 때, 즉 클릭 의 좌표로 이동해야합니다

이것은 절대 위치 지정이 필요하기 때문에 패널에 레이아웃 관리자가 없도록하는 드문 경우 중 하나입니다.

JPanelFlowLayout하는 기본 레이아웃 매니저를 가지고 있으며, 패널이 내용을 재확인하고 처음에 있어야하고 일을 배치 할 때까지 setLocation에 전화는 일시적인 영향을 미칠 것입니다.) (내가 MyMouseListener myMouseListener = 새로운 MyMouseListener을 삭제하는 것을 잊었다 것으로 나타났습니다

public class Window extends JFrame { 
    private final JLabel statusBar; 
    private final JPanel mainPanel, statusBarPanel; 
    JButton button; 

    public Window() { 
     super("Window"); 
     setSize(400, 600); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     mainPanel = new JPanel(); 
     mainPanel.setLayout(null);// no layout for absolute positioning 
     statusBarPanel = new JPanel(); 
     statusBar = new JLabel("Coords: "); 
     add(statusBarPanel, BorderLayout.SOUTH); 
     add(mainPanel, BorderLayout.CENTER); 
     mainPanel.setBorder(new BevelBorder(BevelBorder.LOWERED)); 
     statusBarPanel.add(statusBar, BorderLayout.CENTER); 
     button = new JButton("Default text"); 

     // place the button "manually" 
     button.setBounds((int) (400 - button.getPreferredSize().getWidth())/2, 0, 
       (int) button.getPreferredSize().getWidth(), 
       (int) button.getPreferredSize().getHeight()); 
     mainPanel.add(button); 

     mainPanel.addMouseMotionListener(new MouseMotionAdapter() { 
      @Override 
      public void mouseMoved(final MouseEvent e) { 
       super.mouseMoved(e); 
       statusBar.setText("Coords: (" + e.getX() + ":" + e.getY() + ")"); 
      } 
     }); 
     mainPanel.addMouseListener(new MouseAdapter() { 
      @Override 
      public void mouseClicked(final MouseEvent e) { 
       super.mouseClicked(e); 
       button.setLocation((int) (e.getX() - button.getPreferredSize().getWidth()/2), 
         (int) (e.getY() - button.getPreferredSize().getHeight()/2)); 


      } 
     }); 
     mainPanel.setFocusable(true); 
     setVisible(true); 
    } 

} 
+1

그것은 나를 그렇게 도왔다 :) 나는 이것과 비슷한 것에 대해 생각했다. 그러나 나의 친구는 나뿐만 아니라 이것과 같은 얼굴 문제를 didnt한다. 그래서 나는 혼란 스러웠다. – CameronCoob