2017-12-06 4 views
2

Ich habe eine Aufgabe, um eine Anwendung zu machen, die Folgendes tun wird: Wenn ich eine Maus bewege, sollten die Koordinaten in der Statusleiste angezeigt werden Wenn Maus geklickt wird, dann die einzige Taste, die eingeschaltet ist ein JPanel sollte auf Koordinaten Klick bewegen, so ist das Problem, dass, wenn ich per Mausklick tun - es ist in Ordnung, Schaltfläche von Klick auf coord bewegt, aber wenn ich die Maus bewegen beginnen die Taste kommt in die ursprüngliche Position zurückMove button auf 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

bemerkt, dass ich MyMouseListener myMouseListener = new MyMouseListener() löschen vergessen; – CameronCoob

+0

so vergiss es – CameronCoob

Antwort

1

Dies ist einer der seltenen Fälle, in denen Ihr Panel keinen Layout-Manager haben soll, da Sie eine absolute Positionierung benötigen.

JPanel hat einen Standard-Layout-Manager, der ein FlowLayout ist, und auf Ihrem Anruf setLocation hat nur eine vorübergehende Wirkung, bis die Platte ihre Inhalte revalidates und platziert Dinge, wo sie eigentlich ursprünglich sein.

das folgende Beispiel mit Kommentaren sehen, sollte es Ihnen die allgemeine Idee geben:

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

Es half mir so viel :) Ich dachte über so etwas nach, aber meine Freunde taten so gut wie ich und sie hatten kein Problem so, also war ich verwirrt) Vielleicht sind unsere Codes nicht so ähnlich wie ich dachte – CameronCoob