2017-12-06 36 views
2

私は、次のことを行うアプリケーションを作成するタスクを持っています: マウスを動かすと、ステータスバーに座標が表示されます マウスがクリックされると、それはいいのよ、ボタンをクリックするのをCOORDに移動するが、私は、マウスを動かし始めるとボタンが元の位置JFrame上のボタンを移動するJava

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のは、だから、問題は、私はマウスのクリック操作を行うときということですクリック の座標に移動する必要があります

絶対配置が必要なため、パネルにレイアウトマネージャを持たせたくないまれなケースの1つです。

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

これは私のことをとても助けました:)私はこれについて何か考えましたが、私の友人たちも私と同じように顔の問題をしなかったので、私は混乱しました) – CameronCoob

関連する問題